/ Hex Artifact Content
Login

Artifact 41559a2b4461a6cf4b24bedb47d4e303d02729b5:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 63 6f 6e  rticular the con
0d50: 74 65 6e 74 20 6f 66 20 66 72 65 65 6c 69 73 74  tent of freelist
0d60: 20 6c 65 61 66 0a 2a 2a 20 70 61 67 65 73 20 63   leaf.** pages c
0d70: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 72  an be changed ar
0d80: 62 69 74 72 61 72 69 6c 79 20 77 69 74 68 6f 75  bitrarily withou
0d90: 74 20 61 66 66 65 63 74 69 6e 67 20 74 68 65 20  t affecting the 
0da0: 6c 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65  logical equivale
0db0: 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  nce.** of the da
0dc0: 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28  tabase..** .** (
0dd0: 37 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20  7) At any time, 
0de0: 69 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69  if any subset, i
0df0: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70  ncluding the emp
0e00: 74 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74  ty set and the t
0e10: 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20  otal set,.**    
0e20: 20 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64   of the unsynced
0e30: 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f   changes to a ro
0e40: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
0e50: 72 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74  re removed and t
0e60: 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  he .**     journ
0e70: 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  al is rolled bac
0e80: 6b 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  k, the resulting
0e90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
0ea0: 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 6c 79  ill be logically
0eb0: 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c 65  .**     equivale
0ec0: 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  nt to the databa
0ed0: 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 62  se file at the b
0ee0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0ef0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
0f00: 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20 74  .** (8) When a t
0f10: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
0f20: 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 78  lled back, the x
0f30: 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64 20  Truncate method 
0f40: 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20 20  of the VFS.**   
0f50: 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72    is called to r
0f60: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
0f70: 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  ase file to the 
0f80: 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61 73  same size it was
0f90: 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20 62   at.**     the b
0fa0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0fb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49  transaction.  (I
0fc0: 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74 68  n some VFSes, th
0fd0: 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20  e xTruncate.**  
0fe0: 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20 6e     method is a n
0ff0: 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20 64  o-op, but that d
1000: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74  oes not change t
1010: 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c 69  he fact the SQLi
1020: 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69  te will.**     i
1030: 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a  nvoke it.).** .*
1040: 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20 74  * (9) Whenever t
1050: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1060: 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61 74   is modified, at
1070: 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20 69   least one bit i
1080: 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20  n the range.**  
1090: 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f 6d     of bytes from
10a0: 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 69   24 through 39 i
10b0: 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62 65  nclusive will be
10c0: 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
10d0: 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20  o releasing.**  
10e0: 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56 45     the EXCLUSIVE
10f0: 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67 6e   lock, thus sign
1100: 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e  aling other conn
1110: 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73  ections on the s
1120: 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61 62  ame.**     datab
1130: 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68 65  ase to flush the
1140: 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a  ir caches..**.**
1150: 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65 72   (10) The patter
1160: 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79 74  n of bits in byt
1170: 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33 39  es 24 through 39
1180: 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61   shall not repea
1190: 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20  t in less.**    
11a0: 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69    than one billi
11b0: 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  on transactions.
11c0: 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64 61  .**.** (11) A da
11d0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 77  tabase file is w
11e0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74 68  ell-formed at th
11f0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20  e beginning and 
1200: 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
1210: 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76 65  n.**      of eve
1220: 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ry transaction..
1230: 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45 58  **.** (12) An EX
1240: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
1250: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1260: 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 77  base file when w
1270: 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20  riting to.**    
1280: 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66    the database f
1290: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20  ile..**.** (13) 
12a0: 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73  A SHARED lock is
12b0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
12c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c 65  abase file while
12d0: 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20   reading any.** 
12e0: 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74       content out
12f0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1300: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   file..**.******
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
1360: 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f 75   Macros for trou
1370: 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f  bleshooting.  No
1380: 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66  rmally turned of
1390: 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73  f.*/.#if 0.int s
13a0: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
13b0: 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =1;  /* True to 
13c0: 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a  enable tracing *
13d0: 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65  /.#define sqlite
13e0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72 69  3DebugPrintf pri
13f0: 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47 45  ntf.#define PAGE
1400: 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69 66  RTRACE(X)     if
1410: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  ( sqlite3PagerTr
1420: 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44 65  ace ){ sqlite3De
1430: 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23  bugPrintf X; }.#
1440: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47  else.#define PAG
1450: 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  ERTRACE(X).#endi
1460: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
1470: 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f  lowing two macro
1480: 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69  s are used withi
1490: 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43 45  n the PAGERTRACE
14a0: 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a  () macros above.
14b0: 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ** to print out 
14c0: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
14d0: 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44  . .**.** PAGERID
14e0: 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  () takes a point
14f0: 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73 74  er to a Pager st
1500: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1510: 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73  ment. The.** ass
1520: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65 73  ociated file-des
1530: 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75 72  criptor is retur
1540: 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49  ned. FILEHANDLEI
1550: 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71 6c  D() takes an sql
1560: 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72  ite3_file.** str
1570: 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75 6d  uct as its argum
1580: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
1590: 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e 74  PAGERID(p) ((int
15a0: 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e  )(p->fd)).#defin
15b0: 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66  e FILEHANDLEID(f
15c0: 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a  d) ((int)fd)../*
15d0: 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 65 53  .** The Pager.eS
15e0: 74 61 74 65 20 76 61 72 69 61 62 6c 65 20 73 74  tate variable st
15f0: 6f 72 65 73 20 74 68 65 20 63 75 72 72 65 6e 74  ores the current
1600: 20 27 73 74 61 74 65 27 20 6f 66 20 61 20 70 61   'state' of a pa
1610: 67 65 72 2e 20 41 0a 2a 2a 20 70 61 67 65 72 20  ger. A.** pager 
1620: 6d 61 79 20 62 65 20 69 6e 20 61 6e 79 20 6f 6e  may be in any on
1630: 65 20 6f 66 20 74 68 65 20 73 65 76 65 6e 20 73  e of the seven s
1640: 74 61 74 65 73 20 73 68 6f 77 6e 20 69 6e 20 74  tates shown in t
1650: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
1660: 73 74 61 74 65 20 64 69 61 67 72 61 6d 2e 0a 2a  state diagram..*
1670: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  *.**            
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 4f 50 45 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d  OPEN <------+---
16a0: 2d 2d 2d 2b 0a 2a 2a 20 20 20 20 20 20 20 20 20  ---+.**         
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c       |         |
16d0: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
1700: 20 20 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20    |      |.**   
1710: 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d              +---
1720: 2d 2d 2d 2d 2d 2d 3e 20 52 45 41 44 45 52 2d 2d  ------> READER--
1730: 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a 2a  -----+      |.**
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1770: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1780: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1790: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
17a0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
17b0: 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52       |<-------WR
17c0: 49 54 45 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d 2d  ITER_LOCKED-----
17d0: 2d 3e 20 45 52 52 4f 52 0a 2a 2a 20 20 20 20 20  -> ERROR.**     
17e0: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
17f0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1800: 20 20 20 20 20 20 20 20 20 20 5e 20 20 0a 2a 2a            ^  .**
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20                V 
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1840: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1850: 20 20 7c 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52    |<------WRITER
1860: 5f 43 41 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d 2d  _CACHEMOD-------
1870: 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ->|.**          
1880: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
1890: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20      |           
18a0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
18b0: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
18c0: 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20 20         V        
18d0: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
18e0: 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d             |<---
18f0: 2d 2d 2d 2d 57 52 49 54 45 52 5f 44 42 4d 4f 44  ----WRITER_DBMOD
1900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a 20  ---------->|.** 
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
1940: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1950: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   |              
1960: 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  V               
1970: 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
1980: 20 20 20 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49 54      +<------WRIT
1990: 45 52 5f 46 49 4e 49 53 48 45 44 2d 2d 2d 2d 2d  ER_FINISHED-----
19a0: 2d 2d 2d 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c  --->+.**.**.** L
19b0: 69 73 74 20 6f 66 20 73 74 61 74 65 20 74 72 61  ist of state tra
19c0: 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
19d0: 20 43 20 5b 66 75 6e 63 74 69 6f 6e 5d 20 74 68   C [function] th
19e0: 61 74 20 70 65 72 66 6f 72 6d 73 20 65 61 63 68  at performs each
19f0: 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e 20  :.** .**   OPEN 
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e 20               -> 
1a10: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
1a20: 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67 65      [sqlite3Page
1a30: 72 53 68 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a 20  rSharedLock].** 
1a40: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a50: 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20      -> OPEN     
1a60: 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67 65             [page
1a70: 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a 20  r_unlock].**.** 
1a80: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a90: 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 4c 4f      -> WRITER_LO
1aa0: 43 4b 45 44 20 20 20 20 20 20 20 5b 73 71 6c 69  CKED       [sqli
1ab0: 74 65 33 50 61 67 65 72 42 65 67 69 6e 5d 0a 2a  te3PagerBegin].*
1ac0: 2a 20 20 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  *   WRITER_LOCKE
1ad0: 44 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f  D     -> WRITER_
1ae0: 43 41 43 48 45 4d 4f 44 20 20 20 20 20 5b 70 61  CACHEMOD     [pa
1af0: 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
1b00: 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 43 41  ].**   WRITER_CA
1b10: 43 48 45 4d 4f 44 20 20 20 2d 3e 20 57 52 49 54  CHEMOD   -> WRIT
1b20: 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 20 20  ER_DBMOD        
1b30: 5b 73 79 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a 2a  [syncJournal].**
1b40: 20 20 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20     WRITER_DBMOD 
1b50: 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 46       -> WRITER_F
1b60: 49 4e 49 53 48 45 44 20 20 20 20 20 5b 73 71 6c  INISHED     [sql
1b70: 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
1b80: 68 61 73 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57 52  haseOne].**   WR
1b90: 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20 20 20 20  ITER_***        
1ba0: 2d 3e 20 52 45 41 44 45 52 20 20 20 20 20 20 20  -> READER       
1bb0: 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 65 6e         [pager_en
1bc0: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 5d 0a 2a  d_transaction].*
1bd0: 2a 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a 2a  *.**   WRITER_**
1be0: 2a 20 20 20 20 20 20 20 20 2d 3e 20 45 52 52 4f  *        -> ERRO
1bf0: 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R               
1c00: 5b 70 61 67 65 72 5f 65 72 72 6f 72 5d 0a 2a 2a  [pager_error].**
1c10: 20 20 20 45 52 52 4f 52 20 20 20 20 20 20 20 20     ERROR        
1c20: 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20       -> OPEN    
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67              [pag
1c40: 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a 2a  er_unlock].** .*
1c50: 2a 0a 2a 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a 2a  *.**  OPEN:.**.*
1c60: 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20 73  *    The pager s
1c70: 74 61 72 74 73 20 75 70 20 69 6e 20 74 68 69 73  tarts up in this
1c80: 20 73 74 61 74 65 2e 20 4e 6f 74 68 69 6e 67 20   state. Nothing 
1c90: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 69 6e  is guaranteed in
1ca0: 20 74 68 69 73 0a 2a 2a 20 20 20 20 73 74 61 74   this.**    stat
1cb0: 65 20 2d 20 74 68 65 20 66 69 6c 65 20 6d 61 79  e - the file may
1cc0: 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6c   or may not be l
1cd0: 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 64 61  ocked and the da
1ce0: 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 0a 2a  tabase size is.*
1cf0: 2a 20 20 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54 68  *    unknown. Th
1d00: 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 6e  e database may n
1d10: 6f 74 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  ot be read or wr
1d20: 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  itten..**.**    
1d30: 2a 20 4e 6f 20 72 65 61 64 20 6f 72 20 77 72 69  * No read or wri
1d40: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
1d50: 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20  s active..**    
1d60: 2a 20 41 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20 6e  * Any lock, or n
1d70: 6f 20 6c 6f 63 6b 20 61 74 20 61 6c 6c 2c 20 6d  o lock at all, m
1d80: 61 79 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68  ay be held on th
1d90: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1da0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62 53  .**    * The dbS
1db0: 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 20  ize, dbOrigSize 
1dc0: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76  and dbFileSize v
1dd0: 61 72 69 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74  ariables may not
1de0: 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2a 0a   be trusted..**.
1df0: 2a 2a 20 20 52 45 41 44 45 52 3a 0a 2a 2a 0a 2a  **  READER:.**.*
1e00: 2a 20 20 20 20 49 6e 20 74 68 69 73 20 73 74 61  *    In this sta
1e10: 74 65 20 61 6c 6c 20 74 68 65 20 72 65 71 75 69  te all the requi
1e20: 72 65 6d 65 6e 74 73 20 66 6f 72 20 72 65 61 64  rements for read
1e30: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1e40: 20 69 6e 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c 62   in .**    rollb
1e50: 61 63 6b 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d 6f  ack (non-WAL) mo
1e60: 64 65 20 61 72 65 20 6d 65 74 2e 20 55 6e 6c 65  de are met. Unle
1e70: 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ss the pager is 
1e80: 28 6f 72 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20  (or recently.** 
1e90: 20 20 20 77 61 73 29 20 69 6e 20 65 78 63 6c 75     was) in exclu
1ea0: 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64  sive-locking mod
1eb0: 65 2c 20 61 20 75 73 65 72 2d 6c 65 76 65 6c 20  e, a user-level 
1ec0: 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
1ed0: 20 69 73 20 0a 2a 2a 20 20 20 20 6f 70 65 6e 2e   is .**    open.
1ee0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69   The database si
1ef0: 7a 65 20 69 73 20 6b 6e 6f 77 6e 20 69 6e 20 74  ze is known in t
1f00: 68 69 73 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  his state..**.**
1f10: 20 20 20 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e      A connection
1f20: 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f   running with lo
1f30: 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61  cking_mode=norma
1f40: 6c 20 65 6e 74 65 72 73 20 74 68 69 73 20 73 74  l enters this st
1f50: 61 74 65 20 77 68 65 6e 0a 2a 2a 20 20 20 20 69  ate when.**    i
1f60: 74 20 6f 70 65 6e 73 20 61 20 72 65 61 64 2d 74  t opens a read-t
1f70: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
1f80: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72  e database and r
1f90: 65 74 75 72 6e 73 20 74 6f 20 73 74 61 74 65 0a  eturns to state.
1fa0: 2a 2a 20 20 20 20 4f 50 45 4e 20 61 66 74 65 72  **    OPEN after
1fb0: 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61   the read-transa
1fc0: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74  ction is complet
1fd0: 65 64 2e 20 48 6f 77 65 76 65 72 20 61 20 63 6f  ed. However a co
1fe0: 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 72  nnection.**    r
1ff0: 75 6e 6e 69 6e 67 20 69 6e 20 6c 6f 63 6b 69 6e  unning in lockin
2000: 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
2010: 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 65 6d 70   (including temp
2020: 20 64 61 74 61 62 61 73 65 73 29 20 72 65 6d 61   databases) rema
2030: 69 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 74 68 69  ins in.**    thi
2040: 73 20 73 74 61 74 65 20 65 76 65 6e 20 61 66 74  s state even aft
2050: 65 72 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e  er the read-tran
2060: 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65  saction is close
2070: 64 2e 20 54 68 65 20 6f 6e 6c 79 20 77 61 79 0a  d. The only way.
2080: 2a 2a 20 20 20 20 61 20 6c 6f 63 6b 69 6e 67 5f  **    a locking_
2090: 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 63  mode=exclusive c
20a0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 74 72  onnection can tr
20b0: 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 52 45  ansition from RE
20c0: 41 44 45 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a 20  ADER to OPEN.** 
20d0: 20 20 20 69 73 20 76 69 61 20 74 68 65 20 45 52     is via the ER
20e0: 52 4f 52 20 73 74 61 74 65 20 28 73 65 65 20 62  ROR state (see b
20f0: 65 6c 6f 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20 20  elow)..** .**   
2100: 20 2a 20 41 20 72 65 61 64 20 74 72 61 6e 73 61   * A read transa
2110: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63 74  ction may be act
2120: 69 76 65 20 28 62 75 74 20 61 20 77 72 69 74 65  ive (but a write
2130: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  -transaction can
2140: 6e 6f 74 29 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  not)..**    * A 
2150: 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65  SHARED or greate
2160: 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  r lock is held o
2170: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2180: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  ile..**    * The
2190: 20 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65   dbSize variable
21a0: 20 6d 61 79 20 62 65 20 74 72 75 73 74 65 64 20   may be trusted 
21b0: 28 65 76 65 6e 20 69 66 20 61 20 75 73 65 72 2d  (even if a user-
21c0: 6c 65 76 65 6c 20 72 65 61 64 20 0a 2a 2a 20 20  level read .**  
21d0: 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20      transaction 
21e0: 69 73 20 6e 6f 74 20 61 63 74 69 76 65 29 2e 20  is not active). 
21f0: 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20 61  The dbOrigSize a
2200: 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61  nd dbFileSize va
2210: 72 69 61 62 6c 65 73 0a 2a 2a 20 20 20 20 20 20  riables.**      
2220: 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73 74  may not be trust
2230: 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ed at this point
2240: 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65  ..**    * If the
2250: 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20 57   database is a W
2260: 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  AL database, the
2270: 6e 20 74 68 65 20 57 41 4c 20 63 6f 6e 6e 65 63  n the WAL connec
2280: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a 2a  tion is open..**
2290: 20 20 20 20 2a 20 45 76 65 6e 20 69 66 20 61 20      * Even if a 
22a0: 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
22b0: 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 69 74   is not open, it
22c0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
22d0: 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 74 68 65  hat .**      the
22e0: 72 65 20 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f 75  re is no hot-jou
22f0: 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69 6c 65  rnal in the file
2300: 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20  -system..**.**  
2310: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 2a  WRITER_LOCKED:.*
2320: 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65  *.**    The page
2330: 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73 20  r moves to this 
2340: 73 74 61 74 65 20 66 72 6f 6d 20 52 45 41 44 45  state from READE
2350: 52 20 77 68 65 6e 20 61 20 77 72 69 74 65 2d 74  R when a write-t
2360: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20  ransaction.**   
2370: 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64   is first opened
2380: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2390: 2e 20 49 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b  . In WRITER_LOCK
23a0: 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 6c 6f  ED state, all lo
23b0: 63 6b 73 20 0a 2a 2a 20 20 20 20 72 65 71 75 69  cks .**    requi
23c0: 72 65 64 20 74 6f 20 73 74 61 72 74 20 61 20 77  red to start a w
23d0: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
23e0: 20 61 72 65 20 68 65 6c 64 2c 20 62 75 74 20 6e   are held, but n
23f0: 6f 20 61 63 74 75 61 6c 20 0a 2a 2a 20 20 20 20  o actual .**    
2400: 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f  modifications to
2410: 20 74 68 65 20 63 61 63 68 65 20 6f 72 20 64 61   the cache or da
2420: 74 61 62 61 73 65 20 68 61 76 65 20 74 61 6b 65  tabase have take
2430: 6e 20 70 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 20  n place..**.**  
2440: 20 20 49 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f    In rollback mo
2450: 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f  de, a RESERVED o
2460: 72 20 28 69 66 20 74 68 65 20 74 72 61 6e 73 61  r (if the transa
2470: 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
2480: 20 77 69 74 68 20 0a 2a 2a 20 20 20 20 42 45 47   with .**    BEG
2490: 49 4e 20 45 58 43 4c 55 53 49 56 45 29 20 45 58  IN EXCLUSIVE) EX
24a0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
24b0: 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
24c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
24d0: 65 6e 0a 2a 2a 20 20 20 20 6d 6f 76 69 6e 67 20  en.**    moving 
24e0: 74 6f 20 74 68 69 73 20 73 74 61 74 65 2c 20 62  to this state, b
24f0: 75 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ut the journal f
2500: 69 6c 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74  ile is not writt
2510: 65 6e 20 74 6f 20 6f 72 20 6f 70 65 6e 65 64 20  en to or opened 
2520: 0a 2a 2a 20 20 20 20 74 6f 20 69 6e 20 74 68 69  .**    to in thi
2530: 73 20 73 74 61 74 65 2e 20 49 66 20 74 68 65 20  s state. If the 
2540: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
2550: 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
2560: 65 64 20 62 61 63 6b 20 77 68 69 6c 65 20 0a 2a  ed back while .*
2570: 2a 20 20 20 20 69 6e 20 57 52 49 54 45 52 5f 4c  *    in WRITER_L
2580: 4f 43 4b 45 44 20 73 74 61 74 65 2c 20 61 6c 6c  OCKED state, all
2590: 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65   that is require
25a0: 64 20 69 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  d is to unlock t
25b0: 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
25c0: 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20     file..**.**  
25d0: 20 20 49 4e 20 57 41 4c 20 6d 6f 64 65 2c 20 57    IN WAL mode, W
25e0: 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e  alBeginWriteTran
25f0: 73 61 63 74 69 6f 6e 28 29 20 69 73 20 63 61 6c  saction() is cal
2600: 6c 65 64 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20  led to lock the 
2610: 6c 6f 67 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20  log file..**    
2620: 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  If the connectio
2630: 6e 20 69 73 20 72 75 6e 6e 69 6e 67 20 77 69 74  n is running wit
2640: 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  h locking_mode=e
2650: 78 63 6c 75 73 69 76 65 2c 20 61 6e 20 61 74 74  xclusive, an att
2660: 65 6d 70 74 0a 2a 2a 20 20 20 20 69 73 20 6d 61  empt.**    is ma
2670: 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20  de to obtain an 
2680: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
2690: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
26a0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  ile..**.**    * 
26b0: 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  A write transact
26c0: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
26d0: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63 6f  *    * If the co
26e0: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
26f0: 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64   in rollback-mod
2700: 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  e, a RESERVED or
2710: 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 20 20 20   greater .**    
2720: 20 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f    lock is held o
2730: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2740: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20  ile..**    * If 
2750: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
2760: 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 2d 6d 6f  s open in WAL-mo
2770: 64 65 2c 20 61 20 57 41 4c 20 77 72 69 74 65 20  de, a WAL write 
2780: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
2790: 20 20 20 20 69 73 20 6f 70 65 6e 20 28 69 2e 65      is open (i.e
27a0: 2e 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69  . sqlite3WalBegi
27b0: 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
27c0: 6e 28 29 20 68 61 73 20 62 65 65 6e 20 73 75 63  n() has been suc
27d0: 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 20 20 20  cessfully.**    
27e0: 20 20 63 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20 20    called)..**   
27f0: 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20 64   * The dbSize, d
2800: 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62  bOrigSize and db
2810: 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c  FileSize variabl
2820: 65 73 20 61 72 65 20 61 6c 6c 20 76 61 6c 69 64  es are all valid
2830: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63 6f  ..**    * The co
2840: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2850: 67 65 72 20 63 61 63 68 65 20 68 61 76 65 20 6e  ger cache have n
2860: 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ot been modified
2870: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f  ..**    * The jo
2880: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f  urnal file may o
2890: 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65  r may not be ope
28a0: 6e 2e 0a 2a 2a 20 20 20 20 2a 20 4e 6f 74 68 69  n..**    * Nothi
28b0: 6e 67 20 28 6e 6f 74 20 65 76 65 6e 20 74 68 65  ng (not even the
28c0: 20 66 69 72 73 74 20 68 65 61 64 65 72 29 20 68   first header) h
28d0: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
28e0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
28f0: 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 43 41  **.**  WRITER_CA
2900: 43 48 45 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20  CHEMOD:.**.**   
2910: 20 41 20 70 61 67 65 72 20 6d 6f 76 65 73 20 66   A pager moves f
2920: 72 6f 6d 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  rom WRITER_LOCKE
2930: 44 20 73 74 61 74 65 20 74 6f 20 74 68 69 73 20  D state to this 
2940: 73 74 61 74 65 20 77 68 65 6e 20 61 20 70 61 67  state when a pag
2950: 65 20 69 73 0a 2a 2a 20 20 20 20 66 69 72 73 74  e is.**    first
2960: 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68 65   modified by the
2970: 20 75 70 70 65 72 20 6c 61 79 65 72 2e 20 49 6e   upper layer. In
2980: 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74   rollback mode t
2990: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
29a0: 2a 2a 20 20 20 20 69 73 20 6f 70 65 6e 65 64 20  **    is opened 
29b0: 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
29c0: 72 65 61 64 79 20 6f 70 65 6e 29 20 61 6e 64 20  ready open) and 
29d0: 61 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  a header written
29e0: 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 73 74   to the.**    st
29f0: 61 72 74 20 6f 66 20 69 74 2e 20 54 68 65 20 64  art of it. The d
2a00: 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
2a10: 64 69 73 6b 20 68 61 73 20 6e 6f 74 20 62 65 65  disk has not bee
2a20: 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  n modified..**.*
2a30: 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65 20 74  *    * A write t
2a40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
2a50: 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  tive..**    * A 
2a60: 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61  RESERVED or grea
2a70: 74 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ter lock is held
2a80: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2a90: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54   file..**    * T
2aa0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2ab0: 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
2ac0: 66 69 72 73 74 20 68 65 61 64 65 72 20 68 61 73  first header has
2ad0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 0a 2a   been written .*
2ae0: 2a 20 20 20 20 20 20 74 6f 20 69 74 2c 20 62 75  *      to it, bu
2af0: 74 20 74 68 65 20 68 65 61 64 65 72 20 68 61 73  t the header has
2b00: 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e 63 65 64   not been synced
2b10: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 20   to disk..**    
2b20: 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * The contents o
2b30: 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  f the page cache
2b40: 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66   have been modif
2b50: 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54  ied..**.**  WRIT
2b60: 45 52 5f 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20  ER_DBMOD:.**.** 
2b70: 20 20 20 54 68 65 20 70 61 67 65 72 20 74 72 61     The pager tra
2b80: 6e 73 69 74 69 6f 6e 73 20 66 72 6f 6d 20 57 52  nsitions from WR
2b90: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 69 6e  ITER_CACHEMOD in
2ba0: 74 6f 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  to WRITER_DBMOD 
2bb0: 73 74 61 74 65 0a 2a 2a 20 20 20 20 77 68 65 6e  state.**    when
2bc0: 20 69 74 20 6d 6f 64 69 66 69 65 73 20 74 68 65   it modifies the
2bd0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2be0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2bf0: 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a  WAL connections.
2c00: 2a 2a 20 20 20 20 6e 65 76 65 72 20 65 6e 74 65  **    never ente
2c10: 72 20 74 68 69 73 20 73 74 61 74 65 20 28 73 69  r this state (si
2c20: 6e 63 65 20 74 68 65 79 20 64 6f 20 6e 6f 74 20  nce they do not 
2c30: 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62  modify the datab
2c40: 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 20 20 20  ase file,.**    
2c50: 6a 75 73 74 20 74 68 65 20 6c 6f 67 20 66 69 6c  just the log fil
2c60: 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41  e)..**.**    * A
2c70: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2c80: 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
2c90: 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53 49      * An EXCLUSI
2ca0: 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  VE or greater lo
2cb0: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
2cc0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2cd0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75  .**    * The jou
2ce0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
2cf0: 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  n and the first 
2d00: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
2d10: 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20  written .**     
2d20: 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
2d30: 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  isk..**    * The
2d40: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2d50: 20 70 61 67 65 20 63 61 63 68 65 20 68 61 76 65   page cache have
2d60: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 28   been modified (
2d70: 61 6e 64 20 70 6f 73 73 69 62 6c 79 0a 2a 2a 20  and possibly.** 
2d80: 20 20 20 20 20 77 72 69 74 74 65 6e 20 74 6f 20       written to 
2d90: 64 69 73 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57 52  disk)..**.**  WR
2da0: 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 2a  ITER_FINISHED:.*
2db0: 2a 0a 2a 2a 20 20 20 20 49 74 20 69 73 20 6e 6f  *.**    It is no
2dc0: 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61  t possible for a
2dd0: 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   WAL connection 
2de0: 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 73 74  to enter this st
2df0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  ate..**.**    A 
2e00: 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 20 70 61  rollback-mode pa
2e10: 67 65 72 20 63 68 61 6e 67 65 73 20 74 6f 20 57  ger changes to W
2e20: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 73  RITER_FINISHED s
2e30: 74 61 74 65 20 66 72 6f 6d 20 57 52 49 54 45 52  tate from WRITER
2e40: 5f 44 42 4d 4f 44 0a 2a 2a 20 20 20 20 73 74 61  _DBMOD.**    sta
2e50: 74 65 20 61 66 74 65 72 20 74 68 65 20 65 6e 74  te after the ent
2e60: 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ire transaction 
2e70: 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73 73  has been success
2e80: 66 75 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e  fully written in
2e90: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 64 61 74  to the.**    dat
2ea0: 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 74  abase file. In t
2eb0: 68 69 73 20 73 74 61 74 65 20 74 68 65 20 74 72  his state the tr
2ec0: 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62 65  ansaction may be
2ed0: 20 63 6f 6d 6d 69 74 74 65 64 20 73 69 6d 70 6c   committed simpl
2ee0: 79 0a 2a 2a 20 20 20 20 62 79 20 66 69 6e 61 6c  y.**    by final
2ef0: 69 7a 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  izing the journa
2f00: 6c 20 66 69 6c 65 2e 20 4f 6e 63 65 20 69 6e 20  l file. Once in 
2f10: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
2f20: 73 74 61 74 65 2c 20 69 74 20 69 73 20 0a 2a 2a  state, it is .**
2f30: 20 20 20 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65      not possible
2f40: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 64   to modify the d
2f50: 61 74 61 62 61 73 65 20 66 75 72 74 68 65 72 2e  atabase further.
2f60: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
2f70: 74 68 65 20 75 70 70 65 72 20 0a 2a 2a 20 20 20  the upper .**   
2f80: 20 6c 61 79 65 72 20 6d 75 73 74 20 65 69 74 68   layer must eith
2f90: 65 72 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c  er commit or rol
2fa0: 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
2fb0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ction..**.**    
2fc0: 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61  * A write transa
2fd0: 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e  ction is active.
2fe0: 0a 2a 2a 20 20 20 20 2a 20 41 6e 20 45 58 43 4c  .**    * An EXCL
2ff0: 55 53 49 56 45 20 6f 72 20 67 72 65 61 74 65 72  USIVE or greater
3000: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
3010: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3020: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c 20  le..**    * All 
3030: 77 72 69 74 69 6e 67 20 61 6e 64 20 73 79 6e 63  writing and sync
3040: 69 6e 67 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61  ing of journal a
3050: 6e 64 20 64 61 74 61 62 61 73 65 20 64 61 74 61  nd database data
3060: 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 0a 2a   has finished..*
3070: 2a 20 20 20 20 20 20 49 66 20 6e 6f 20 65 72 72  *      If no err
3080: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 61 6c 6c  or occurred, all
3090: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 69 73   that remains is
30a0: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
30b0: 20 6a 6f 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20   journal to.**  
30c0: 20 20 20 20 63 6f 6d 6d 69 74 20 74 68 65 20 74      commit the t
30d0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 61  ransaction. If a
30e0: 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75  n error did occu
30f0: 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  r, the caller wi
3100: 6c 6c 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20  ll need.**      
3110: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
3120: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a  transaction. .**
3130: 0a 2a 2a 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a  .**  ERROR:.**.*
3140: 2a 20 20 20 20 54 68 65 20 45 52 52 4f 52 20 73  *    The ERROR s
3150: 74 61 74 65 20 69 73 20 65 6e 74 65 72 65 64 20  tate is entered 
3160: 77 68 65 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69  when an IO or di
3170: 73 6b 2d 66 75 6c 6c 20 65 72 72 6f 72 20 28 69  sk-full error (i
3180: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53  ncluding.**    S
3190: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
31a0: 4d 29 20 6f 63 63 75 72 73 20 61 74 20 61 20 70  M) occurs at a p
31b0: 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
31c0: 20 74 68 61 74 20 6d 61 6b 65 73 20 69 74 20 0a   that makes it .
31d0: 2a 2a 20 20 20 20 64 69 66 66 69 63 75 6c 74 20  **    difficult 
31e0: 74 6f 20 62 65 20 73 75 72 65 20 74 68 61 74 20  to be sure that 
31f0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
3200: 67 65 72 20 73 74 61 74 65 20 28 63 61 63 68 65  ger state (cache
3210: 20 63 6f 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20   contents, .**  
3220: 20 20 64 62 20 73 69 7a 65 20 65 74 63 2e 29 20    db size etc.) 
3230: 61 72 65 20 63 6f 6e 73 69 73 74 65 6e 74 20 77  are consistent w
3240: 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ith the contents
3250: 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
3260: 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65  tem..**.**    Te
3270: 6d 70 6f 72 61 72 79 20 70 61 67 65 72 20 66 69  mporary pager fi
3280: 6c 65 73 20 6d 61 79 20 65 6e 74 65 72 20 74 68  les may enter th
3290: 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
32a0: 75 74 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ut in-memory pag
32b0: 65 72 73 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74  ers.**    cannot
32c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65  ..**.**    For e
32d0: 78 61 6d 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f  xample, if an IO
32e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
32f0: 69 6c 65 20 70 65 72 66 6f 72 6d 69 6e 67 20 61  ile performing a
3300: 20 72 6f 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20   rollback, .**  
3310: 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f    the contents o
3320: 66 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  f the page-cache
3330: 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
3340: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
3350: 73 74 61 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20  state..**    At 
3360: 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f  this point it wo
3370: 75 6c 64 20 62 65 20 64 61 6e 67 65 72 6f 75 73  uld be dangerous
3380: 20 74 6f 20 63 68 61 6e 67 65 20 62 61 63 6b 20   to change back 
3390: 74 6f 20 52 45 41 44 45 52 20 73 74 61 74 65 0a  to READER state.
33a0: 2a 2a 20 20 20 20 28 61 73 20 75 73 75 61 6c 6c  **    (as usuall
33b0: 79 20 68 61 70 70 65 6e 73 20 61 66 74 65 72 20  y happens after 
33c0: 61 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79  a rollback). Any
33d0: 20 73 75 62 73 65 71 75 65 6e 74 20 72 65 61 64   subsequent read
33e0: 65 72 73 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20  ers might.**    
33f0: 72 65 70 6f 72 74 20 64 61 74 61 62 61 73 65 20  report database 
3400: 63 6f 72 72 75 70 74 69 6f 6e 20 28 64 75 65 20  corruption (due 
3410: 74 6f 20 74 68 65 20 69 6e 63 6f 6e 73 69 73 74  to the inconsist
3420: 65 6e 74 20 63 61 63 68 65 29 2c 20 61 6e 64 20  ent cache), and 
3430: 69 66 0a 2a 2a 20 20 20 20 74 68 65 79 20 75 70  if.**    they up
3440: 67 72 61 64 65 20 74 6f 20 77 72 69 74 65 72 73  grade to writers
3450: 2c 20 74 68 65 79 20 6d 61 79 20 69 6e 61 64 76  , they may inadv
3460: 65 72 74 65 6e 74 6c 79 20 63 6f 72 72 75 70 74  ertently corrupt
3470: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
3480: 20 20 20 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f      file. To avo
3490: 69 64 20 74 68 69 73 20 68 61 7a 61 72 64 2c 20  id this hazard, 
34a0: 74 68 65 20 70 61 67 65 72 20 73 77 69 74 63 68  the pager switch
34b0: 65 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  es into the ERRO
34c0: 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e  R state.**    in
34d0: 73 74 65 61 64 20 6f 66 20 52 45 41 44 45 52 20  stead of READER 
34e0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 75 63 68 20 61  following such a
34f0: 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  n error..**.**  
3500: 20 20 4f 6e 63 65 20 69 74 20 68 61 73 20 65 6e    Once it has en
3510: 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
3520: 73 74 61 74 65 2c 20 61 6e 79 20 61 74 74 65 6d  state, any attem
3530: 70 74 20 74 6f 20 75 73 65 20 74 68 65 20 70 61  pt to use the pa
3540: 67 65 72 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61  ger.**    to rea
3550: 64 20 6f 72 20 77 72 69 74 65 20 64 61 74 61 20  d or write data 
3560: 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
3570: 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e  . Eventually, on
3580: 63 65 20 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75  ce all .**    ou
3590: 74 73 74 61 6e 64 69 6e 67 20 74 72 61 6e 73 61  tstanding transa
35a0: 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e  ctions have been
35b0: 20 61 62 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20   abandoned, the 
35c0: 70 61 67 65 72 20 69 73 20 61 62 6c 65 20 74 6f  pager is able to
35d0: 0a 2a 2a 20 20 20 20 74 72 61 6e 73 69 74 69 6f  .**    transitio
35e0: 6e 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  n back to OPEN s
35f0: 74 61 74 65 2c 20 64 69 73 63 61 72 64 69 6e 67  tate, discarding
3600: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3610: 20 74 68 65 20 0a 2a 2a 20 20 20 20 70 61 67 65   the .**    page
3620: 2d 63 61 63 68 65 20 61 6e 64 20 61 6e 79 20 6f  -cache and any o
3630: 74 68 65 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73  ther in-memory s
3640: 74 61 74 65 20 61 74 20 74 68 65 20 73 61 6d 65  tate at the same
3650: 20 74 69 6d 65 2e 20 45 76 65 72 79 74 68 69 6e   time. Everythin
3660: 67 0a 2a 2a 20 20 20 20 69 73 20 72 65 6c 6f 61  g.**    is reloa
3670: 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 28 61  ded from disk (a
3680: 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
3690: 2c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  , hot-journal ro
36a0: 6c 6c 62 61 63 6b 20 70 65 66 6f 72 6d 65 64 29  llback peformed)
36b0: 0a 2a 2a 20 20 20 20 77 68 65 6e 20 61 20 72 65  .**    when a re
36c0: 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
36d0: 73 20 6e 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e  s next opened on
36e0: 20 74 68 65 20 70 61 67 65 72 20 28 74 72 61 6e   the pager (tran
36f0: 73 69 74 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20  sitioning.**    
3700: 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 52  the pager into R
3710: 45 41 44 45 52 20 73 74 61 74 65 29 2e 20 41 74  EADER state). At
3720: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20   that point the 
3730: 73 79 73 74 65 6d 20 68 61 73 20 72 65 63 6f 76  system has recov
3740: 65 72 65 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d  ered .**    from
3750: 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a   the error..**.*
3760: 2a 20 20 20 20 53 70 65 63 69 66 69 63 61 6c 6c  *    Specificall
3770: 79 2c 20 74 68 65 20 70 61 67 65 72 20 6a 75 6d  y, the pager jum
3780: 70 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ps into the ERRO
3790: 52 20 73 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a  R state if:.**.*
37a0: 2a 20 20 20 20 20 20 31 2e 20 41 6e 20 65 72 72  *      1. An err
37b0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
37c0: 61 74 74 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c  attempting a rol
37d0: 6c 62 61 63 6b 2e 20 54 68 69 73 20 68 61 70 70  lback. This happ
37e0: 65 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20  ens in.**       
37f0: 20 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74    function sqlit
3800: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
3810: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e  )..**.**      2.
3820: 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   An error occurs
3830: 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e   while attemptin
3840: 67 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20  g to finalize a 
3850: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
3860: 20 20 20 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e          followin
3870: 67 20 61 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75  g a commit in fu
3880: 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61  nction sqlite3Pa
3890: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
38a0: 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  o()..**.**      
38b0: 33 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  3. An error occu
38c0: 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74  rs while attempt
38d0: 69 6e 67 20 74 6f 20 77 72 69 74 65 20 74 6f 20  ing to write to 
38e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a  the journal or.*
38f0: 2a 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61  *         databa
3900: 73 65 20 66 69 6c 65 20 69 6e 20 66 75 6e 63 74  se file in funct
3910: 69 6f 6e 20 70 61 67 65 72 53 74 72 65 73 73 28  ion pagerStress(
3920: 29 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  ) in order to fr
3930: 65 65 20 75 70 0a 2a 2a 20 20 20 20 20 20 20 20  ee up.**        
3940: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20   memory..**.**  
3950: 20 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73    In other cases
3960: 2c 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 72  , the error is r
3970: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 62  eturned to the b
3980: 2d 74 72 65 65 20 6c 61 79 65 72 2e 20 54 68 65  -tree layer. The
3990: 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61   b-tree.**    la
39a0: 79 65 72 20 74 68 65 6e 20 61 74 74 65 6d 70 74  yer then attempt
39b0: 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  s a rollback ope
39c0: 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65  ration. If the e
39d0: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a  rror condition .
39e0: 2a 2a 20 20 20 20 70 65 72 73 69 73 74 73 2c 20  **    persists, 
39f0: 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73  the pager enters
3a00: 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
3a10: 20 76 69 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28   via condition (
3a20: 31 29 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  1) above..**.** 
3a30: 20 20 20 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29     Condition (3)
3a40: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
3a50: 63 61 75 73 65 20 69 74 20 63 61 6e 20 62 65 20  cause it can be 
3a60: 74 72 69 67 67 65 72 65 64 20 62 79 20 61 20 72  triggered by a r
3a70: 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73  ead-only.**    s
3a80: 74 61 74 65 6d 65 6e 74 20 65 78 65 63 75 74 65  tatement execute
3a90: 64 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  d within a trans
3aa0: 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  action. In this 
3ab0: 63 61 73 65 2c 20 69 66 20 74 68 65 20 65 72 72  case, if the err
3ac0: 6f 72 0a 2a 2a 20 20 20 20 63 6f 64 65 20 77 65  or.**    code we
3ad0: 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  re simply return
3ae0: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2c 20  ed to the user, 
3af0: 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
3b00: 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
3b10: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
3b20: 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63  ttempt a rollbac
3b30: 6b 2c 20 61 73 20 69 74 20 61 73 73 75 6d 65 73  k, as it assumes
3b40: 20 74 68 61 74 20 61 6e 20 65 72 72 6f 72 20 69   that an error i
3b50: 6e 20 61 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f  n a.**    read-o
3b60: 6e 6c 79 20 73 74 61 74 65 6d 65 6e 74 20 63 61  nly statement ca
3b70: 6e 6e 6f 74 20 6c 65 61 76 65 20 74 68 65 20 70  nnot leave the p
3b80: 61 67 65 72 20 69 6e 20 61 6e 20 69 6e 74 65 72  ager in an inter
3b90: 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65  nally inconsiste
3ba0: 6e 74 20 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e  nt .**    state.
3bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  .**.**    * The 
3bc0: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61  Pager.errCode va
3bd0: 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  riable is set to
3be0: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
3bf0: 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e   than SQLITE_OK.
3c00: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 72 65 20 61  .**    * There a
3c10: 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  re one or more o
3c20: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
3c30: 65 6e 63 65 73 20 74 6f 20 70 61 67 65 73 20 28  ences to pages (
3c40: 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 20 20 20  after the.**    
3c50: 20 20 6c 61 73 74 20 72 65 66 65 72 65 6e 63 65    last reference
3c60: 20 69 73 20 64 72 6f 70 70 65 64 20 74 68 65 20   is dropped the 
3c70: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76  pager should mov
3c80: 65 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  e back to OPEN s
3c90: 74 61 74 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54  tate)..**    * T
3ca0: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
3cb0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
3cc0: 65 72 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a  er..**    .**.**
3cd0: 20 4e 6f 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   Notes:.**.**   
3ce0: 2a 20 41 20 70 61 67 65 72 20 69 73 20 6e 65 76  * A pager is nev
3cf0: 65 72 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  er in WRITER_DBM
3d00: 4f 44 20 6f 72 20 57 52 49 54 45 52 5f 46 49 4e  OD or WRITER_FIN
3d10: 49 53 48 45 44 20 73 74 61 74 65 20 69 66 20 74  ISHED state if t
3d20: 68 65 0a 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63  he.**     connec
3d30: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20  tion is open in 
3d40: 57 41 4c 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20  WAL mode. A WAL 
3d50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c  connection is al
3d60: 77 61 79 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20  ways in one.**  
3d70: 20 20 20 6f 66 20 74 68 65 20 66 69 72 73 74 20     of the first 
3d80: 66 6f 75 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a  four states..**.
3d90: 2a 2a 20 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  **   * Normally,
3da0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70   a connection op
3db0: 65 6e 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  en in exclusive 
3dc0: 6d 6f 64 65 20 69 73 20 6e 65 76 65 72 20 69 6e  mode is never in
3dd0: 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20   PAGER_OPEN.**  
3de0: 20 20 20 73 74 61 74 65 2e 20 54 68 65 72 65 20     state. There 
3df0: 61 72 65 20 74 77 6f 20 65 78 63 65 70 74 69 6f  are two exceptio
3e00: 6e 73 3a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ns: immediately 
3e10: 61 66 74 65 72 20 65 78 63 6c 75 73 69 76 65 2d  after exclusive-
3e20: 6d 6f 64 65 20 68 61 73 0a 2a 2a 20 20 20 20 20  mode has.**     
3e30: 62 65 65 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28  been turned on (
3e40: 61 6e 64 20 62 65 66 6f 72 65 20 61 6e 79 20 72  and before any r
3e50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
3e60: 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a  nsactions are .*
3e70: 2a 20 20 20 20 20 65 78 65 63 75 74 65 64 29 2c  *     executed),
3e80: 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 70 61   and when the pa
3e90: 67 65 72 20 69 73 20 6c 65 61 76 69 6e 67 20 74  ger is leaving t
3ea0: 68 65 20 22 65 72 72 6f 72 20 73 74 61 74 65 22  he "error state"
3eb0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20  ..**.**   * See 
3ec0: 61 6c 73 6f 3a 20 61 73 73 65 72 74 5f 70 61 67  also: assert_pag
3ed0: 65 72 5f 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23  er_state()..*/.#
3ee0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4f 50 45  define PAGER_OPE
3ef0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N               
3f00: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
3f10: 45 52 5f 52 45 41 44 45 52 20 20 20 20 20 20 20  ER_READER       
3f20: 20 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69           1.#defi
3f30: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f40: 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 20 20 32  LOCKED         2
3f50: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3f60: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 20  RITER_CACHEMOD  
3f70: 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 50       3.#define P
3f80: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
3f90: 44 20 20 20 20 20 20 20 20 20 20 34 0a 23 64 65  D          4.#de
3fa0: 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45  fine PAGER_WRITE
3fb0: 52 5f 46 49 4e 49 53 48 45 44 20 20 20 20 20 20  R_FINISHED      
3fc0: 20 35 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   5.#define PAGER
3fd0: 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20  _ERROR          
3fe0: 20 20 20 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20         6../*.** 
3ff0: 54 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  The Pager.eLock 
4000: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f  variable is almo
4010: 73 74 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  st always set to
4020: 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20   one of the .** 
4030: 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e  following lockin
4040: 67 2d 73 74 61 74 65 73 2c 20 61 63 63 6f 72 64  g-states, accord
4050: 69 6e 67 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20  ing to the lock 
4060: 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f  currently held o
4070: 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
4080: 65 20 66 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c  e file: NO_LOCK,
4090: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
40a0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
40b0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
40c0: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
40d0: 69 73 20 6b 65 70 74 20 75 70 20 74 6f 20 64 61  is kept up to da
40e0: 74 65 20 61 73 20 6c 6f 63 6b 73 20 61 72 65 20  te as locks are 
40f0: 74 61 6b 65 6e 20 61 6e 64 20 72 65 6c 65 61 73  taken and releas
4100: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 70 61 67  ed by.** the pag
4110: 65 72 4c 6f 63 6b 44 62 28 29 20 61 6e 64 20 70  erLockDb() and p
4120: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77  agerUnlockDb() w
4130: 72 61 70 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49  rappers..**.** I
4140: 66 20 74 68 65 20 56 46 53 20 78 4c 6f 63 6b 28  f the VFS xLock(
4150: 29 20 6f 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72  ) or xUnlock() r
4160: 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
4170: 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
4180: 45 5f 42 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20  E_BUSY.** (i.e. 
4190: 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  one of the SQLIT
41a0: 45 5f 49 4f 45 52 52 20 73 75 62 74 79 70 65 73  E_IOERR subtypes
41b0: 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 63 6c 65  ), it is not cle
41c0: 61 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ar whether or no
41d0: 74 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 74 69  t.** the operati
41e0: 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75  on was successfu
41f0: 6c 2e 20 49 6e 20 74 68 65 73 65 20 63 69 72 63  l. In these circ
4200: 75 6d 73 74 61 6e 63 65 73 20 70 61 67 65 72 4c  umstances pagerL
4210: 6f 63 6b 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70  ockDb() and.** p
4220: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74  agerUnlockDb() t
4230: 61 6b 65 20 61 20 63 6f 6e 73 65 72 76 61 74 69  ake a conservati
4240: 76 65 20 61 70 70 72 6f 61 63 68 20 2d 20 65 4c  ve approach - eL
4250: 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 75 70  ock is always up
4260: 64 61 74 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e  dated.** when un
4270: 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69 6c 65  locking the file
4280: 2c 20 61 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74  , and only updat
4290: 65 64 20 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20  ed when locking 
42a0: 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 0a  the file if the.
42b0: 2a 2a 20 56 46 53 20 63 61 6c 6c 20 69 73 20 73  ** VFS call is s
42c0: 75 63 63 65 73 73 66 75 6c 2e 20 54 68 69 73 20  uccessful. This 
42d0: 77 61 79 2c 20 74 68 65 20 50 61 67 65 72 2e 65  way, the Pager.e
42e0: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 6d 61  Lock variable ma
42f0: 79 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61  y be set.** to a
4300: 20 6c 65 73 73 20 65 78 63 6c 75 73 69 76 65 20   less exclusive 
4310: 28 6c 6f 77 65 72 29 20 76 61 6c 75 65 20 74 68  (lower) value th
4320: 61 6e 20 74 68 65 20 6c 6f 63 6b 20 74 68 61 74  an the lock that
4330: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 68 65 6c   is actually hel
4340: 64 0a 2a 2a 20 61 74 20 74 68 65 20 73 79 73 74  d.** at the syst
4350: 65 6d 20 6c 65 76 65 6c 2c 20 62 75 74 20 69 74  em level, but it
4360: 20 69 73 20 6e 65 76 65 72 20 73 65 74 20 74 6f   is never set to
4370: 20 61 20 6d 6f 72 65 20 65 78 63 6c 75 73 69 76   a more exclusiv
4380: 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  e value..**.** T
4390: 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 73  his is usually s
43a0: 61 66 65 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f  afe. If an xUnlo
43b0: 63 6b 20 66 61 69 6c 73 20 6f 72 20 61 70 70 65  ck fails or appe
43c0: 61 72 73 20 74 6f 20 66 61 69 6c 2c 20 74 68 65  ars to fail, the
43d0: 72 65 20 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20  re may .** be a 
43e0: 66 65 77 20 72 65 64 75 6e 64 61 6e 74 20 78 4c  few redundant xL
43f0: 6f 63 6b 28 29 20 63 61 6c 6c 73 20 6f 72 20 61  ock() calls or a
4400: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 68 65 6c   lock may be hel
4410: 64 20 66 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61  d for longer tha
4420: 6e 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 62  n.** required, b
4430: 75 74 20 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c  ut nothing reall
4440: 79 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  y goes wrong..**
4450: 0a 2a 2a 20 54 68 65 20 65 78 63 65 70 74 69 6f  .** The exceptio
4460: 6e 20 69 73 20 77 68 65 6e 20 74 68 65 20 64 61  n is when the da
4470: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75  tabase file is u
4480: 6e 6c 6f 63 6b 65 64 20 61 73 20 74 68 65 20 70  nlocked as the p
4490: 61 67 65 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72  ager moves.** fr
44a0: 6f 6d 20 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e  om ERROR to OPEN
44b0: 20 73 74 61 74 65 2e 20 41 74 20 74 68 69 73 20   state. At this 
44c0: 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
44d0: 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  be a hot-journal
44e0: 20 66 69 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65   file .** in the
44f0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 74 68 61   file-system tha
4500: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
4510: 6c 6c 65 64 20 62 61 63 6b 20 28 61 73 20 70 61  lled back (as pa
4520: 72 74 20 6f 66 20 61 6e 20 4f 50 45 4e 2d 3e 53  rt of an OPEN->S
4530: 48 41 52 45 44 0a 2a 2a 20 74 72 61 6e 73 69 74  HARED.** transit
4540: 69 6f 6e 2c 20 62 79 20 74 68 65 20 73 61 6d 65  ion, by the same
4550: 20 70 61 67 65 72 20 6f 72 20 61 6e 79 20 6f 74   pager or any ot
4560: 68 65 72 29 2e 20 49 66 20 74 68 65 20 63 61 6c  her). If the cal
4570: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a  l to xUnlock().*
4580: 2a 20 66 61 69 6c 73 20 61 74 20 74 68 69 73 20  * fails at this 
4590: 70 6f 69 6e 74 20 61 6e 64 20 74 68 65 20 70 61  point and the pa
45a0: 67 65 72 20 69 73 20 6c 65 66 74 20 68 6f 6c 64  ger is left hold
45b0: 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
45c0: 20 6c 6f 63 6b 2c 20 74 68 69 73 0a 2a 2a 20 63   lock, this.** c
45d0: 61 6e 20 63 6f 6e 66 75 73 65 20 74 68 65 20 63  an confuse the c
45e0: 61 6c 6c 20 74 6f 20 78 43 68 65 63 6b 52 65 73  all to xCheckRes
45f0: 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c  ervedLock() call
4600: 20 6d 61 64 65 20 6c 61 74 65 72 20 61 73 20 70   made later as p
4610: 61 72 74 0a 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f  art.** of hot-jo
4620: 75 72 6e 61 6c 20 64 65 74 65 63 74 69 6f 6e 2e  urnal detection.
4630: 0a 2a 2a 0a 2a 2a 20 78 43 68 65 63 6b 52 65 73  .**.** xCheckRes
4640: 65 72 76 65 64 4c 6f 63 6b 28 29 20 69 73 20 64  ervedLock() is d
4650: 65 66 69 6e 65 64 20 61 73 20 72 65 74 75 72 6e  efined as return
4660: 69 6e 67 20 74 72 75 65 20 22 69 66 20 74 68 65  ing true "if the
4670: 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
4680: 20 0a 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 62   .** lock held b
4690: 79 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f  y this process o
46a0: 72 20 61 6e 79 20 6f 74 68 65 72 73 22 2e 20 53  r any others". S
46b0: 6f 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  o xCheckReserved
46c0: 4c 6f 63 6b 20 6d 61 79 20 0a 2a 2a 20 72 65 74  Lock may .** ret
46d0: 75 72 6e 20 74 72 75 65 20 62 65 63 61 75 73 65  urn true because
46e0: 20 74 68 65 20 63 61 6c 6c 65 72 20 69 74 73 65   the caller itse
46f0: 6c 66 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e  lf is holding an
4700: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
4710: 28 62 75 74 0a 2a 2a 20 64 6f 65 73 6e 27 74 20  (but.** doesn't 
4720: 6b 6e 6f 77 20 69 74 20 62 65 63 61 75 73 65 20  know it because 
4730: 6f 66 20 61 20 70 72 65 76 69 6f 75 73 20 65 72  of a previous er
4740: 72 6f 72 20 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e  ror in xUnlock).
4750: 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   If this happens
4760: 0a 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  .** a hot-journa
4770: 6c 20 6d 61 79 20 62 65 20 6d 69 73 74 61 6b 65  l may be mistake
4780: 6e 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20  n for a journal 
4790: 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 62 79  being created by
47a0: 20 61 6e 20 61 63 74 69 76 65 0a 2a 2a 20 74 72   an active.** tr
47b0: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 61 6e 6f  ansaction in ano
47c0: 74 68 65 72 20 70 72 6f 63 65 73 73 2c 20 63 61  ther process, ca
47d0: 75 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f 20  using SQLite to 
47e0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
47f0: 74 61 62 61 73 65 0a 2a 2a 20 77 69 74 68 6f 75  tabase.** withou
4800: 74 20 72 6f 6c 6c 69 6e 67 20 69 74 20 62 61 63  t rolling it bac
4810: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b  k..**.** To work
4820: 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66   around this, if
4830: 20 61 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f   a call to xUnlo
4840: 63 6b 28 29 20 66 61 69 6c 73 20 77 68 65 6e 20  ck() fails when 
4850: 75 6e 6c 6f 63 6b 69 6e 67 20 74 68 65 0a 2a 2a  unlocking the.**
4860: 20 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65   database in the
4870: 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 50 61   ERROR state, Pa
4880: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
4890: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
48a0: 2e 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20  . It.** is only 
48b0: 63 68 61 6e 67 65 64 20 62 61 63 6b 20 74 6f 20  changed back to 
48c0: 61 20 72 65 61 6c 20 6c 6f 63 6b 69 6e 67 20 73  a real locking s
48d0: 74 61 74 65 20 61 66 74 65 72 20 61 20 73 75 63  tate after a suc
48e0: 63 65 73 73 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20  cessful call.** 
48f0: 74 6f 20 78 4c 6f 63 6b 28 45 58 43 4c 55 53 49  to xLock(EXCLUSI
4900: 56 45 29 2e 20 41 6c 73 6f 2c 20 74 68 65 20 63  VE). Also, the c
4910: 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 4f 50  ode to do the OP
4920: 45 4e 2d 3e 53 48 41 52 45 44 20 73 74 61 74 65  EN->SHARED state
4930: 20 74 72 61 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f   transition.** o
4940: 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 20 66  mits the check f
4950: 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
4960: 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20   if Pager.eLock 
4970: 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  is set to UNKNOW
4980: 4e 5f 4c 4f 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e  N_LOCK .** lock.
4990: 20 49 6e 73 74 65 61 64 2c 20 69 74 20 61 73 73   Instead, it ass
49a0: 75 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  umes a hot-journ
49b0: 61 6c 20 65 78 69 73 74 73 20 61 6e 64 20 6f 62  al exists and ob
49c0: 74 61 69 6e 73 20 61 6e 20 45 58 43 4c 55 53 49  tains an EXCLUSI
49d0: 56 45 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68  VE.** lock on th
49e0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
49f0: 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
4a00: 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  g to roll it bac
4a10: 6b 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a  k. See function.
4a20: 2a 2a 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f  ** PagerSharedLo
4a30: 63 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 64 65  ck() for more de
4a40: 74 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  tail..**.** Page
4a50: 72 2e 65 4c 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79  r.eLock may only
4a60: 20 62 65 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   be set to UNKNO
4a70: 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65  WN_LOCK when the
4a80: 20 70 61 67 65 72 20 69 73 20 69 6e 20 0a 2a 2a   pager is in .**
4a90: 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
4aa0: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  e..*/.#define UN
4ab0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 20 20  KNOWN_LOCK      
4ac0: 20 20 20 20 20 20 20 20 20 20 28 45 58 43 4c 55            (EXCLU
4ad0: 53 49 56 45 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a  SIVE_LOCK+1)../*
4ae0: 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64  .** A macro used
4af0: 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68   for invoking th
4b00: 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65  e codec if there
4b10: 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65   is one.*/.#ifde
4b20: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
4b30: 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  EC.# define CODE
4b40: 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a  C1(P,D,N,X,E) \.
4b50: 20 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64 65      if( P->xCode
4b60: 63 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28 50  c && P->xCodec(P
4b70: 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d  ->pCodec,D,N,X)=
4b80: 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65 66  =0 ){ E; }.# def
4b90: 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e  ine CODEC2(P,D,N
4ba0: 2c 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69 66  ,X,E,O) \.    if
4bb0: 28 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29  ( P->xCodec==0 )
4bc0: 7b 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d 65  { O=(char*)D; }e
4bd0: 6c 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28 4f  lse \.    if( (O
4be0: 3d 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64  =(char*)(P->xCod
4bf0: 65 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e  ec(P->pCodec,D,N
4c00: 2c 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20 7d  ,X)))==0 ){ E; }
4c10: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
4c20: 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45  CODEC1(P,D,N,X,E
4c30: 29 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a  )   /* NO-OP */.
4c40: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28  # define CODEC2(
4c50: 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28  P,D,N,X,E,O) O=(
4c60: 63 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a 0a  char*)D.#endif..
4c70: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
4c80: 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f 72  m allowed sector
4c90: 20 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49 66   size. 64KiB. If
4ca0: 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65   the xSectorsize
4cb0: 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65  () method .** re
4cc0: 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61  turns a value la
4cd0: 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20  rger than this, 
4ce0: 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f  then MAX_SECTOR_
4cf0: 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73  SIZE is used ins
4d00: 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f  tead..** This co
4d10: 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20  uld conceivably 
4d20: 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  cause corruption
4d30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77   following a pow
4d40: 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a  er failure on.**
4d50: 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20   such a system. 
4d60: 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c  This is currentl
4d70: 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65  y an undocumente
4d80: 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66  d limit..*/.#def
4d90: 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  ine MAX_SECTOR_S
4da0: 49 5a 45 20 30 78 31 30 30 30 30 0a 0a 0a 2f 2a  IZE 0x10000.../*
4db0: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
4dc0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
4dd0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c   structure is al
4de0: 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68  located for each
4df0: 20 61 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70   active.** savep
4e00: 6f 69 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65  oint and stateme
4e10: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
4e20: 6e 20 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c  n the system. Al
4e30: 6c 20 73 75 63 68 20 73 74 72 75 63 74 75 72 65  l such structure
4e40: 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20  s.** are stored 
4e50: 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61  in the Pager.aSa
4e60: 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c  vepoint[] array,
4e70: 20 77 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61   which is alloca
4e80: 74 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a  ted and.** resiz
4e90: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
4ea0: 52 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a  Realloc()..**.**
4eb0: 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e   When a savepoin
4ec0: 74 20 69 73 20 63 72 65 61 74 65 64 2c 20 74 68  t is created, th
4ed0: 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
4ee0: 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c  .iHdrOffset fiel
4ef0: 64 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30  d is.** set to 0
4f00: 2e 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68  . If a journal-h
4f10: 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e  eader is written
4f20: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a   into the main j
4f30: 6f 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20  ournal while.** 
4f40: 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73  the savepoint is
4f50: 20 61 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48   active, then iH
4f60: 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20  drOffset is set 
4f70: 74 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66 73  to the byte offs
4f80: 65 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65  et .** immediate
4f90: 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
4fa0: 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65   last journal re
4fb0: 63 6f 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74  cord written int
4fc0: 6f 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f  o the main.** jo
4fd0: 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65  urnal before the
4fe0: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e   journal-header.
4ff0: 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65   This is require
5000: 64 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69  d during savepoi
5010: 6e 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28  nt.** rollback (
5020: 73 65 65 20 70 61 67 65 72 50 6c 61 79 62 61 63  see pagerPlaybac
5030: 6b 53 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a  kSavepoint())..*
5040: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
5050: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
5060: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a  PagerSavepoint;.
5070: 73 74 72 75 63 74 20 50 61 67 65 72 53 61 76 65  struct PagerSave
5080: 70 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f  point {.  i64 iO
5090: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
50a0: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69         /* Starti
50b0: 6e 67 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69  ng offset in mai
50c0: 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  n journal */.  i
50d0: 36 34 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20  64 iHdrOffset;  
50e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
50f0: 65 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69  ee above */.  Bi
5100: 74 76 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69  tvec *pInSavepoi
5110: 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65  nt;        /* Se
5120: 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  t of pages in th
5130: 69 73 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  is savepoint */.
5140: 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20    Pgno nOrig;   
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5160: 2a 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65  * Original numbe
5170: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69  r of pages in fi
5180: 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75  le */.  Pgno iSu
5190: 62 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  bRec;           
51a0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
51b0: 20 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e   first record in
51c0: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
51d0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
51e0: 4d 49 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57  MIT_WAL.  u32 aW
51f0: 61 6c 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50  alData[WAL_SAVEP
5200: 4f 49 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20  OINT_NDATA];    
5210: 20 20 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70      /* WAL savep
5220: 6f 69 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  oint context */.
5230: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
5240: 20 42 69 74 73 20 6f 66 20 74 68 65 20 50 61 67   Bits of the Pag
5250: 65 72 2e 64 6f 4e 6f 74 53 70 69 6c 6c 20 66 6c  er.doNotSpill fl
5260: 61 67 2e 20 20 53 65 65 20 66 75 72 74 68 65 72  ag.  See further
5270: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 62 65 6c   description bel
5280: 6f 77 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  ow..*/.#define S
5290: 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 20 20 20  PILLFLAG_OFF    
52a0: 20 20 20 20 20 30 78 30 31 20 2f 2a 20 4e 65 76       0x01 /* Nev
52b0: 65 72 20 73 70 69 6c 6c 20 63 61 63 68 65 2e 20  er spill cache. 
52c0: 20 53 65 74 20 76 69 61 20 70 72 61 67 6d 61 20   Set via pragma 
52d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c  */.#define SPILL
52e0: 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 20 20  FLAG_ROLLBACK   
52f0: 20 30 78 30 32 20 2f 2a 20 43 75 72 72 65 6e 74   0x02 /* Current
5300: 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 2c 20 73   rolling back, s
5310: 6f 20 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 2a  o do not spill *
5320: 2f 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46  /.#define SPILLF
5330: 4c 41 47 5f 4e 4f 53 59 4e 43 20 20 20 20 20 20  LAG_NOSYNC      
5340: 30 78 30 34 20 2f 2a 20 53 70 69 6c 6c 20 69 73  0x04 /* Spill is
5350: 20 6f 6b 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20   ok, but do not 
5360: 73 79 6e 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  sync */../*.** A
5370: 6e 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68  n open page cach
5380: 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  e is an instance
5390: 20 6f 66 20 73 74 72 75 63 74 20 50 61 67 65 72   of struct Pager
53a0: 2e 20 41 20 64 65 73 63 72 69 70 74 69 6f 6e 20  . A description 
53b0: 6f 66 0a 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68  of.** some of th
53c0: 65 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74  e more important
53d0: 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65   member variable
53e0: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
53f0: 20 65 53 74 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20   eState.**.**   
5400: 54 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61  The current 'sta
5410: 74 65 27 20 6f 66 20 74 68 65 20 70 61 67 65 72  te' of the pager
5420: 20 6f 62 6a 65 63 74 2e 20 53 65 65 20 74 68 65   object. See the
5430: 20 63 6f 6d 6d 65 6e 74 20 61 6e 64 20 73 74 61   comment and sta
5440: 74 65 0a 2a 2a 20 20 20 64 69 61 67 72 61 6d 20  te.**   diagram 
5450: 61 62 6f 76 65 20 66 6f 72 20 61 20 64 65 73 63  above for a desc
5460: 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  ription of the p
5470: 61 67 65 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  ager state..**.*
5480: 2a 20 65 4c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20  * eLock.**.**   
5490: 46 6f 72 20 61 20 72 65 61 6c 20 6f 6e 2d 64 69  For a real on-di
54a0: 73 6b 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  sk database, the
54b0: 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65   current lock he
54c0: 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
54d0: 73 65 20 66 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e  se file -.**   N
54e0: 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c  O_LOCK, SHARED_L
54f0: 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  OCK, RESERVED_LO
5500: 43 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f  CK or EXCLUSIVE_
5510: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f  LOCK..**.**   Fo
5520: 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72  r a temporary or
5530: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
5540: 61 73 65 20 28 6e 65 69 74 68 65 72 20 6f 66 20  ase (neither of 
5550: 77 68 69 63 68 20 72 65 71 75 69 72 65 20 61 6e  which require an
5560: 79 0a 2a 2a 20 20 20 6c 6f 63 6b 73 29 2c 20 74  y.**   locks), t
5570: 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20  his variable is 
5580: 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 45 58  always set to EX
5590: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 53 69  CLUSIVE_LOCK. Si
55a0: 6e 63 65 20 73 75 63 68 0a 2a 2a 20 20 20 64 61  nce such.**   da
55b0: 74 61 62 61 73 65 73 20 61 6c 77 61 79 73 20 68  tabases always h
55c0: 61 76 65 20 50 61 67 65 72 2e 65 78 63 6c 75 73  ave Pager.exclus
55d0: 69 76 65 4d 6f 64 65 3d 3d 31 2c 20 74 68 69 73  iveMode==1, this
55e0: 20 74 72 69 63 6b 73 20 74 68 65 20 70 61 67 65   tricks the page
55f0: 72 0a 2a 2a 20 20 20 6c 6f 67 69 63 20 69 6e 74  r.**   logic int
5600: 6f 20 74 68 69 6e 6b 69 6e 67 20 74 68 61 74 20  o thinking that 
5610: 69 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61  it already has a
5620: 6c 6c 20 74 68 65 20 6c 6f 63 6b 73 20 69 74 20  ll the locks it 
5630: 77 69 6c 6c 20 65 76 65 72 0a 2a 2a 20 20 20 6e  will ever.**   n
5640: 65 65 64 20 28 61 6e 64 20 6e 6f 20 72 65 61 73  eed (and no reas
5650: 6f 6e 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68  on to release th
5660: 65 6d 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20  em)..**.**   In 
5670: 73 6f 6d 65 20 28 6f 62 73 63 75 72 65 29 20 63  some (obscure) c
5680: 69 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 74 68  ircumstances, th
5690: 69 73 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20  is variable may 
56a0: 61 6c 73 6f 20 62 65 20 73 65 74 20 74 6f 0a 2a  also be set to.*
56b0: 2a 20 20 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  *   UNKNOWN_LOCK
56c0: 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e  . See the commen
56d0: 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66  t above the #def
56e0: 69 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c  ine of UNKNOWN_L
56f0: 4f 43 4b 20 66 6f 72 0a 2a 2a 20 20 20 64 65 74  OCK for.**   det
5700: 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e  ails..**.** chan
5710: 67 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a  geCountDone.**.*
5720: 2a 20 20 20 54 68 69 73 20 62 6f 6f 6c 65 61 6e  *   This boolean
5730: 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65   variable is use
5740: 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  d to make sure t
5750: 68 61 74 20 74 68 65 20 63 68 61 6e 67 65 2d 63  hat the change-c
5760: 6f 75 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74 68  ounter .**   (th
5770: 65 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20  e 4-byte header 
5780: 66 69 65 6c 64 20 61 74 20 62 79 74 65 20 6f 66  field at byte of
5790: 66 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 64  fset 24 of the d
57a0: 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 69 73  atabase file) is
57b0: 20 0a 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61 74   .**   not updat
57c0: 65 64 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68  ed more often th
57d0: 61 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 2a  an necessary. .*
57e0: 2a 0a 2a 2a 20 20 20 49 74 20 69 73 20 73 65 74  *.**   It is set
57f0: 20 74 6f 20 74 72 75 65 20 77 68 65 6e 20 74 68   to true when th
5800: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
5810: 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65   field is update
5820: 64 2c 20 77 68 69 63 68 20 0a 2a 2a 20 20 20 63  d, which .**   c
5830: 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69  an only happen i
5840: 66 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  f an exclusive l
5850: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
5860: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
5870: 2e 0a 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65  ..**   It is cle
5880: 61 72 65 64 20 28 73 65 74 20 74 6f 20 66 61 6c  ared (set to fal
5890: 73 65 29 20 77 68 65 6e 65 76 65 72 20 61 6e 20  se) whenever an 
58a0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69  exclusive lock i
58b0: 73 20 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75 69  s .**   relinqui
58c0: 73 68 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61  shed on the data
58d0: 62 61 73 65 20 66 69 6c 65 2e 20 45 61 63 68 20  base file. Each 
58e0: 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69  time a transacti
58f0: 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c  on is committed,
5900: 0a 2a 2a 20 20 20 54 68 65 20 63 68 61 6e 67 65  .**   The change
5910: 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69  CountDone flag i
5920: 73 20 69 6e 73 70 65 63 74 65 64 2e 20 49 66 20  s inspected. If 
5930: 69 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 20  it is true, the 
5940: 77 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70 64  work of.**   upd
5950: 61 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65  ating the change
5960: 2d 63 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69 74  -counter is omit
5970: 74 65 64 20 66 6f 72 20 74 68 65 20 63 75 72 72  ted for the curr
5980: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
5990: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65  .**.**   This me
59a0: 63 68 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68  chanism means th
59b0: 61 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20  at when running 
59c0: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
59d0: 65 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  e, a connection 
59e0: 0a 2a 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20  .**   need only 
59f0: 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67  update the chang
5a00: 65 2d 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20  e-counter once, 
5a10: 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 72  for the first tr
5a20: 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 63  ansaction.**   c
5a30: 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  ommitted..**.** 
5a40: 73 65 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20  setMaster.**.** 
5a50: 20 20 57 68 65 6e 20 50 61 67 65 72 43 6f 6d 6d    When PagerComm
5a60: 69 74 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20  itPhaseOne() is 
5a70: 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 6d 69 74  called to commit
5a80: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20   a transaction, 
5a90: 69 74 20 6d 61 79 0a 2a 2a 20 20 20 28 6f 72 20  it may.**   (or 
5aa0: 6d 61 79 20 6e 6f 74 29 20 73 70 65 63 69 66 79  may not) specify
5ab0: 20 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61   a master-journa
5ac0: 6c 20 6e 61 6d 65 20 74 6f 20 62 65 20 77 72 69  l name to be wri
5ad0: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a  tten into the .*
5ae0: 2a 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  *   journal file
5af0: 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 73 79   before it is sy
5b00: 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  nced to disk..**
5b10: 0a 2a 2a 20 20 20 57 68 65 74 68 65 72 20 6f 72  .**   Whether or
5b20: 20 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66   not a journal f
5b30: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d  ile contains a m
5b40: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f  aster-journal po
5b50: 69 6e 74 65 72 20 61 66 66 65 63 74 73 20 0a 2a  inter affects .*
5b60: 2a 20 20 20 74 68 65 20 77 61 79 20 69 6e 20 77  *   the way in w
5b70: 68 69 63 68 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hich the journal
5b80: 20 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a   file is finaliz
5b90: 65 64 20 61 66 74 65 72 20 74 68 65 20 74 72 61  ed after the tra
5ba0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20  nsaction is .** 
5bb0: 20 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72    committed or r
5bc0: 6f 6c 6c 65 64 20 62 61 63 6b 20 77 68 65 6e 20  olled back when 
5bd0: 72 75 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72  running in "jour
5be0: 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54  nal_mode=PERSIST
5bf0: 22 20 6d 6f 64 65 2e 0a 2a 2a 20 20 20 49 66 20  " mode..**   If 
5c00: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  a journal file d
5c10: 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  oes not contain 
5c20: 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  a master-journal
5c30: 20 70 6f 69 6e 74 65 72 2c 20 69 74 20 69 73 0a   pointer, it is.
5c40: 2a 2a 20 20 20 66 69 6e 61 6c 69 7a 65 64 20 62  **   finalized b
5c50: 79 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68  y overwriting th
5c60: 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
5c70: 68 65 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f  header with zero
5c80: 65 73 2e 20 49 66 0a 2a 2a 20 20 20 69 74 20 64  es. If.**   it d
5c90: 6f 65 73 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61  oes contain a ma
5ca0: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster-journal poi
5cb0: 6e 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  nter the journal
5cc0: 20 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a   file is finaliz
5cd0: 65 64 20 0a 2a 2a 20 20 20 62 79 20 74 72 75 6e  ed .**   by trun
5ce0: 63 61 74 69 6e 67 20 69 74 20 74 6f 20 7a 65 72  cating it to zer
5cf0: 6f 20 62 79 74 65 73 2c 20 6a 75 73 74 20 61 73  o bytes, just as
5d00: 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   if the connecti
5d10: 6f 6e 20 77 65 72 65 20 0a 2a 2a 20 20 20 72 75  on were .**   ru
5d20: 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61  nning in "journa
5d30: 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 22  l_mode=truncate"
5d40: 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a   mode..**.**   J
5d50: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61  ournal files tha
5d60: 74 20 63 6f 6e 74 61 69 6e 20 6d 61 73 74 65 72  t contain master
5d70: 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
5d80: 73 20 63 61 6e 6e 6f 74 20 62 65 20 66 69 6e 61  s cannot be fina
5d90: 6c 69 7a 65 64 0a 2a 2a 20 20 20 73 69 6d 70 6c  lized.**   simpl
5da0: 79 20 62 79 20 6f 76 65 72 77 72 69 74 69 6e 67  y by overwriting
5db0: 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
5dc0: 61 6c 2d 68 65 61 64 65 72 20 77 69 74 68 20 7a  al-header with z
5dd0: 65 72 6f 65 73 2c 20 61 73 20 74 68 65 0a 2a 2a  eroes, as the.**
5de0: 20 20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61     master journa
5df0: 6c 20 70 6f 69 6e 74 65 72 20 63 6f 75 6c 64 20  l pointer could 
5e00: 69 6e 74 65 72 66 65 72 65 20 77 69 74 68 20 68  interfere with h
5e10: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
5e20: 61 63 6b 20 6f 66 20 61 6e 79 0a 2a 2a 20 20 20  ack of any.**   
5e30: 73 75 62 73 65 71 75 65 6e 74 6c 79 20 69 6e 74  subsequently int
5e40: 65 72 72 75 70 74 65 64 20 74 72 61 6e 73 61 63  errupted transac
5e50: 74 69 6f 6e 20 74 68 61 74 20 72 65 75 73 65 73  tion that reuses
5e60: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5e70: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66  e..**.**   The f
5e80: 6c 61 67 20 69 73 20 63 6c 65 61 72 65 64 20 61  lag is cleared a
5e90: 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 6a 6f  s soon as the jo
5ea0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 69  urnal file is fi
5eb0: 6e 61 6c 69 7a 65 64 20 28 65 69 74 68 65 72 0a  nalized (either.
5ec0: 2a 2a 20 20 20 62 79 20 50 61 67 65 72 43 6f 6d  **   by PagerCom
5ed0: 6d 69 74 50 68 61 73 65 54 77 6f 20 6f 72 20 50  mitPhaseTwo or P
5ee0: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 29 2e 20 49  agerRollback). I
5ef0: 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 70 72  f an IO error pr
5f00: 65 76 65 6e 74 73 20 74 68 65 0a 2a 2a 20 20 20  events the.**   
5f10: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f  journal file fro
5f20: 6d 20 62 65 69 6e 67 20 73 75 63 63 65 73 73 66  m being successf
5f30: 75 6c 6c 79 20 66 69 6e 61 6c 69 7a 65 64 2c 20  ully finalized, 
5f40: 74 68 65 20 73 65 74 4d 61 73 74 65 72 20 66 6c  the setMaster fl
5f50: 61 67 0a 2a 2a 20 20 20 69 73 20 63 6c 65 61 72  ag.**   is clear
5f60: 65 64 20 61 6e 79 77 61 79 20 28 61 6e 64 20 74  ed anyway (and t
5f70: 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6d 6f  he pager will mo
5f80: 76 65 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74  ve to ERROR stat
5f90: 65 29 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53  e)..**.** doNotS
5fa0: 70 69 6c 6c 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69  pill.**.**   Thi
5fb0: 73 20 76 61 72 69 61 62 6c 65 73 20 63 6f 6e 74  s variables cont
5fc0: 72 6f 6c 20 74 68 65 20 62 65 68 61 76 69 6f 72  rol the behavior
5fd0: 20 6f 66 20 63 61 63 68 65 2d 73 70 69 6c 6c 73   of cache-spills
5fe0: 20 20 28 63 61 6c 6c 73 20 6d 61 64 65 20 62 79    (calls made by
5ff0: 0a 2a 2a 20 20 20 74 68 65 20 70 63 61 63 68 65  .**   the pcache
6000: 20 6d 6f 64 75 6c 65 20 74 6f 20 74 68 65 20 70   module to the p
6010: 61 67 65 72 53 74 72 65 73 73 28 29 20 72 6f 75  agerStress() rou
6020: 74 69 6e 65 20 74 6f 20 77 72 69 74 65 20 63 61  tine to write ca
6030: 63 68 65 64 20 64 61 74 61 0a 2a 2a 20 20 20 74  ched data.**   t
6040: 6f 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  o the file-syste
6050: 6d 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  m in order to fr
6060: 65 65 20 75 70 20 6d 65 6d 6f 72 79 29 2e 0a 2a  ee up memory)..*
6070: 2a 0a 2a 2a 20 20 20 57 68 65 6e 20 62 69 74 73  *.**   When bits
6080: 20 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 6f   SPILLFLAG_OFF o
6090: 72 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c  r SPILLFLAG_ROLL
60a0: 42 41 43 4b 20 6f 66 20 64 6f 4e 6f 74 53 70 69  BACK of doNotSpi
60b0: 6c 6c 20 61 72 65 20 73 65 74 2c 0a 2a 2a 20 20  ll are set,.**  
60c0: 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
60d0: 64 61 74 61 62 61 73 65 20 66 72 6f 6d 20 70 61  database from pa
60e0: 67 65 72 53 74 72 65 73 73 28 29 20 69 73 20 64  gerStress() is d
60f0: 69 73 61 62 6c 65 64 20 61 6c 74 6f 67 65 74 68  isabled altogeth
6100: 65 72 2e 0a 2a 2a 20 20 20 54 68 65 20 53 50 49  er..**   The SPI
6110: 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20  LLFLAG_ROLLBACK 
6120: 63 61 73 65 20 69 73 20 64 6f 6e 65 20 69 6e 20  case is done in 
6130: 61 20 76 65 72 79 20 6f 62 73 63 75 72 65 20 63  a very obscure c
6140: 61 73 65 20 74 68 61 74 0a 2a 2a 20 20 20 63 6f  ase that.**   co
6150: 6d 65 73 20 75 70 20 64 75 72 69 6e 67 20 73 61  mes up during sa
6160: 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
6170: 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20 74   that requires t
6180: 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65  he pcache module
6190: 0a 2a 2a 20 20 20 74 6f 20 61 6c 6c 6f 63 61 74  .**   to allocat
61a0: 65 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20  e a new page to 
61b0: 70 72 65 76 65 6e 74 20 74 68 65 20 6a 6f 75 72  prevent the jour
61c0: 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65  nal file from be
61d0: 69 6e 67 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20  ing written.**  
61e0: 20 77 68 69 6c 65 20 69 74 20 69 73 20 62 65 69   while it is bei
61f0: 6e 67 20 74 72 61 76 65 72 73 65 64 20 62 79 20  ng traversed by 
6200: 63 6f 64 65 20 69 6e 20 70 61 67 65 72 5f 70 6c  code in pager_pl
6210: 61 79 62 61 63 6b 28 29 2e 20 20 54 68 65 20 53  ayback().  The S
6220: 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 0a 2a 2a 20  PILLFLAG_OFF.** 
6230: 20 20 63 61 73 65 20 69 73 20 61 20 75 73 65 72    case is a user
6240: 20 70 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 20   preference..** 
6250: 0a 2a 2a 20 20 20 49 66 20 74 68 65 20 53 50 49  .**   If the SPI
6260: 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 20 62 69  LLFLAG_NOSYNC bi
6270: 74 20 69 73 20 73 65 74 2c 20 77 72 69 74 69 6e  t is set, writin
6280: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
6290: 65 20 66 72 6f 6d 0a 2a 2a 20 20 20 70 61 67 65  e from.**   page
62a0: 72 53 74 72 65 73 73 28 29 20 69 73 20 70 65 72  rStress() is per
62b0: 6d 69 74 74 65 64 2c 20 62 75 74 20 73 79 6e 63  mitted, but sync
62c0: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
62d0: 66 69 6c 65 20 69 73 20 6e 6f 74 2e 0a 2a 2a 20  file is not..** 
62e0: 20 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 73    This flag is s
62f0: 65 74 20 62 79 20 73 71 6c 69 74 65 33 50 61 67  et by sqlite3Pag
6300: 65 72 57 72 69 74 65 28 29 20 77 68 65 6e 20 74  erWrite() when t
6310: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73  he file-system s
6320: 65 63 74 6f 72 2d 73 69 7a 65 0a 2a 2a 20 20 20  ector-size.**   
6330: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
6340: 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
6350: 2d 73 69 7a 65 20 69 6e 20 6f 72 64 65 72 20 74  -size in order t
6360: 6f 20 70 72 65 76 65 6e 74 20 61 20 6a 6f 75 72  o prevent a jour
6370: 6e 61 6c 20 73 79 6e 63 0a 2a 2a 20 20 20 66 72  nal sync.**   fr
6380: 6f 6d 20 68 61 70 70 65 6e 69 6e 67 20 69 6e 20  om happening in 
6390: 62 65 74 77 65 65 6e 20 74 68 65 20 6a 6f 75 72  between the jour
63a0: 6e 61 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20 70  nalling of two p
63b0: 61 67 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65  ages on the same
63c0: 20 73 65 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a 20   sector. .**.** 
63d0: 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a  subjInMemory.**.
63e0: 2a 2a 20 20 20 54 68 69 73 20 69 73 20 61 20 62  **   This is a b
63f0: 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65 2e  oolean variable.
6400: 20 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20 61   If true, then a
6410: 6e 79 20 72 65 71 75 69 72 65 64 20 73 75 62 2d  ny required sub-
6420: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20  journal.**   is 
6430: 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d  opened as an in-
6440: 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66  memory journal f
6450: 69 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20 74  ile. If false, t
6460: 68 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a  hen in-memory.**
6470: 20 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20     sub-journals 
6480: 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f  are only used fo
6490: 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  r in-memory page
64a0: 72 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  r files..**.**  
64b0: 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69   This variable i
64c0: 73 20 75 70 64 61 74 65 64 20 62 79 20 74 68 65  s updated by the
64d0: 20 75 70 70 65 72 20 6c 61 79 65 72 20 65 61 63   upper layer eac
64e0: 68 20 74 69 6d 65 20 61 20 6e 65 77 20 0a 2a 2a  h time a new .**
64f0: 20 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63     write-transac
6500: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2e 0a  tion is opened..
6510: 2a 2a 0a 2a 2a 20 64 62 53 69 7a 65 2c 20 64 62  **.** dbSize, db
6520: 4f 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c 65  OrigSize, dbFile
6530: 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72  Size.**.**   Var
6540: 69 61 62 6c 65 20 64 62 53 69 7a 65 20 69 73 20  iable dbSize is 
6550: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
6560: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
6570: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
6580: 0a 2a 2a 20 20 20 49 74 20 69 73 20 76 61 6c 69  .**   It is vali
6590: 64 20 69 6e 20 50 41 47 45 52 5f 52 45 41 44 45  d in PAGER_READE
65a0: 52 20 61 6e 64 20 68 69 67 68 65 72 20 73 74 61  R and higher sta
65b0: 74 65 73 20 28 61 6c 6c 20 73 74 61 74 65 73 20  tes (all states 
65c0: 65 78 63 65 70 74 20 66 6f 72 0a 2a 2a 20 20 20  except for.**   
65d0: 4f 50 45 4e 20 61 6e 64 20 45 52 52 4f 52 29 2e  OPEN and ERROR).
65e0: 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 53 69 7a 65   .**.**   dbSize
65f0: 20 69 73 20 73 65 74 20 62 61 73 65 64 20 6f 6e   is set based on
6600: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
6610: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
6620: 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a  which may be .**
6630: 20 20 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74     larger than t
6640: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
6650: 61 74 61 62 61 73 65 20 28 74 68 65 20 76 61 6c  atabase (the val
6660: 75 65 20 73 74 6f 72 65 64 20 61 74 20 6f 66 66  ue stored at off
6670: 73 65 74 0a 2a 2a 20 20 20 32 38 20 6f 66 20 74  set.**   28 of t
6680: 68 65 20 64 61 74 61 62 61 73 65 20 68 65 61 64  he database head
6690: 65 72 20 62 79 20 74 68 65 20 62 74 72 65 65 29  er by the btree)
66a0: 2e 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66  . If the size of
66b0: 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20 69   the file.**   i
66c0: 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72  s not an integer
66d0: 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65   multiple of the
66e0: 20 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65 20   page-size, the 
66f0: 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a  value stored in.
6700: 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 72  **   dbSize is r
6710: 6f 75 6e 64 65 64 20 64 6f 77 6e 20 28 69 2e 65  ounded down (i.e
6720: 2e 20 61 20 35 4b 42 20 66 69 6c 65 20 77 69 74  . a 5KB file wit
6730: 68 20 32 4b 20 70 61 67 65 2d 73 69 7a 65 20 68  h 2K page-size h
6740: 61 73 20 64 62 53 69 7a 65 3d 3d 32 29 2e 0a 2a  as dbSize==2)..*
6750: 2a 20 20 20 45 78 63 65 70 74 2c 20 61 6e 79 20  *   Except, any 
6760: 66 69 6c 65 20 74 68 61 74 20 69 73 20 67 72 65  file that is gre
6770: 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65  ater than 0 byte
6780: 73 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e  s in size is con
6790: 73 69 64 65 72 65 64 0a 2a 2a 20 20 20 74 6f 20  sidered.**   to 
67a0: 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  have at least on
67b0: 65 20 70 61 67 65 2e 20 28 69 2e 65 2e 20 61 20  e page. (i.e. a 
67c0: 31 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b  1KB file with 2K
67d0: 20 70 61 67 65 2d 73 69 7a 65 20 6c 65 61 64 73   page-size leads
67e0: 0a 2a 2a 20 20 20 74 6f 20 64 62 53 69 7a 65 3d  .**   to dbSize=
67f0: 3d 31 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75 72  =1)..**.**   Dur
6800: 69 6e 67 20 61 20 77 72 69 74 65 2d 74 72 61 6e  ing a write-tran
6810: 73 61 63 74 69 6f 6e 2c 20 69 66 20 70 61 67 65  saction, if page
6820: 73 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62  s with page-numb
6830: 65 72 73 20 67 72 65 61 74 65 72 20 74 68 61 6e  ers greater than
6840: 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 61 72 65  .**   dbSize are
6850: 20 6d 6f 64 69 66 69 65 64 20 69 6e 20 74 68 65   modified in the
6860: 20 63 61 63 68 65 2c 20 64 62 53 69 7a 65 20 69   cache, dbSize i
6870: 73 20 75 70 64 61 74 65 64 20 61 63 63 6f 72 64  s updated accord
6880: 69 6e 67 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d 69  ingly..**   Simi
6890: 6c 61 72 6c 79 2c 20 69 66 20 74 68 65 20 64 61  larly, if the da
68a0: 74 61 62 61 73 65 20 69 73 20 74 72 75 6e 63 61  tabase is trunca
68b0: 74 65 64 20 75 73 69 6e 67 20 50 61 67 65 72 54  ted using PagerT
68c0: 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 2c 20  runcateImage(), 
68d0: 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20  .**   dbSize is 
68e0: 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  updated..**.**  
68f0: 20 56 61 72 69 61 62 6c 65 73 20 64 62 4f 72 69   Variables dbOri
6900: 67 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c 65  gSize and dbFile
6910: 53 69 7a 65 20 61 72 65 20 76 61 6c 69 64 20 69  Size are valid i
6920: 6e 20 73 74 61 74 65 73 20 0a 2a 2a 20 20 20 50  n states .**   P
6930: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
6940: 45 44 20 61 6e 64 20 68 69 67 68 65 72 2e 20 64  ED and higher. d
6950: 62 4f 72 69 67 53 69 7a 65 20 69 73 20 61 20 63  bOrigSize is a c
6960: 6f 70 79 20 6f 66 20 74 68 65 20 64 62 53 69 7a  opy of the dbSiz
6970: 65 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c 65 20  e.**   variable 
6980: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
6990: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
69a0: 20 49 74 20 69 73 20 75 73 65 64 20 64 75 72 69   It is used duri
69b0: 6e 67 20 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a 20  ng rollback,.** 
69c0: 20 20 61 6e 64 20 74 6f 20 64 65 74 65 72 6d 69    and to determi
69d0: 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ne whether or no
69e0: 74 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20  t pages need to 
69f0: 62 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 65  be journalled be
6a00: 66 6f 72 65 0a 2a 2a 20 20 20 62 65 69 6e 67 20  fore.**   being 
6a10: 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  modified..**.** 
6a20: 20 20 54 68 72 6f 75 67 68 6f 75 74 20 61 20 77    Throughout a w
6a30: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6a40: 2c 20 64 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e  , dbFileSize con
6a50: 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 6f  tains the size o
6a60: 66 0a 2a 2a 20 20 20 74 68 65 20 66 69 6c 65 20  f.**   the file 
6a70: 6f 6e 20 64 69 73 6b 20 69 6e 20 70 61 67 65 73  on disk in pages
6a80: 2e 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 61  . It is set to a
6a90: 20 63 6f 70 79 20 6f 66 20 64 62 53 69 7a 65 20   copy of dbSize 
6aa0: 77 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 77 72  when the.**   wr
6ab0: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
6ac0: 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2c  is first opened,
6ad0: 20 61 6e 64 20 75 70 64 61 74 65 64 20 77 68 65   and updated whe
6ae0: 6e 20 56 46 53 20 63 61 6c 6c 73 20 61 72 65 20  n VFS calls are 
6af0: 6d 61 64 65 0a 2a 2a 20 20 20 74 6f 20 77 72 69  made.**   to wri
6b00: 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 74  te or truncate t
6b10: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
6b20: 20 6f 6e 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a 2a   on disk. .**.**
6b30: 20 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73     The only reas
6b40: 6f 6e 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a  on the dbFileSiz
6b50: 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 72 65  e variable is re
6b60: 71 75 69 72 65 64 20 69 73 20 74 6f 20 73 75 70  quired is to sup
6b70: 70 72 65 73 73 20 0a 2a 2a 20 20 20 75 6e 6e 65  press .**   unne
6b80: 63 65 73 73 61 72 79 20 63 61 6c 6c 73 20 74 6f  cessary calls to
6b90: 20 78 54 72 75 6e 63 61 74 65 28 29 20 61 66 74   xTruncate() aft
6ba0: 65 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20  er committing a 
6bb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 2c  transaction. If,
6bc0: 20 0a 2a 2a 20 20 20 77 68 65 6e 20 61 20 74 72   .**   when a tr
6bd0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
6be0: 6d 69 74 74 65 64 2c 20 74 68 65 20 64 62 46 69  mitted, the dbFi
6bf0: 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  leSize variable 
6c00: 69 6e 64 69 63 61 74 65 73 20 0a 2a 2a 20 20 20  indicates .**   
6c10: 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
6c20: 65 20 66 69 6c 65 20 69 73 20 6c 61 72 67 65 72  e file is larger
6c30: 20 74 68 61 6e 20 74 68 65 20 64 61 74 61 62 61   than the databa
6c40: 73 65 20 69 6d 61 67 65 20 28 50 61 67 65 72 2e  se image (Pager.
6c50: 64 62 53 69 7a 65 29 2c 20 0a 2a 2a 20 20 20 70  dbSize), .**   p
6c60: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20  ager_truncate() 
6c70: 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 20 70  is called. The p
6c80: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20  ager_truncate() 
6c90: 63 61 6c 6c 20 75 73 65 73 20 78 46 69 6c 65 73  call uses xFiles
6ca0: 69 7a 65 28 29 0a 2a 2a 20 20 20 74 6f 20 6d 65  ize().**   to me
6cb0: 61 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61  asure the databa
6cc0: 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2c  se file on disk,
6cd0: 20 61 6e 64 20 74 68 65 6e 20 74 72 75 6e 63 61   and then trunca
6ce0: 74 65 73 20 69 74 20 69 66 20 72 65 71 75 69 72  tes it if requir
6cf0: 65 64 2e 0a 2a 2a 20 20 20 64 62 46 69 6c 65 53  ed..**   dbFileS
6d00: 69 7a 65 20 69 73 20 6e 6f 74 20 75 73 65 64 20  ize is not used 
6d10: 77 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63  when rolling bac
6d20: 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  k a transaction.
6d30: 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a   In this case.**
6d40: 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74     pager_truncat
6d50: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 75 6e  e() is called un
6d60: 63 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 28 77  conditionally (w
6d70: 68 69 63 68 20 6d 65 61 6e 73 20 74 68 65 72 65  hich means there
6d80: 20 6d 61 79 20 62 65 0a 2a 2a 20 20 20 61 20 63   may be.**   a c
6d90: 61 6c 6c 20 74 6f 20 78 46 69 6c 65 73 69 7a 65  all to xFilesize
6da0: 28 29 20 74 68 61 74 20 69 73 20 6e 6f 74 20 73  () that is not s
6db0: 74 72 69 63 74 6c 79 20 72 65 71 75 69 72 65 64  trictly required
6dc0: 29 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73  ). In either cas
6dd0: 65 2c 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74 72  e,.**   pager_tr
6de0: 75 6e 63 61 74 65 28 29 20 6d 61 79 20 63 61 75  uncate() may cau
6df0: 73 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  se the file to b
6e00: 65 63 6f 6d 65 20 73 6d 61 6c 6c 65 72 20 6f 72  ecome smaller or
6e10: 20 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 64   larger..**.** d
6e20: 62 48 69 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a 20  bHintSize.**.** 
6e30: 20 20 54 68 65 20 64 62 48 69 6e 74 53 69 7a 65    The dbHintSize
6e40: 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65   variable is use
6e50: 64 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 6e  d to limit the n
6e60: 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 6d  umber of calls m
6e70: 61 64 65 20 74 6f 0a 2a 2a 20 20 20 74 68 65 20  ade to.**   the 
6e80: 56 46 53 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c  VFS xFileControl
6e90: 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54  (FCNTL_SIZE_HINT
6ea0: 29 20 6d 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a 2a  ) method. .**.**
6eb0: 20 20 20 64 62 48 69 6e 74 53 69 7a 65 20 69 73     dbHintSize is
6ec0: 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20 6f   set to a copy o
6ed0: 66 20 74 68 65 20 64 62 53 69 7a 65 20 76 61 72  f the dbSize var
6ee0: 69 61 62 6c 65 20 77 68 65 6e 20 61 0a 2a 2a 20  iable when a.** 
6ef0: 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74    write-transact
6f00: 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 28 61  ion is opened (a
6f10: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20  t the same time 
6f20: 61 73 20 64 62 46 69 6c 65 53 69 7a 65 20 61 6e  as dbFileSize an
6f30: 64 0a 2a 2a 20 20 20 64 62 4f 72 69 67 53 69 7a  d.**   dbOrigSiz
6f40: 65 29 2e 20 49 66 20 74 68 65 20 78 46 69 6c 65  e). If the xFile
6f50: 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f 53 49  Control(FCNTL_SI
6f60: 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f 64 20  ZE_HINT) method 
6f70: 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20  is called,.**   
6f80: 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20 69 6e  dbHintSize is in
6f90: 63 72 65 61 73 65 64 20 74 6f 20 74 68 65 20 6e  creased to the n
6fa0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
6fb0: 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20 74  hat correspond t
6fc0: 6f 20 74 68 65 0a 2a 2a 20 20 20 73 69 7a 65 2d  o the.**   size-
6fd0: 68 69 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74  hint passed to t
6fe0: 68 65 20 6d 65 74 68 6f 64 20 63 61 6c 6c 2e 20  he method call. 
6ff0: 53 65 65 20 70 61 67 65 72 5f 77 72 69 74 65 5f  See pager_write_
7000: 70 61 67 65 6c 69 73 74 28 29 20 66 6f 72 20 0a  pagelist() for .
7010: 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a 2a  **   details..**
7020: 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a  .** errCode.**.*
7030: 2a 20 20 20 54 68 65 20 50 61 67 65 72 2e 65 72  *   The Pager.er
7040: 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 20 69  rCode variable i
7050: 73 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65 64  s only ever used
7060: 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20   in PAGER_ERROR 
7070: 73 74 61 74 65 2e 20 49 74 0a 2a 2a 20 20 20 69  state. It.**   i
7080: 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 69 6e  s set to zero in
7090: 20 61 6c 6c 20 6f 74 68 65 72 20 73 74 61 74 65   all other state
70a0: 73 2e 20 49 6e 20 50 41 47 45 52 5f 45 52 52 4f  s. In PAGER_ERRO
70b0: 52 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65  R state, Pager.e
70c0: 72 72 43 6f 64 65 20 0a 2a 2a 20 20 20 69 73 20  rrCode .**   is 
70d0: 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 53 51  always set to SQ
70e0: 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54  LITE_FULL, SQLIT
70f0: 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f  E_IOERR or one o
7100: 66 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 45  f the SQLITE_IOE
7110: 52 52 5f 58 58 58 20 0a 2a 2a 20 20 20 73 75 62  RR_XXX .**   sub
7120: 2d 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 72 75 63  -codes..*/.struc
7130: 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69  t Pager {.  sqli
7140: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
7150: 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75          /* OS fu
7160: 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66  nctions to use f
7170: 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78  or IO */.  u8 ex
7180: 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20  clusiveMode;    
7190: 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61         /* Boolea
71a0: 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69  n. True if locki
71b0: 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49  ng_mode==EXCLUSI
71c0: 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  VE */.  u8 journ
71d0: 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  alMode;         
71e0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
71f0: 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  e PAGER_JOURNALM
7200: 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a  ODE_* values */.
7210: 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b    u8 useJournal;
7220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7230: 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20   Use a rollback 
7240: 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20  journal on this 
7250: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53  file */.  u8 noS
7260: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
7270: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
7280: 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
7290: 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38   if true */.  u8
72a0: 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20   fullSync;      
72b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
72c0: 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74  extra syncs of t
72d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  he journal for r
72e0: 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75  obustness */.  u
72f0: 38 20 65 78 74 72 61 53 79 6e 63 3b 20 20 20 20  8 extraSync;    
7300: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 79             /* sy
7310: 6e 63 20 64 69 72 65 63 74 6f 72 79 20 61 66 74  nc directory aft
7320: 65 72 20 6a 6f 75 72 6e 61 6c 20 64 65 6c 65 74  er journal delet
7330: 65 20 2a 2f 0a 20 20 75 38 20 63 6b 70 74 53 79  e */.  u8 ckptSy
7340: 6e 63 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  ncFlags;        
7350: 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41     /* SYNC_NORMA
7360: 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 66  L or SYNC_FULL f
7370: 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f  or checkpoint */
7380: 0a 20 20 75 38 20 77 61 6c 53 79 6e 63 46 6c 61  .  u8 walSyncFla
7390: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  gs;            /
73a0: 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72  * SYNC_NORMAL or
73b0: 20 53 59 4e 43 5f 46 55 4c 4c 20 66 6f 72 20 77   SYNC_FULL for w
73c0: 61 6c 20 77 72 69 74 65 73 20 2a 2f 0a 20 20 75  al writes */.  u
73d0: 38 20 73 79 6e 63 46 6c 61 67 73 3b 20 20 20 20  8 syncFlags;    
73e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 59             /* SY
73f0: 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e  NC_NORMAL or SYN
7400: 43 5f 46 55 4c 4c 20 6f 74 68 65 72 77 69 73 65  C_FULL otherwise
7410: 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69 6c   */.  u8 tempFil
7420: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
7430: 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69    /* zFilename i
7440: 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72  s a temporary or
7450: 20 69 6d 6d 75 74 61 62 6c 65 20 66 69 6c 65 20   immutable file 
7460: 2a 2f 0a 20 20 75 38 20 6e 6f 4c 6f 63 6b 3b 20  */.  u8 noLock; 
7470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7480: 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 63 6b 20   /* Do not lock 
7490: 28 65 78 63 65 70 74 20 69 6e 20 57 41 4c 20 6d  (except in WAL m
74a0: 6f 64 65 29 20 2a 2f 0a 20 20 75 38 20 72 65 61  ode) */.  u8 rea
74b0: 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  dOnly;          
74c0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
74d0: 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  r a read-only da
74e0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6d  tabase */.  u8 m
74f0: 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  emDb;           
7500: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7510: 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66  to inhibit all f
7520: 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20 2f 2a  ile I/O */..  /*
7530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7550: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7560: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7570: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a 2a 20 54  *********.  ** T
7580: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
7590: 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68 6f 73  ck contains thos
75a0: 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20  e class members 
75b0: 74 68 61 74 20 63 68 61 6e 67 65 20 64 75 72 69  that change duri
75c0: 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20  ng.  ** routine 
75d0: 6f 70 65 72 61 74 69 6f 6e 2e 20 20 43 6c 61 73  operation.  Clas
75e0: 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20 69 6e  s members not in
75f0: 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72 65 20   this block are 
7600: 65 69 74 68 65 72 20 66 69 78 65 64 0a 20 20 2a  either fixed.  *
7610: 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  * when the pager
7620: 20 69 73 20 66 69 72 73 74 20 63 72 65 61 74 65   is first create
7630: 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79 20 63  d or else only c
7640: 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65 72 65  hange when there
7650: 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67 6e 69   is a.  ** signi
7660: 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68 61 6e  ficant mode chan
7670: 67 65 20 28 73 75 63 68 20 61 73 20 63 68 61 6e  ge (such as chan
7680: 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f 73 69  ging the page_si
7690: 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  ze, locking_mode
76a0: 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20 6a 6f  ,.  ** or the jo
76b0: 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20 46 72  urnal_mode).  Fr
76c0: 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65 77 2c  om another view,
76d0: 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d 65 6d   these class mem
76e0: 62 65 72 73 20 64 65 73 63 72 69 62 65 0a 20 20  bers describe.  
76f0: 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22 20 6f  ** the "state" o
7700: 66 20 74 68 65 20 70 61 67 65 72 2c 20 77 68 69  f the pager, whi
7710: 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73 20 6d  le other class m
7720: 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 20  embers describe 
7730: 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66 69 67  the.  ** "config
7740: 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68 65 20  uration" of the 
7750: 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 75 38  pager..  */.  u8
7760: 20 65 53 74 61 74 65 3b 20 20 20 20 20 20 20 20   eState;        
7770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
7780: 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e 2c 20  er state (OPEN, 
7790: 52 45 41 44 45 52 2c 20 57 52 49 54 45 52 5f 4c  READER, WRITER_L
77a0: 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20 75 38  OCKED..) */.  u8
77b0: 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20   eLock;         
77c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
77d0: 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  rent lock held o
77e0: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
77f0: 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43 6f  */.  u8 changeCo
7800: 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20 20  untDone;        
7810: 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69 6e   /* Set after in
7820: 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63  crementing the c
7830: 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a 2f  hange-counter */
7840: 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b  .  u8 setMaster;
7850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7860: 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20  * True if a m-j 
7870: 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72  name has been wr
7880: 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f  itten to jrnl */
7890: 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69 6c 6c  .  u8 doNotSpill
78a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
78b0: 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74  * Do not spill t
78c0: 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 6e 6f  he cache when no
78d0: 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38 20 73  n-zero */.  u8 s
78e0: 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20  ubjInMemory;    
78f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7900: 74 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79  to use in-memory
7910: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f   sub-journals */
7920: 0a 20 20 75 38 20 62 55 73 65 46 65 74 63 68 3b  .  u8 bUseFetch;
7930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7940: 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 78 46  * True to use xF
7950: 65 74 63 68 28 29 20 2a 2f 0a 20 20 75 38 20 68  etch() */.  u8 h
7960: 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b  asHeldSharedLock
7970: 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ;       /* True 
7980: 69 66 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  if a shared lock
7990: 20 68 61 73 20 65 76 65 72 20 62 65 65 6e 20 68   has ever been h
79a0: 65 6c 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  eld */.  Pgno db
79b0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
79c0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
79d0: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
79e0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50 67 6e  atabase */.  Pgn
79f0: 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20 20 20  o dbOrigSize;   
7a00: 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69           /* dbSi
7a10: 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63 75  ze before the cu
7a20: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
7a30: 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 46 69  n */.  Pgno dbFi
7a40: 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  leSize;         
7a50: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7a60: 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
7a70: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
7a80: 50 67 6e 6f 20 64 62 48 69 6e 74 53 69 7a 65 3b  Pgno dbHintSize;
7a90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
7aa0: 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f 20 46  alue passed to F
7ab0: 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 63  CNTL_SIZE_HINT c
7ac0: 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72  all */.  int err
7ad0: 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Code;           
7ae0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73       /* One of s
7af0: 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20  everal kinds of 
7b00: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20  errors */.  int 
7b10: 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
7b20: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 73          /* Pages
7b30: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69 6e 63   journalled sinc
7b40: 65 20 6c 61 73 74 20 6a 2d 68 65 61 64 65 72 20  e last j-header 
7b50: 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75 33 32  written */.  u32
7b60: 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20   cksumInit;     
7b70: 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73           /* Quas
7b80: 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61  i-random value a
7b90: 64 64 65 64 20 74 6f 20 65 76 65 72 79 20 63 68  dded to every ch
7ba0: 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33 32 20  ecksum */.  u32 
7bb0: 6e 53 75 62 52 65 63 3b 20 20 20 20 20 20 20 20  nSubRec;        
7bc0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7bd0: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 77 72 69  r of records wri
7be0: 74 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f 75 72  tten to sub-jour
7bf0: 6e 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  nal */.  Bitvec 
7c00: 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  *pInJournal;    
7c10: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20       /* One bit 
7c20: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
7c30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
7c40: 6c 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  le */.#ifndef SQ
7c50: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52  LITE_OMIT_CONCUR
7c60: 52 45 4e 54 0a 20 20 42 69 74 76 65 63 20 2a 70  RENT.  Bitvec *p
7c70: 41 6c 6c 52 65 61 64 3b 20 20 20 20 20 20 20 20  AllRead;        
7c80: 20 20 20 2f 2a 20 50 61 67 65 73 20 72 65 61 64     /* Pages read
7c90: 20 77 69 74 68 69 6e 20 63 75 72 72 65 6e 74 20   within current 
7ca0: 43 4f 4e 43 55 52 52 45 4e 54 20 74 72 61 6e 73  CONCURRENT trans
7cb0: 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 73 71  . */.#endif.  sq
7cc0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 20  lite3_file *fd; 
7cd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
7ce0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
7cf0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73   database */.  s
7d00: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64  qlite3_file *jfd
7d10: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
7d20: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
7d30: 72 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a  r main journal *
7d40: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
7d50: 20 2a 73 6a 66 64 3b 20 20 20 20 20 20 20 20 20   *sjfd;         
7d60: 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
7d70: 6f 72 20 66 6f 72 20 73 75 62 2d 6a 6f 75 72 6e  or for sub-journ
7d80: 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  al */.  i64 jour
7d90: 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20 20 20 20  nalOff;         
7da0: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 77      /* Current w
7db0: 72 69 74 65 20 6f 66 66 73 65 74 20 69 6e 20 74  rite offset in t
7dc0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
7dd0: 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  */.  i64 journal
7de0: 48 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Hdr;            
7df0: 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20   /* Byte offset 
7e00: 74 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f 75 72  to previous jour
7e10: 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  nal header */.  
7e20: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a  sqlite3_backup *
7e30: 70 42 61 63 6b 75 70 3b 20 20 20 20 2f 2a 20 50  pBackup;    /* P
7e40: 6f 69 6e 74 65 72 20 74 6f 20 6c 69 73 74 20 6f  ointer to list o
7e50: 66 20 6f 6e 67 6f 69 6e 67 20 62 61 63 6b 75 70  f ongoing backup
7e60: 20 70 72 6f 63 65 73 73 65 73 20 2a 2f 0a 20 20   processes */.  
7e70: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
7e80: 61 53 61 76 65 70 6f 69 6e 74 3b 20 2f 2a 20 41  aSavepoint; /* A
7e90: 72 72 61 79 20 6f 66 20 61 63 74 69 76 65 20 73  rray of active s
7ea0: 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a 20 20 69  avepoints */.  i
7eb0: 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20  nt nSavepoint;  
7ec0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
7ed0: 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
7ee0: 20 69 6e 20 61 53 61 76 65 70 6f 69 6e 74 5b 5d   in aSavepoint[]
7ef0: 20 2a 2f 0a 20 20 75 33 32 20 69 44 61 74 61 56   */.  u32 iDataV
7f00: 65 72 73 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  ersion;         
7f10: 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 77 68 65    /* Changes whe
7f20: 6e 65 76 65 72 20 64 61 74 61 62 61 73 65 20 63  never database c
7f30: 6f 6e 74 65 6e 74 20 63 68 61 6e 67 65 73 20 2a  ontent changes *
7f40: 2f 0a 20 20 63 68 61 72 20 64 62 46 69 6c 65 56  /.  char dbFileV
7f50: 65 72 73 5b 31 36 5d 3b 20 20 20 20 20 20 20 20  ers[16];        
7f60: 2f 2a 20 43 68 61 6e 67 65 73 20 77 68 65 6e 65  /* Changes whene
7f70: 76 65 72 20 64 61 74 61 62 61 73 65 20 66 69 6c  ver database fil
7f80: 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 0a 20 20  e changes */..  
7f90: 69 6e 74 20 6e 4d 6d 61 70 4f 75 74 3b 20 20 20  int nMmapOut;   
7fa0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
7fb0: 75 6d 62 65 72 20 6f 66 20 6d 6d 61 70 20 70 61  umber of mmap pa
7fc0: 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 75  ges currently ou
7fd0: 74 73 74 61 6e 64 69 6e 67 20 2a 2f 0a 20 20 73  tstanding */.  s
7fe0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d  qlite3_int64 szM
7ff0: 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 44 65  map;       /* De
8000: 73 69 72 65 64 20 6d 61 78 69 6d 75 6d 20 6d 6d  sired maximum mm
8010: 61 70 20 73 69 7a 65 20 2a 2f 0a 20 20 50 67 48  ap size */.  PgH
8020: 64 72 20 2a 70 4d 6d 61 70 46 72 65 65 6c 69 73  dr *pMmapFreelis
8030: 74 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  t;       /* List
8040: 20 6f 66 20 66 72 65 65 20 6d 6d 61 70 20 70 61   of free mmap pa
8050: 67 65 20 68 65 61 64 65 72 73 20 28 70 44 69 72  ge headers (pDir
8060: 74 79 29 20 2a 2f 0a 20 20 2f 2a 0a 20 20 2a 2a  ty) */.  /*.  **
8070: 20 45 6e 64 20 6f 66 20 74 68 65 20 72 6f 75 74   End of the rout
8080: 69 6e 65 6c 79 2d 63 68 61 6e 67 69 6e 67 20 63  inely-changing c
8090: 6c 61 73 73 20 6d 65 6d 62 65 72 73 0a 20 20 2a  lass members.  *
80a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
80b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
80c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
80d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
80e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 20 20 75  **********/..  u
80f0: 31 36 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20  16 nExtra;      
8100: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
8110: 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  d this many byte
8120: 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d  s to each in-mem
8130: 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 31  ory page */.  i1
8140: 36 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20  6 nReserve;     
8150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8160: 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79  ber of unused by
8170: 74 65 73 20 61 74 20 65 6e 64 20 6f 66 20 65 61  tes at end of ea
8180: 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 33 32  ch page */.  u32
8190: 20 76 66 73 46 6c 61 67 73 3b 20 20 20 20 20 20   vfsFlags;      
81a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
81b0: 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 76 66  s for sqlite3_vf
81c0: 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 75  s.xOpen() */.  u
81d0: 33 32 20 73 65 63 74 6f 72 53 69 7a 65 3b 20 20  32 sectorSize;  
81e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73             /* As
81f0: 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a  sumed sector siz
8200: 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  e during rollbac
8210: 6b 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53  k */.  int pageS
8220: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
8230: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8240: 62 79 74 65 73 20 69 6e 20 61 20 70 61 67 65 20  bytes in a page 
8250: 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 6e 6f  */.  Pgno mxPgno
8260: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8270: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f   /* Maximum allo
8280: 77 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20  wed size of the 
8290: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 36  database */.  i6
82a0: 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  4 journalSizeLim
82b0: 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  it;       /* Siz
82c0: 65 20 6c 69 6d 69 74 20 66 6f 72 20 70 65 72 73  e limit for pers
82d0: 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66  istent journal f
82e0: 69 6c 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  iles */.  char *
82f0: 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  zFilename;      
8300: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
8310: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
8320: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a  le */.  char *zJ
8330: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
8340: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
8350: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
8360: 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79  */.  int (*xBusy
8370: 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 2a 29 3b  Handler)(void*);
8380: 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20   /* Function to 
8390: 63 61 6c 6c 20 77 68 65 6e 20 62 75 73 79 20 2a  call when busy *
83a0: 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48  /.  void *pBusyH
83b0: 61 6e 64 6c 65 72 41 72 67 3b 20 20 20 20 20 20  andlerArg;      
83c0: 2f 2a 20 43 6f 6e 74 65 78 74 20 61 72 67 75 6d  /* Context argum
83d0: 65 6e 74 20 66 6f 72 20 78 42 75 73 79 48 61 6e  ent for xBusyHan
83e0: 64 6c 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61 53  dler */.  int aS
83f0: 74 61 74 5b 33 5d 3b 20 20 20 20 20 20 20 20 20  tat[3];         
8400: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 63        /* Total c
8410: 61 63 68 65 20 68 69 74 73 2c 20 6d 69 73 73 65  ache hits, misse
8420: 73 20 61 6e 64 20 77 72 69 74 65 73 20 2a 2f 0a  s and writes */.
8430: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
8440: 53 54 0a 20 20 69 6e 74 20 6e 52 65 61 64 3b 20  ST.  int nRead; 
8450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8460: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 70 61 67   /* Database pag
8470: 65 73 20 72 65 61 64 20 2a 2f 0a 23 65 6e 64 69  es read */.#endi
8480: 66 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e  f.  void (*xRein
8490: 69 74 65 72 29 28 44 62 50 61 67 65 2a 29 3b 20  iter)(DbPage*); 
84a0: 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75  /* Call this rou
84b0: 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61 64  tine when reload
84c0: 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23 69 66  ing pages */.#if
84d0: 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
84e0: 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a 78  ODEC.  void *(*x
84f0: 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69  Codec)(void*,voi
8500: 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a  d*,Pgno,int); /*
8510: 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f   Routine for en/
8520: 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f  decoding data */
8530: 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63  .  void (*xCodec
8540: 53 69 7a 65 43 68 6e 67 29 28 76 6f 69 64 2a 2c  SizeChng)(void*,
8550: 69 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e 6f 74  int,int); /* Not
8560: 69 66 79 20 6f 66 20 70 61 67 65 20 73 69 7a 65  ify of page size
8570: 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 76 6f   changes */.  vo
8580: 69 64 20 28 2a 78 43 6f 64 65 63 46 72 65 65 29  id (*xCodecFree)
8590: 28 76 6f 69 64 2a 29 3b 20 20 20 20 20 20 20 20  (void*);        
85a0: 20 20 20 20 20 2f 2a 20 44 65 73 74 72 75 63 74       /* Destruct
85b0: 6f 72 20 66 6f 72 20 74 68 65 20 63 6f 64 65 63  or for the codec
85c0: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64   */.  void *pCod
85d0: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
85e0: 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d    /* First argum
85f0: 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 2e 2e 2e  ent to xCodec...
8600: 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 65 6e 64   methods */.#end
8610: 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d 70 53  if.  char *pTmpS
8620: 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  pace;           
8630: 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69   /* Pager.pageSi
8640: 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  ze bytes of spac
8650: 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20 2a 2f  e for tmp use */
8660: 0a 20 20 50 43 61 63 68 65 20 2a 70 50 43 61 63  .  PCache *pPCac
8670: 68 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  he;            /
8680: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67  * Pointer to pag
8690: 65 20 63 61 63 68 65 20 6f 62 6a 65 63 74 20 2a  e cache object *
86a0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
86b0: 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 57 61 6c 20  _OMIT_WAL.  Wal 
86c0: 2a 70 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20  *pWal;          
86d0: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
86e0: 2d 61 68 65 61 64 20 6c 6f 67 20 75 73 65 64 20  -ahead log used 
86f0: 62 79 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  by "journal_mode
8700: 3d 77 61 6c 22 20 2a 2f 0a 20 20 63 68 61 72 20  =wal" */.  char 
8710: 2a 7a 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20  *zWal;          
8720: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 6e         /* File n
8730: 61 6d 65 20 66 6f 72 20 77 72 69 74 65 2d 61 68  ame for write-ah
8740: 65 61 64 20 6c 6f 67 20 2a 2f 0a 23 65 6e 64 69  ead log */.#endi
8750: 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 65  f.};../*.** Inde
8760: 78 65 73 20 66 6f 72 20 75 73 65 20 77 69 74 68  xes for use with
8770: 20 50 61 67 65 72 2e 61 53 74 61 74 5b 5d 2e 20   Pager.aStat[]. 
8780: 54 68 65 20 50 61 67 65 72 2e 61 53 74 61 74 5b  The Pager.aStat[
8790: 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73  ] array contains
87a0: 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 73 20 61  .** the values a
87b0: 63 63 65 73 73 65 64 20 62 79 20 70 61 73 73 69  ccessed by passi
87c0: 6e 67 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54  ng SQLITE_DBSTAT
87d0: 55 53 5f 43 41 43 48 45 5f 48 49 54 2c 20 43 41  US_CACHE_HIT, CA
87e0: 43 48 45 5f 4d 49 53 53 20 0a 2a 2a 20 6f 72 20  CHE_MISS .** or 
87f0: 43 41 43 48 45 5f 57 52 49 54 45 20 74 6f 20 73  CACHE_WRITE to s
8800: 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73  qlite3_db_status
8810: 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  ()..*/.#define P
8820: 41 47 45 52 5f 53 54 41 54 5f 48 49 54 20 20 20  AGER_STAT_HIT   
8830: 30 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  0.#define PAGER_
8840: 53 54 41 54 5f 4d 49 53 53 20 20 31 0a 23 64 65  STAT_MISS  1.#de
8850: 66 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f  fine PAGER_STAT_
8860: 57 52 49 54 45 20 32 0a 0a 2f 2a 0a 2a 2a 20 54  WRITE 2../*.** T
8870: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f  he following glo
8880: 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20 68 6f  bal variables ho
8890: 6c 64 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64  ld counters used
88a0: 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20   for.** testing 
88b0: 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20  purposes only.  
88c0: 54 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20  These variables 
88d0: 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a  do not exist in.
88e0: 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67  ** a non-testing
88f0: 20 62 75 69 6c 64 2e 20 20 54 68 65 73 65 20 76   build.  These v
8900: 61 72 69 61 62 6c 65 73 20 61 72 65 20 6e 6f 74  ariables are not
8910: 20 74 68 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f   thread-safe..*/
8920: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
8930: 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
8940: 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75  pager_readdb_cou
8950: 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75  nt = 0;    /* Nu
8960: 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67  mber of full pag
8970: 65 73 20 72 65 61 64 20 66 72 6f 6d 20 44 42 20  es read from DB 
8980: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  */.int sqlite3_p
8990: 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75  ager_writedb_cou
89a0: 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d  nt = 0;   /* Num
89b0: 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65  ber of full page
89c0: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 44 42 20  s written to DB 
89d0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  */.int sqlite3_p
89e0: 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e  ager_writej_coun
89f0: 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d  t = 0;    /* Num
8a00: 62 65 72 20 6f 66 20 70 61 67 65 73 20 77 72 69  ber of pages wri
8a10: 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20  tten to journal 
8a20: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45  */.# define PAGE
8a30: 52 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b 0a 23  R_INCR(v)  v++.#
8a40: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 50 41  else.# define PA
8a50: 47 45 52 5f 49 4e 43 52 28 76 29 0a 23 65 6e 64  GER_INCR(v).#end
8a60: 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72  if..../*.** Jour
8a70: 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20  nal files begin 
8a80: 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69  with the followi
8a90: 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e  ng magic string.
8aa0: 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61    The data.** wa
8ab0: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
8ac0: 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74  /dev/random.  It
8ad0: 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73   is used only as
8ae0: 20 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e   a sanity check.
8af0: 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72  .**.** Since ver
8b00: 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20  sion 2.8.0, the 
8b10: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63  journal format c
8b20: 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e  ontains addition
8b30: 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65  al sanity.** che
8b40: 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  cking informatio
8b50: 6e 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65 72  n.  If the power
8b60: 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65   fails while the
8b70: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e   journal is bein
8b80: 67 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65  g.** written, se
8b90: 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67  mi-random garbag
8ba0: 65 20 64 61 74 61 20 6d 69 67 68 74 20 61 70 70  e data might app
8bb0: 65 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ear in the journ
8bc0: 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72  al.** file after
8bd0: 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72   power is restor
8be0: 65 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d  ed.  If an attem
8bf0: 70 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a  pt is then made.
8c00: 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a  ** to roll the j
8c10: 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65  ournal back, the
8c20: 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20   database could 
8c30: 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54  be corrupted.  T
8c40: 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a  he additional.**
8c50: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
8c60: 20 64 61 74 61 20 69 73 20 61 6e 20 61 74 74 65   data is an atte
8c70: 6d 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20  mpt to discover 
8c80: 74 68 65 20 67 61 72 62 61 67 65 20 69 6e 20 74  the garbage in t
8c90: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e  he.** journal an
8ca0: 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a  d ignore it..**.
8cb0: 2a 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63 68  ** The sanity ch
8cc0: 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  ecking informati
8cd0: 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a  on for the new j
8ce0: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f  ournal format co
8cf0: 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33  nsists.** of a 3
8d00: 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f  2-bit checksum o
8d10: 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 64  n each page of d
8d20: 61 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73  ata.  The checks
8d30: 75 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a  um covers both.*
8d40: 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * the page numbe
8d50: 72 20 61 6e 64 20 74 68 65 20 70 50 61 67 65 72  r and the pPager
8d60: 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
8d70: 20 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68 65   of data for the
8d80: 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63   page..** This c
8d90: 6b 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69  ksum is initiali
8da0: 7a 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20  zed to a 32-bit 
8db0: 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61  random value tha
8dc0: 74 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65  t appears in the
8dd0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
8de0: 20 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65   right after the
8df0: 20 68 65 61 64 65 72 2e 20 20 54 68 65 20 72 61   header.  The ra
8e00: 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72  ndom initializer
8e10: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a   is important,.*
8e20: 2a 20 62 65 63 61 75 73 65 20 67 61 72 62 61 67  * because garbag
8e30: 65 20 64 61 74 61 20 74 68 61 74 20 61 70 70 65  e data that appe
8e40: 61 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ars at the end o
8e50: 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c  f a journal is l
8e60: 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68  ikely.** data th
8e70: 61 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f  at was once in o
8e80: 74 68 65 72 20 66 69 6c 65 73 20 74 68 61 74 20  ther files that 
8e90: 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65  have now been de
8ea0: 6c 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a  leted.  If the.*
8eb0: 2a 20 67 61 72 62 61 67 65 20 64 61 74 61 20 63  * garbage data c
8ec0: 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f  ame from an obso
8ed0: 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  lete journal fil
8ee0: 65 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73  e, the checksums
8ef0: 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72   might.** be cor
8f00: 72 65 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e  rect.  But by in
8f10: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63  itializing the c
8f20: 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f  hecksum to rando
8f30: 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a  m value which.**
8f40: 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f   is different fo
8f50: 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c  r every journal,
8f60: 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61   we minimize tha
8f70: 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69  t risk..*/.stati
8f80: 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
8f90: 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61   char aJournalMa
8fa0: 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39  gic[] = {.  0xd9
8fb0: 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78  , 0xd5, 0x05, 0x
8fc0: 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20  f9, 0x20, 0xa1, 
8fd0: 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a  0x63, 0xd7,.};..
8fe0: 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f  /*.** The size o
8ff0: 66 20 74 68 65 20 6f 66 20 65 61 63 68 20 70 61  f the of each pa
9000: 67 65 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65  ge record in the
9010: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 67 69 76 65   journal is give
9020: 6e 20 62 79 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c  n by.** the foll
9030: 6f 77 69 6e 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a  owing macro..*/.
9040: 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f  #define JOURNAL_
9050: 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28  PG_SZ(pPager)  (
9060: 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
9070: 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54  e) + 8)../*.** T
9080: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
9090: 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  r size for this 
90a0: 70 61 67 65 72 2e 20 54 68 69 73 20 69 73 20 75  pager. This is u
90b0: 73 75 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20  sually the same 
90c0: 0a 2a 2a 20 73 69 7a 65 20 61 73 20 61 20 73 69  .** size as a si
90d0: 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72  ngle disk sector
90e0: 2e 20 53 65 65 20 61 6c 73 6f 20 73 65 74 53 65  . See also setSe
90f0: 63 74 6f 72 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23  ctorSize()..*/.#
9100: 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48  define JOURNAL_H
9110: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 28 70  DR_SZ(pPager) (p
9120: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
9130: 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61  e)../*.** The ma
9140: 63 72 6f 20 4d 45 4d 44 42 20 69 73 20 74 72 75  cro MEMDB is tru
9150: 65 20 69 66 20 77 65 20 61 72 65 20 64 65 61 6c  e if we are deal
9160: 69 6e 67 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d  ing with an in-m
9170: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a  emory database..
9180: 2a 2a 20 57 65 20 64 6f 20 74 68 69 73 20 61 73  ** We do this as
9190: 20 61 20 6d 61 63 72 6f 20 73 6f 20 74 68 61 74   a macro so that
91a0: 20 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4f   if the SQLITE_O
91b0: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63  MIT_MEMORYDB mac
91c0: 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68  ro is set,.** th
91d0: 65 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42  e value of MEMDB
91e0: 20 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74   will be a const
91f0: 61 6e 74 20 61 6e 64 20 74 68 65 20 63 6f 6d 70  ant and the comp
9200: 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69  iler will optimi
9210: 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74  ze.** out code t
9220: 68 61 74 20 77 6f 75 6c 64 20 6e 65 76 65 72 20  hat would never 
9230: 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64  execute..*/.#ifd
9240: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
9250: 45 4d 4f 52 59 44 42 0a 23 20 64 65 66 69 6e 65  EMORYDB.# define
9260: 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23   MEMDB 0.#else.#
9270: 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 70 50   define MEMDB pP
9280: 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64  ager->memDb.#end
9290: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61  if../*.** The ma
92a0: 63 72 6f 20 55 53 45 46 45 54 43 48 20 69 73 20  cro USEFETCH is 
92b0: 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20 61  true if we are a
92c0: 6c 6c 6f 77 65 64 20 74 6f 20 75 73 65 20 74 68  llowed to use th
92d0: 65 20 78 46 65 74 63 68 20 61 6e 64 20 78 55 6e  e xFetch and xUn
92e0: 66 65 74 63 68 0a 2a 2a 20 69 6e 74 65 72 66 61  fetch.** interfa
92f0: 63 65 73 20 74 6f 20 61 63 63 65 73 73 20 74 68  ces to access th
9300: 65 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67  e database using
9310: 20 6d 65 6d 6f 72 79 2d 6d 61 70 70 65 64 20 49   memory-mapped I
9320: 2f 4f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  /O..*/.#if SQLIT
9330: 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
9340: 30 0a 23 20 64 65 66 69 6e 65 20 55 53 45 46 45  0.# define USEFE
9350: 54 43 48 28 78 29 20 28 28 78 29 2d 3e 62 55 73  TCH(x) ((x)->bUs
9360: 65 46 65 74 63 68 29 0a 23 65 6c 73 65 0a 23 20  eFetch).#else.# 
9370: 64 65 66 69 6e 65 20 55 53 45 46 45 54 43 48 28  define USEFETCH(
9380: 78 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  x) 0.#endif../*.
9390: 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6c  ** The maximum l
93a0: 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72  egal page number
93b0: 20 69 73 20 28 32 5e 33 31 20 2d 20 31 29 2e 0a   is (2^31 - 1)..
93c0: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
93d0: 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34 37 34 38  _MAX_PGNO 214748
93e0: 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  3647../*.** The 
93f0: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
9400: 20 6d 61 63 72 6f 20 69 73 20 61 20 66 69 6c 65   macro is a file
9410: 20 64 65 73 63 72 69 70 74 6f 72 20 28 74 79 70   descriptor (typ
9420: 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  e sqlite3_file*)
9430: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66  ..** Return 0 if
9440: 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c   it is not open,
9450: 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 28 62 75   or non-zero (bu
9460: 74 20 6e 6f 74 20 31 29 20 69 66 20 69 74 20 69  t not 1) if it i
9470: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  s..**.** This is
9480: 20 73 6f 20 74 68 61 74 20 65 78 70 72 65 73 73   so that express
9490: 69 6f 6e 73 20 63 61 6e 20 62 65 20 77 72 69 74  ions can be writ
94a0: 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ten as:.**.**   
94b0: 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
94c0: 72 2d 3e 6a 66 64 29 20 29 7b 20 2e 2e 2e 0a 2a  r->jfd) ){ ....*
94d0: 2a 0a 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66 0a  *.** instead of.
94e0: 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 70 50 61 67  **.**   if( pPag
94f0: 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64  er->jfd->pMethod
9500: 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23 64 65 66  s ){ ....*/.#def
9510: 69 6e 65 20 69 73 4f 70 65 6e 28 70 46 64 29 20  ine isOpen(pFd) 
9520: 28 28 70 46 64 29 2d 3e 70 4d 65 74 68 6f 64 73  ((pFd)->pMethods
9530: 21 3d 30 29 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  !=0)../*.** Retu
9540: 72 6e 20 74 72 75 65 20 69 66 20 74 68 69 73 20  rn true if this 
9550: 70 61 67 65 72 20 75 73 65 73 20 61 20 77 72 69  pager uses a wri
9560: 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 69 6e 73  te-ahead log ins
9570: 74 65 61 64 20 6f 66 20 74 68 65 20 75 73 75 61  tead of the usua
9580: 6c 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  l.** rollback jo
9590: 75 72 6e 61 6c 2e 20 4f 74 68 65 72 77 69 73 65  urnal. Otherwise
95a0: 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64   false..*/.#ifnd
95b0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
95c0: 41 4c 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  AL.static int pa
95d0: 67 65 72 55 73 65 57 61 6c 28 50 61 67 65 72 20  gerUseWal(Pager 
95e0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
95f0: 72 6e 20 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  rn (pPager->pWal
9600: 21 3d 30 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  !=0);.}.#else.# 
9610: 64 65 66 69 6e 65 20 70 61 67 65 72 55 73 65 57  define pagerUseW
9620: 61 6c 28 78 29 20 30 0a 23 20 64 65 66 69 6e 65  al(x) 0.# define
9630: 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61   pagerRollbackWa
9640: 6c 28 78 29 20 30 0a 23 20 64 65 66 69 6e 65 20  l(x) 0.# define 
9650: 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28 76  pagerWalFrames(v
9660: 2c 77 2c 78 2c 79 29 20 30 0a 23 20 64 65 66 69  ,w,x,y) 0.# defi
9670: 6e 65 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49  ne pagerOpenWalI
9680: 66 50 72 65 73 65 6e 74 28 7a 29 20 53 51 4c 49  fPresent(z) SQLI
9690: 54 45 5f 4f 4b 0a 23 20 64 65 66 69 6e 65 20 70  TE_OK.# define p
96a0: 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61  agerBeginReadTra
96b0: 6e 73 61 63 74 69 6f 6e 28 7a 29 20 53 51 4c 49  nsaction(z) SQLI
96c0: 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 23 69  TE_OK.#endif..#i
96d0: 66 6e 64 65 66 20 4e 44 45 42 55 47 20 0a 2f 2a  fndef NDEBUG ./*
96e0: 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a  .** Usage:.**.**
96f0: 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72     assert( asser
9700: 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
9710: 61 67 65 72 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 54  ager) );.**.** T
9720: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 75 6e  his function run
9730: 73 20 6d 61 6e 79 20 61 73 73 65 72 74 73 20 74  s many asserts t
9740: 6f 20 74 72 79 20 74 6f 20 66 69 6e 64 20 69 6e  o try to find in
9750: 63 6f 6e 73 69 73 74 65 6e 63 69 65 73 20 69 6e  consistencies in
9760: 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  .** the internal
9770: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 61   state of the Pa
9780: 67 65 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73  ger object..*/.s
9790: 74 61 74 69 63 20 69 6e 74 20 61 73 73 65 72 74  tatic int assert
97a0: 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50 61 67  _pager_state(Pag
97b0: 65 72 20 2a 70 29 7b 0a 20 20 50 61 67 65 72 20  er *p){.  Pager 
97c0: 2a 70 50 61 67 65 72 20 3d 20 70 3b 0a 0a 20 20  *pPager = p;..  
97d0: 2f 2a 20 53 74 61 74 65 20 6d 75 73 74 20 62 65  /* State must be
97e0: 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 61 73 73   valid. */.  ass
97f0: 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d  ert( p->eState==
9800: 50 41 47 45 52 5f 4f 50 45 4e 0a 20 20 20 20 20  PAGER_OPEN.     
9810: 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d    || p->eState==
9820: 50 41 47 45 52 5f 52 45 41 44 45 52 0a 20 20 20  PAGER_READER.   
9830: 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65      || p->eState
9840: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
9850: 4f 43 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c 20  OCKED.       || 
9860: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
9870: 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
9880: 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53  .       || p->eS
9890: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
98a0: 45 52 5f 44 42 4d 4f 44 0a 20 20 20 20 20 20 20  ER_DBMOD.       
98b0: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  || p->eState==PA
98c0: 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53  GER_WRITER_FINIS
98d0: 48 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  HED.       || p-
98e0: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45  >eState==PAGER_E
98f0: 52 52 4f 52 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  RROR.  );..  /* 
9900: 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68  Regardless of th
9910: 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 2c  e current state,
9920: 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 63 6f 6e   a temp-file con
9930: 6e 65 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 62  nection always b
9940: 65 68 61 76 65 73 0a 20 20 2a 2a 20 61 73 20 69  ehaves.  ** as i
9950: 66 20 69 74 20 68 61 73 20 61 6e 20 65 78 63 6c  f it has an excl
9960: 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  usive lock on th
9970: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
9980: 20 49 74 20 6e 65 76 65 72 20 75 70 64 61 74 65   It never update
9990: 73 0a 20 20 2a 2a 20 74 68 65 20 63 68 61 6e 67  s.  ** the chang
99a0: 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 2c  e-counter field,
99b0: 20 73 6f 20 74 68 65 20 63 68 61 6e 67 65 43 6f   so the changeCo
99c0: 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73 20  untDone flag is 
99d0: 61 6c 77 61 79 73 20 73 65 74 2e 0a 20 20 2a 2f  always set..  */
99e0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74 65  .  assert( p->te
99f0: 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 2d 3e  mpFile==0 || p->
9a00: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
9a10: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
9a20: 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d  t( p->tempFile==
9a30: 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 63 68 61  0 || pPager->cha
9a40: 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a  ngeCountDone );.
9a50: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65  .  /* If the use
9a60: 4a 6f 75 72 6e 61 6c 20 66 6c 61 67 20 69 73 20  Journal flag is 
9a70: 63 6c 65 61 72 2c 20 74 68 65 20 6a 6f 75 72 6e  clear, the journ
9a80: 61 6c 2d 6d 6f 64 65 20 6d 75 73 74 20 62 65 20  al-mode must be 
9a90: 22 4f 46 46 22 2e 20 0a 20 20 2a 2a 20 41 6e 64  "OFF". .  ** And
9aa0: 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d   if the journal-
9ab0: 6d 6f 64 65 20 69 73 20 22 4f 46 46 22 2c 20 74  mode is "OFF", t
9ac0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
9ad0: 6d 75 73 74 20 6e 6f 74 20 62 65 20 6f 70 65 6e  must not be open
9ae0: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
9af0: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
9b00: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
9b10: 44 45 5f 4f 46 46 20 7c 7c 20 70 2d 3e 75 73 65  DE_OFF || p->use
9b20: 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73  Journal );.  ass
9b30: 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d  ert( p->journalM
9b40: 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
9b50: 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 21 69  ALMODE_OFF || !i
9b60: 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 29 3b  sOpen(p->jfd) );
9b70: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
9b80: 74 20 4d 45 4d 44 42 20 69 6d 70 6c 69 65 73 20  t MEMDB implies 
9b90: 6e 6f 53 79 6e 63 2e 20 41 6e 64 20 61 6e 20 69  noSync. And an i
9ba0: 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
9bb0: 2e 20 53 69 6e 63 65 20 0a 20 20 2a 2a 20 74 68  . Since .  ** th
9bc0: 69 73 20 6d 65 61 6e 73 20 61 6e 20 69 6e 2d 6d  is means an in-m
9bd0: 65 6d 6f 72 79 20 70 61 67 65 72 20 70 65 72 66  emory pager perf
9be0: 6f 72 6d 73 20 6e 6f 20 49 4f 20 61 74 20 61 6c  orms no IO at al
9bf0: 6c 2c 20 69 74 20 63 61 6e 6e 6f 74 20 65 6e 63  l, it cannot enc
9c00: 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20 65 69 74  ounter .  ** eit
9c10: 68 65 72 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  her SQLITE_IOERR
9c20: 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20   or SQLITE_FULL 
9c30: 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20  during rollback 
9c40: 6f 72 20 77 68 69 6c 65 20 66 69 6e 61 6c 69 7a  or while finaliz
9c50: 69 6e 67 20 0a 20 20 2a 2a 20 61 20 6a 6f 75 72  ing .  ** a jour
9c60: 6e 61 6c 20 66 69 6c 65 2e 20 28 61 6c 74 68 6f  nal file. (altho
9c70: 75 67 68 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ugh the in-memor
9c80: 79 20 6a 6f 75 72 6e 61 6c 20 69 6d 70 6c 65 6d  y journal implem
9c90: 65 6e 74 61 74 69 6f 6e 20 6d 61 79 20 0a 20 20  entation may .  
9ca0: 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ** return SQLITE
9cb0: 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 77 68 69  _IOERR_NOMEM whi
9cc0: 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  le the journal f
9cd0: 69 6c 65 20 69 73 20 62 65 69 6e 67 20 77 72 69  ile is being wri
9ce0: 74 74 65 6e 29 2e 20 49 74 20 0a 20 20 2a 2a 20  tten). It .  ** 
9cf0: 69 73 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 74  is therefore not
9d00: 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 6e   possible for an
9d10: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
9d20: 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 45 52   to enter the ER
9d30: 52 4f 52 20 0a 20 20 2a 2a 20 73 74 61 74 65 2e  ROR .  ** state.
9d40: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44  .  */.  if( MEMD
9d50: 42 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  B ){.    assert(
9d60: 20 21 69 73 4f 70 65 6e 28 70 2d 3e 66 64 29 20   !isOpen(p->fd) 
9d70: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
9d80: 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 20 20  ->noSync );.    
9d90: 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e  assert( p->journ
9da0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
9db0: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20  URNALMODE_OFF . 
9dc0: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f          || p->jo
9dd0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
9de0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
9df0: 4f 52 59 20 0a 20 20 20 20 29 3b 0a 20 20 20 20  ORY .    );.    
9e00: 61 73 73 65 72 74 28 20 70 2d 3e 65 53 74 61 74  assert( p->eStat
9e10: 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 26  e!=PAGER_ERROR &
9e20: 26 20 70 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  & p->eState!=PAG
9e30: 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20 61  ER_OPEN );.    a
9e40: 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57  ssert( pagerUseW
9e50: 61 6c 28 70 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a  al(p)==0 );.  }.
9e60: 0a 20 20 2f 2a 20 49 66 20 63 68 61 6e 67 65 43  .  /* If changeC
9e70: 6f 75 6e 74 44 6f 6e 65 20 69 73 20 73 65 74 2c  ountDone is set,
9e80: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
9e90: 20 6f 72 20 67 72 65 61 74 65 72 20 6d 75 73 74   or greater must
9ea0: 20 62 65 20 68 65 6c 64 0a 20 20 2a 2a 20 6f 6e   be held.  ** on
9eb0: 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a   the file..  */.
9ec0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
9ed0: 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
9ee0: 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e==0 || pPager->
9ef0: 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f  eLock>=RESERVED_
9f00: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
9f10: 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 50 45 4e 44  ( p->eLock!=PEND
9f20: 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 73  ING_LOCK );..  s
9f30: 77 69 74 63 68 28 20 70 2d 3e 65 53 74 61 74 65  witch( p->eState
9f40: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50 41 47   ){.    case PAG
9f50: 45 52 5f 4f 50 45 4e 3a 0a 20 20 20 20 20 20 61  ER_OPEN:.      a
9f60: 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
9f70: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9f80: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
9f90: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
9fa0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
9fb0: 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
9fc0: 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
9fd0: 29 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  )==0 || pPager->
9fe0: 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20  tempFile );.    
9ff0: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61    break;..    ca
a000: 73 65 20 50 41 47 45 52 5f 52 45 41 44 45 52 3a  se PAGER_READER:
a010: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a020: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
a030: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
a040: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
a050: 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock!=UNKNOWN_LOC
a060: 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  K );.      asser
a070: 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41  t( p->eLock>=SHA
a080: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  RED_LOCK );.    
a090: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61    break;..    ca
a0a0: 73 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  se PAGER_WRITER_
a0b0: 4c 4f 43 4b 45 44 3a 0a 20 20 20 20 20 20 61 73  LOCKED:.      as
a0c0: 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d  sert( p->eLock!=
a0d0: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a  UNKNOWN_LOCK );.
a0e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a0f0: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
a100: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
a110: 20 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57    if( !pagerUseW
a120: 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
a130: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a140: 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44  >eLock>=RESERVED
a150: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d  _LOCK );.      }
a160: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
a170: 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 0a  OMIT_CONCURRENT.
a180: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a190: 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50  ager->dbSize==pP
a1a0: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
a1b0: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c   || pPager->pAll
a1c0: 52 65 61 64 20 29 3b 0a 23 65 6e 64 69 66 0a 20  Read );.#endif. 
a1d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a1e0: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d  ger->dbOrigSize=
a1f0: 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  =pPager->dbFileS
a200: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ize );.      ass
a210: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f  ert( pPager->dbO
a220: 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d  rigSize==pPager-
a230: 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20  >dbHintSize );. 
a240: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a250: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d  ger->setMaster==
a260: 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
a270: 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  ;..    case PAGE
a280: 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
a290: 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  D:.      assert(
a2a0: 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f   p->eLock!=UNKNO
a2b0: 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  WN_LOCK );.     
a2c0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a2d0: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
a2e0: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28  _OK );.      if(
a2f0: 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
a300: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  ager) ){.       
a310: 20 2f 2a 20 49 74 20 69 73 20 70 6f 73 73 69 62   /* It is possib
a320: 6c 65 20 74 68 61 74 20 69 66 20 6a 6f 75 72 6e  le that if journ
a330: 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20 68 65 72 65  al_mode=wal here
a340: 20 74 68 61 74 20 6e 65 69 74 68 65 72 20 74 68   that neither th
a350: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75  e.        ** jou
a360: 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 72 20 74 68  rnal file nor th
a370: 65 20 57 41 4c 20 66 69 6c 65 20 61 72 65 20 6f  e WAL file are o
a380: 70 65 6e 2e 20 54 68 69 73 20 68 61 70 70 65 6e  pen. This happen
a390: 73 20 64 75 72 69 6e 67 0a 20 20 20 20 20 20 20  s during.       
a3a0: 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 74   ** a rollback t
a3b0: 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20  ransaction that 
a3c0: 73 77 69 74 63 68 65 73 20 66 72 6f 6d 20 6a 6f  switches from jo
a3d0: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66 66 0a 20  urnal_mode=off. 
a3e0: 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 6a 6f 75         ** to jou
a3f0: 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 2e 0a 20  rnal_mode=wal.. 
a400: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
a410: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
a420: 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck>=RESERVED_LOC
a430: 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  K );.        ass
a440: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a  ert( isOpen(p->j
a450: 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  fd) .           
a460: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
a470: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
a480: 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20  ALMODE_OFF .    
a490: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
a4a0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
a4b0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
a4c0: 4c 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  L .        );.  
a4d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
a4e0: 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  rt( pPager->dbOr
a4f0: 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e  igSize==pPager->
a500: 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a 20 20  dbFileSize );.  
a510: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a520: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d  er->dbOrigSize==
a530: 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69  pPager->dbHintSi
a540: 7a 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ze );.      brea
a550: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
a560: 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 3a  ER_WRITER_DBMOD:
a570: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a580: 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
a590: 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  VE_LOCK );.     
a5a0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a5b0: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
a5c0: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
a5d0: 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
a5e0: 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
a5f0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
a600: 6f 63 6b 3e 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock>=EXCLUSIVE_L
a610: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  OCK );.      ass
a620: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a  ert( isOpen(p->j
a630: 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  fd) .           
a640: 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  || p->journalMod
a650: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
a660: 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20  MODE_OFF .      
a670: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
a680: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a690: 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20  URNALMODE_WAL . 
a6a0: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73       );.      as
a6b0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
a6c0: 4f 72 69 67 53 69 7a 65 3c 3d 70 50 61 67 65 72  OrigSize<=pPager
a6d0: 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a  ->dbHintSize );.
a6e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
a6f0: 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52 49    case PAGER_WRI
a700: 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 20 20  TER_FINISHED:.  
a710: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
a720: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
a730: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  LOCK );.      as
a740: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
a750: 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
a760: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a770: 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
a780: 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20  Pager) );.      
a790: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
a7a0: 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20  ->jfd) .        
a7b0: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
a7c0: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
a7d0: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
a7e0: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f          || p->jo
a7f0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
a800: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
a810: 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20   .      );.     
a820: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
a830: 65 20 50 41 47 45 52 5f 45 52 52 4f 52 3a 0a 20  e PAGER_ERROR:. 
a840: 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 6d 75       /* There mu
a850: 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f  st be at least o
a860: 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  ne outstanding r
a870: 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
a880: 70 61 67 65 72 20 69 66 0a 20 20 20 20 20 20 2a  pager if.      *
a890: 2a 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65  * in ERROR state
a8a0: 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20  . Otherwise the 
a8b0: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 68 61 76  pager should hav
a8c0: 65 20 61 6c 72 65 61 64 79 20 64 72 6f 70 70 65  e already droppe
a8d0: 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20  d.      ** back 
a8e0: 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e 0a 20  to OPEN state.. 
a8f0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
a900: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
a910: 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b  rCode!=SQLITE_OK
a920: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a930: 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  ( sqlite3PcacheR
a940: 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
a950: 70 50 43 61 63 68 65 29 3e 30 20 7c 7c 20 70 50  pPCache)>0 || pP
a960: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
a970: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
a980: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   }..  return 1;.
a990: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64  }.#endif /* ifnd
a9a0: 65 66 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69  ef NDEBUG */..#i
a9b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
a9c0: 47 20 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  G ./*.** Return 
a9d0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 68  a pointer to a h
a9e0: 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 73 74  uman readable st
a9f0: 72 69 6e 67 20 69 6e 20 61 20 73 74 61 74 69 63  ring in a static
aa00: 20 62 75 66 66 65 72 0a 2a 2a 20 63 6f 6e 74 61   buffer.** conta
aa10: 69 6e 69 6e 67 20 74 68 65 20 73 74 61 74 65 20  ining the state 
aa20: 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  of the Pager obj
aa30: 65 63 74 20 70 61 73 73 65 64 20 61 73 20 61 6e  ect passed as an
aa40: 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 0a   argument. This.
aa50: 2a 2a 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74  ** is intended t
aa60: 6f 20 62 65 20 75 73 65 64 20 77 69 74 68 69 6e  o be used within
aa70: 20 64 65 62 75 67 67 65 72 73 2e 20 46 6f 72 20   debuggers. For 
aa80: 65 78 61 6d 70 6c 65 2c 20 61 73 20 61 6e 20 61  example, as an a
aa90: 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 74 6f  lternative.** to
aaa0: 20 22 70 72 69 6e 74 20 2a 70 50 61 67 65 72 22   "print *pPager"
aab0: 20 69 6e 20 67 64 62 3a 0a 2a 2a 0a 2a 2a 20 28   in gdb:.**.** (
aac0: 67 64 62 29 20 70 72 69 6e 74 66 20 22 25 73 22  gdb) printf "%s"
aad0: 2c 20 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74  , print_pager_st
aae0: 61 74 65 28 70 50 61 67 65 72 29 0a 2a 2f 0a 73  ate(pPager).*/.s
aaf0: 74 61 74 69 63 20 63 68 61 72 20 2a 70 72 69 6e  tatic char *prin
ab00: 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50 61  t_pager_state(Pa
ab10: 67 65 72 20 2a 70 29 7b 0a 20 20 73 74 61 74 69  ger *p){.  stati
ab20: 63 20 63 68 61 72 20 7a 52 65 74 5b 31 30 32 34  c char zRet[1024
ab30: 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  ];..  sqlite3_sn
ab40: 70 72 69 6e 74 66 28 31 30 32 34 2c 20 7a 52 65  printf(1024, zRe
ab50: 74 2c 0a 20 20 20 20 20 20 22 46 69 6c 65 6e 61  t,.      "Filena
ab60: 6d 65 3a 20 20 20 20 20 20 25 73 5c 6e 22 0a 20  me:      %s\n". 
ab70: 20 20 20 20 20 22 53 74 61 74 65 3a 20 20 20 20       "State:    
ab80: 20 20 20 20 20 25 73 20 65 72 72 43 6f 64 65 3d       %s errCode=
ab90: 25 64 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63  %d\n".      "Loc
aba0: 6b 3a 20 20 20 20 20 20 20 20 20 20 25 73 5c 6e  k:          %s\n
abb0: 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b 69 6e 67  ".      "Locking
abc0: 20 6d 6f 64 65 3a 20 20 6c 6f 63 6b 69 6e 67 5f   mode:  locking_
abd0: 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20  mode=%s\n".     
abe0: 20 22 4a 6f 75 72 6e 61 6c 20 6d 6f 64 65 3a 20   "Journal mode: 
abf0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 25 73   journal_mode=%s
ac00: 5c 6e 22 0a 20 20 20 20 20 20 22 42 61 63 6b 69  \n".      "Backi
ac10: 6e 67 20 73 74 6f 72 65 3a 20 74 65 6d 70 46 69  ng store: tempFi
ac20: 6c 65 3d 25 64 20 6d 65 6d 44 62 3d 25 64 20 75  le=%d memDb=%d u
ac30: 73 65 4a 6f 75 72 6e 61 6c 3d 25 64 5c 6e 22 0a  seJournal=%d\n".
ac40: 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 3a 20        "Journal: 
ac50: 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4f 66 66        journalOff
ac60: 3d 25 6c 6c 64 20 6a 6f 75 72 6e 61 6c 48 64 72  =%lld journalHdr
ac70: 3d 25 6c 6c 64 5c 6e 22 0a 20 20 20 20 20 20 22  =%lld\n".      "
ac80: 53 69 7a 65 3a 20 20 20 20 20 20 20 20 20 20 64  Size:          d
ac90: 62 73 69 7a 65 3d 25 64 20 64 62 4f 72 69 67 53  bsize=%d dbOrigS
aca0: 69 7a 65 3d 25 64 20 64 62 46 69 6c 65 53 69 7a  ize=%d dbFileSiz
acb0: 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 2c 20  e=%d\n".      , 
acc0: 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 0a 20 20 20  p->zFilename.   
acd0: 20 20 20 2c 20 70 2d 3e 65 53 74 61 74 65 3d 3d     , p->eState==
ace0: 50 41 47 45 52 5f 4f 50 45 4e 20 20 20 20 20 20  PAGER_OPEN      
acf0: 20 20 20 20 20 20 3f 20 22 4f 50 45 4e 22 20 3a        ? "OPEN" :
ad00: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
ad10: 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
ad20: 20 20 20 20 20 20 20 20 20 20 3f 20 22 52 45 41            ? "REA
ad30: 44 45 52 22 20 3a 0a 20 20 20 20 20 20 20 20 70  DER" :.        p
ad40: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
ad50: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20  WRITER_LOCKED   
ad60: 3f 20 22 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ? "WRITER_LOCKED
ad70: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
ad80: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
ad90: 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 3f 20 22  TER_CACHEMOD ? "
ada0: 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 22  WRITER_CACHEMOD"
adb0: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
adc0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
add0: 45 52 5f 44 42 4d 4f 44 20 20 20 20 3f 20 22 57  ER_DBMOD    ? "W
ade0: 52 49 54 45 52 5f 44 42 4d 4f 44 22 20 3a 0a 20  RITER_DBMOD" :. 
adf0: 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
ae00: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46  ==PAGER_WRITER_F
ae10: 49 4e 49 53 48 45 44 20 3f 20 22 57 52 49 54 45  INISHED ? "WRITE
ae20: 52 5f 46 49 4e 49 53 48 45 44 22 20 3a 0a 20 20  R_FINISHED" :.  
ae30: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d        p->eState=
ae40: 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 20 20 20  =PAGER_ERROR    
ae50: 20 20 20 20 20 20 20 3f 20 22 45 52 52 4f 52 22         ? "ERROR"
ae60: 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20   : "?error?".   
ae70: 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 65 72 72     , (int)p->err
ae80: 43 6f 64 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e  Code.      , p->
ae90: 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 20  eLock==NO_LOCK  
aea0: 20 20 20 20 20 20 20 3f 20 22 4e 4f 5f 4c 4f 43         ? "NO_LOC
aeb0: 4b 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  K" :.        p->
aec0: 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
aed0: 4c 4f 43 4b 20 20 20 3f 20 22 52 45 53 45 52 56  LOCK   ? "RESERV
aee0: 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  ED" :.        p-
aef0: 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
af00: 45 5f 4c 4f 43 4b 20 20 3f 20 22 45 58 43 4c 55  E_LOCK  ? "EXCLU
af10: 53 49 56 45 22 20 3a 0a 20 20 20 20 20 20 20 20  SIVE" :.        
af20: 70 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  p->eLock==SHARED
af30: 5f 4c 4f 43 4b 20 20 20 20 20 3f 20 22 53 48 41  _LOCK     ? "SHA
af40: 52 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70  RED" :.        p
af50: 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e  ->eLock==UNKNOWN
af60: 5f 4c 4f 43 4b 20 20 20 20 3f 20 22 55 4e 4b 4e  _LOCK    ? "UNKN
af70: 4f 57 4e 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22  OWN" : "?error?"
af80: 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 78 63 6c  .      , p->excl
af90: 75 73 69 76 65 4d 6f 64 65 20 3f 20 22 65 78 63  usiveMode ? "exc
afa0: 6c 75 73 69 76 65 22 20 3a 20 22 6e 6f 72 6d 61  lusive" : "norma
afb0: 6c 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f  l".      , p->jo
afc0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
afd0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
afe0: 4f 52 59 20 20 20 3f 20 22 6d 65 6d 6f 72 79 22  ORY   ? "memory"
aff0: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f   :.        p->jo
b000: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
b010: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
b020: 20 20 20 20 20 20 3f 20 22 6f 66 66 22 20 3a 0a        ? "off" :.
b030: 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e          p->journ
b040: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
b050: 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
b060: 20 20 20 3f 20 22 64 65 6c 65 74 65 22 20 3a 0a     ? "delete" :.
b070: 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e          p->journ
b080: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
b090: 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
b0a0: 54 20 20 3f 20 22 70 65 72 73 69 73 74 22 20 3a  T  ? "persist" :
b0b0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72  .        p->jour
b0c0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
b0d0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
b0e0: 41 54 45 20 3f 20 22 74 72 75 6e 63 61 74 65 22  ATE ? "truncate"
b0f0: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f   :.        p->jo
b100: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
b110: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
b120: 20 20 20 20 20 20 3f 20 22 77 61 6c 22 20 3a 20        ? "wal" : 
b130: 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20  "?error?".      
b140: 2c 20 28 69 6e 74 29 70 2d 3e 74 65 6d 70 46 69  , (int)p->tempFi
b150: 6c 65 2c 20 28 69 6e 74 29 70 2d 3e 6d 65 6d 44  le, (int)p->memD
b160: 62 2c 20 28 69 6e 74 29 70 2d 3e 75 73 65 4a 6f  b, (int)p->useJo
b170: 75 72 6e 61 6c 0a 20 20 20 20 20 20 2c 20 70 2d  urnal.      , p-
b180: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 2d 3e  >journalOff, p->
b190: 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20  journalHdr.     
b1a0: 20 2c 20 28 69 6e 74 29 70 2d 3e 64 62 53 69 7a   , (int)p->dbSiz
b1b0: 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62 4f 72 69  e, (int)p->dbOri
b1c0: 67 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64  gSize, (int)p->d
b1d0: 62 46 69 6c 65 53 69 7a 65 0a 20 20 29 3b 0a 0a  bFileSize.  );..
b1e0: 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d    return zRet;.}
b1f0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
b200: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74  eturn true if it
b210: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
b220: 20 77 72 69 74 65 20 70 61 67 65 20 2a 70 50 67   write page *pPg
b230: 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f   into the sub-jo
b240: 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65  urnal..** A page
b250: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 77 72 69   needs to be wri
b260: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 73 75  tten into the su
b270: 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68 65  b-journal if the
b280: 72 65 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a  re exists one.**
b290: 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61   or more open sa
b2a0: 76 65 70 6f 69 6e 74 73 20 66 6f 72 20 77 68 69  vepoints for whi
b2b0: 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68  ch:.**.**   * Th
b2c0: 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73  e page-number is
b2d0: 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
b2e0: 75 61 6c 20 74 6f 20 50 61 67 65 72 53 61 76 65  ual to PagerSave
b2f0: 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64  point.nOrig, and
b300: 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62 69 74 20  .**   * The bit 
b310: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
b320: 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72   the page-number
b330: 20 69 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a   is not set in.*
b340: 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70  *     PagerSavep
b350: 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e  oint.pInSavepoin
b360: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
b370: 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
b380: 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
b390: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
b3a0: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
b3b0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
b3c0: 70 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  p;.  Pgno pgno =
b3d0: 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 69 6e   pPg->pgno;.  in
b3e0: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
b3f0: 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
b400: 6f 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  oint; i++){.    
b410: 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61  p = &pPager->aSa
b420: 76 65 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20  vepoint[i];.    
b430: 69 66 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67  if( p->nOrig>=pg
b440: 6e 6f 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33  no && 0==sqlite3
b450: 42 69 74 76 65 63 54 65 73 74 4e 6f 74 4e 75 6c  BitvecTestNotNul
b460: 6c 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e  l(p->pInSavepoin
b470: 74 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20  t, pgno) ){.    
b480: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
b490: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
b4a0: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
b4b0: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52  TE_DEBUG./*.** R
b4c0: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
b4d0: 65 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64  e page is alread
b4e0: 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  y in the journal
b4f0: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
b500: 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e   int pageInJourn
b510: 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
b520: 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  , PgHdr *pPg){. 
b530: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42   return sqlite3B
b540: 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72  itvecTest(pPager
b550: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50  ->pInJournal, pP
b560: 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 23 65 6e 64  g->pgno);.}.#end
b570: 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  if../*.** Read a
b580: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
b590: 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66  from the given f
b5a0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
b5b0: 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67   Store the integ
b5c0: 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65  er.** that is re
b5d0: 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65  ad in *pRes.  Re
b5e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
b5f0: 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72  f everything wor
b600: 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72  ked, or an.** er
b610: 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65  ror code is some
b620: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
b630: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75  ..**.** All valu
b640: 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e  es are stored on
b650: 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64   disk as big-end
b660: 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ian..*/.static i
b670: 6e 74 20 72 65 61 64 33 32 62 69 74 73 28 73 71  nt read32bits(sq
b680: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
b690: 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20  i64 offset, u32 
b6a0: 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e  *pRes){.  unsign
b6b0: 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20  ed char ac[4];. 
b6c0: 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
b6d0: 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20  3OsRead(fd, ac, 
b6e0: 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66 73  sizeof(ac), offs
b6f0: 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  et);.  if( rc==S
b700: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
b710: 2a 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47  *pRes = sqlite3G
b720: 65 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d  et4byte(ac);.  }
b730: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
b740: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33  ./*.** Write a 3
b750: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e  2-bit integer in
b760: 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66  to a string buff
b770: 65 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e  er in big-endian
b780: 20 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a   byte order..*/.
b790: 23 64 65 66 69 6e 65 20 70 75 74 33 32 62 69 74  #define put32bit
b7a0: 73 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50  s(A,B)  sqlite3P
b7b0: 75 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42  ut4byte((u8*)A,B
b7c0: 29 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  ).../*.** Write 
b7d0: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
b7e0: 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20   into the given 
b7f0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
b800: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
b810: 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
b820: 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
b830: 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67  e is something g
b840: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74  oes wrong..*/.st
b850: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32  atic int write32
b860: 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c  bits(sqlite3_fil
b870: 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65  e *fd, i64 offse
b880: 74 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63  t, u32 val){.  c
b890: 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74  har ac[4];.  put
b8a0: 33 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b  32bits(ac, val);
b8b0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
b8c0: 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c  3OsWrite(fd, ac,
b8d0: 20 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a   4, offset);.}..
b8e0: 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65  /*.** Unlock the
b8f0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
b900: 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77  o level eLock, w
b910: 68 69 63 68 20 6d 75 73 74 20 62 65 20 65 69 74  hich must be eit
b920: 68 65 72 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f  her NO_LOCK.** o
b930: 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 20 52  r SHARED_LOCK. R
b940: 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
b950: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
b960: 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28  call to xUnlock(
b970: 29 0a 2a 2a 20 73 75 63 63 65 65 64 73 2c 20 73  ).** succeeds, s
b980: 65 74 20 74 68 65 20 50 61 67 65 72 2e 65 4c 6f  et the Pager.eLo
b990: 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6d  ck variable to m
b9a0: 61 74 63 68 20 74 68 65 20 28 61 74 74 65 6d 70  atch the (attemp
b9b0: 74 65 64 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a  ted) new lock..*
b9c0: 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20  *.** Except, if 
b9d0: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73  Pager.eLock is s
b9e0: 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  et to UNKNOWN_LO
b9f0: 43 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  CK when this fun
ba00: 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c  ction is.** call
ba10: 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66  ed, do not modif
ba20: 79 20 69 74 2e 20 53 65 65 20 74 68 65 20 63 6f  y it. See the co
ba30: 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20  mment above the 
ba40: 23 64 65 66 69 6e 65 20 6f 66 20 0a 2a 2a 20 55  #define of .** U
ba50: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20  NKNOWN_LOCK for 
ba60: 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f  an explanation o
ba70: 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69  f this..*/.stati
ba80: 63 20 69 6e 74 20 70 61 67 65 72 55 6e 6c 6f 63  c int pagerUnloc
ba90: 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61 67 65  kDb(Pager *pPage
baa0: 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20  r, int eLock){. 
bab0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
bac0: 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
bad0: 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
bae0: 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72  veMode || pPager
baf0: 2d 3e 65 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b 20 29  ->eLock==eLock )
bb00: 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63  ;.  assert( eLoc
bb10: 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  k==NO_LOCK || eL
bb20: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
bb30: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
bb40: 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20  ock!=NO_LOCK || 
bb50: 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
bb60: 65 72 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  er)==0 );.  if( 
bb70: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
bb80: 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  d) ){.    assert
bb90: 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e  ( pPager->eLock>
bba0: 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 72 63  =eLock );.    rc
bbb0: 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63   = pPager->noLoc
bbc0: 6b 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20  k ? SQLITE_OK : 
bbd0: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
bbe0: 70 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63  pPager->fd, eLoc
bbf0: 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  k);.    if( pPag
bc00: 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f  er->eLock!=UNKNO
bc10: 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  WN_LOCK ){.     
bc20: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d   pPager->eLock =
bc30: 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20   (u8)eLock;.    
bc40: 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  }.    IOTRACE(("
bc50: 55 4e 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c  UNLOCK %p %d\n",
bc60: 20 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29   pPager, eLock))
bc70: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
bc80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
bc90: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
bca0: 65 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b  e to level eLock
bcb0: 2c 20 77 68 69 63 68 20 6d 75 73 74 20 62 65 20  , which must be 
bcc0: 65 69 74 68 65 72 20 53 48 41 52 45 44 5f 4c 4f  either SHARED_LO
bcd0: 43 4b 2c 0a 2a 2a 20 52 45 53 45 52 56 45 44 5f  CK,.** RESERVED_
bce0: 4c 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53 49 56  LOCK or EXCLUSIV
bcf0: 45 5f 4c 4f 43 4b 2e 20 49 66 20 74 68 65 20 63  E_LOCK. If the c
bd00: 61 6c 6c 65 72 20 69 73 20 73 75 63 63 65 73 73  aller is success
bd10: 66 75 6c 2c 20 73 65 74 20 74 68 65 0a 2a 2a 20  ful, set the.** 
bd20: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69  Pager.eLock vari
bd30: 61 62 6c 65 20 74 6f 20 74 68 65 20 6e 65 77 20  able to the new 
bd40: 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 2e 20 0a  locking state. .
bd50: 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66  **.** Except, if
bd60: 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20   Pager.eLock is 
bd70: 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c  set to UNKNOWN_L
bd80: 4f 43 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75  OCK when this fu
bd90: 6e 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 63 61  nction is .** ca
bda0: 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64  lled, do not mod
bdb0: 69 66 79 20 69 74 20 75 6e 6c 65 73 73 20 74 68  ify it unless th
bdc0: 65 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74  e new locking st
bdd0: 61 74 65 20 69 73 20 45 58 43 4c 55 53 49 56 45  ate is EXCLUSIVE
bde0: 5f 4c 4f 43 4b 2e 20 0a 2a 2a 20 53 65 65 20 74  _LOCK. .** See t
bdf0: 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
be00: 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20   the #define of 
be10: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72  UNKNOWN_LOCK for
be20: 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20   an explanation 
be30: 0a 2a 2a 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a  .** of this..*/.
be40: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
be50: 4c 6f 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50  LockDb(Pager *pP
be60: 61 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29  ager, int eLock)
be70: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
be80: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
be90: 74 28 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  t( eLock==SHARED
bea0: 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d  _LOCK || eLock==
beb0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c  RESERVED_LOCK ||
bec0: 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56   eLock==EXCLUSIV
bed0: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  E_LOCK );.  if( 
bee0: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 65 4c  pPager->eLock<eL
bef0: 6f 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ock || pPager->e
bf00: 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock==UNKNOWN_LO
bf10: 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  CK ){.    rc = p
bf20: 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20  Pager->noLock ? 
bf30: 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69  SQLITE_OK : sqli
bf40: 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
bf50: 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20  ->fd, eLock);.  
bf60: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
bf70: 5f 4f 4b 20 26 26 20 28 70 50 61 67 65 72 2d 3e  _OK && (pPager->
bf80: 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c  eLock!=UNKNOWN_L
bf90: 4f 43 4b 7c 7c 65 4c 6f 63 6b 3d 3d 45 58 43 4c  OCK||eLock==EXCL
bfa0: 55 53 49 56 45 5f 4c 4f 43 4b 29 20 29 7b 0a 20  USIVE_LOCK) ){. 
bfb0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f       pPager->eLo
bfc0: 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a  ck = (u8)eLock;.
bfd0: 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
bfe0: 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70  LOCK %p %d\n", p
bff0: 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20  Pager, eLock)). 
c000: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
c010: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
c020: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 74  his function det
c030: 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20  ermines whether 
c040: 6f 72 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69  or not the atomi
c050: 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61  c-write optimiza
c060: 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 75  tion.** can be u
c070: 73 65 64 20 77 69 74 68 20 74 68 69 73 20 70 61  sed with this pa
c080: 67 65 72 2e 20 54 68 65 20 6f 70 74 69 6d 69 7a  ger. The optimiz
c090: 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65  ation can be use
c0a0: 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29  d if:.**.**  (a)
c0b0: 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
c0c0: 6e 65 64 20 62 79 20 4f 73 44 65 76 69 63 65 43  ned by OsDeviceC
c0d0: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 29  haracteristics()
c0e0: 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 0a   indicates that.
c0f0: 2a 2a 20 20 20 20 20 20 61 20 64 61 74 61 62 61  **      a databa
c100: 73 65 20 70 61 67 65 20 6d 61 79 20 62 65 20 77  se page may be w
c110: 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c  ritten atomicall
c120: 79 2c 20 61 6e 64 0a 2a 2a 20 20 28 62 29 20 74  y, and.**  (b) t
c130: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
c140: 64 20 62 79 20 4f 73 53 65 63 74 6f 72 53 69 7a  d by OsSectorSiz
c150: 65 28 29 20 69 73 20 6c 65 73 73 20 74 68 61 6e  e() is less than
c160: 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 20 20 20   or equal.**    
c170: 20 20 74 6f 20 74 68 65 20 70 61 67 65 20 73 69    to the page si
c180: 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70  ze..**.** The op
c190: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 61 6c  timization is al
c1a0: 73 6f 20 61 6c 77 61 79 73 20 65 6e 61 62 6c 65  so always enable
c1b0: 64 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  d for temporary 
c1c0: 66 69 6c 65 73 2e 20 49 74 20 69 73 0a 2a 2a 20  files. It is.** 
c1d0: 61 6e 20 65 72 72 6f 72 20 74 6f 20 63 61 6c 6c  an error to call
c1e0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
c1f0: 66 20 70 50 61 67 65 72 20 69 73 20 6f 70 65 6e  f pPager is open
c200: 65 64 20 6f 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ed on an in-memo
c210: 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a  ry.** database..
c220: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 74  **.** If the opt
c230: 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74  imization cannot
c240: 20 62 65 20 75 73 65 64 2c 20 30 20 69 73 20 72   be used, 0 is r
c250: 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20 63  eturned. If it c
c260: 61 6e 20 62 65 20 75 73 65 64 2c 0a 2a 2a 20 74  an be used,.** t
c270: 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65  hen the value re
c280: 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 73 69  turned is the si
c290: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
c2a0: 6c 20 66 69 6c 65 20 77 68 65 6e 20 69 74 0a 2a  l file when it.*
c2b0: 2a 20 63 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c 62  * contains rollb
c2c0: 61 63 6b 20 64 61 74 61 20 66 6f 72 20 65 78 61  ack data for exa
c2d0: 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 2e 0a 2a  ctly one page..*
c2e0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
c2f0: 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
c300: 49 54 45 0a 73 74 61 74 69 63 20 69 6e 74 20 6a  ITE.static int j
c310: 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 50 61  rnlBufferSize(Pa
c320: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
c330: 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
c340: 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
c350: 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
c360: 20 69 6e 74 20 64 63 3b 20 20 20 20 20 20 20 20   int dc;        
c370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c380: 20 20 20 2f 2a 20 44 65 76 69 63 65 20 63 68 61     /* Device cha
c390: 72 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a  racteristics */.
c3a0: 20 20 20 20 69 6e 74 20 6e 53 65 63 74 6f 72 3b      int nSector;
c3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3c0: 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20        /* Sector 
c3d0: 73 69 7a 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  size */.    int 
c3e0: 73 7a 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  szPage;         
c3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c400: 20 50 61 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20   Page size */.. 
c410: 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
c420: 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b  n(pPager->fd) );
c430: 0a 20 20 20 20 64 63 20 3d 20 73 71 6c 69 74 65  .    dc = sqlite
c440: 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
c450: 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
c460: 3e 66 64 29 3b 0a 20 20 20 20 6e 53 65 63 74 6f  >fd);.    nSecto
c470: 72 20 3d 20 70 50 61 67 65 72 2d 3e 73 65 63 74  r = pPager->sect
c480: 6f 72 53 69 7a 65 3b 0a 20 20 20 20 73 7a 50 61  orSize;.    szPa
c490: 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  ge = pPager->pag
c4a0: 65 53 69 7a 65 3b 0a 0a 20 20 20 20 61 73 73 65  eSize;..    asse
c4b0: 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
c4c0: 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e  ATOMIC512==(512>
c4d0: 3e 38 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >8));.    assert
c4e0: 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
c4f0: 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e  OMIC64K==(65536>
c500: 3e 38 29 29 3b 0a 20 20 20 20 69 66 28 20 30 3d  >8));.    if( 0=
c510: 3d 28 64 63 26 28 53 51 4c 49 54 45 5f 49 4f 43  =(dc&(SQLITE_IOC
c520: 41 50 5f 41 54 4f 4d 49 43 7c 28 73 7a 50 61 67  AP_ATOMIC|(szPag
c530: 65 3e 3e 38 29 29 20 7c 7c 20 6e 53 65 63 74 6f  e>>8)) || nSecto
c540: 72 3e 73 7a 50 61 67 65 29 20 29 7b 0a 20 20 20  r>szPage) ){.   
c550: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
c560: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
c570: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
c580: 70 50 61 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41  pPager) + JOURNA
c590: 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b  L_PG_SZ(pPager);
c5a0: 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
c5b0: 65 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65  e jrnlBufferSize
c5c0: 28 78 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  (x) 0.#endif../*
c5d0: 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 43 48  .** If SQLITE_CH
c5e0: 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64 65 66  ECK_PAGES is def
c5f0: 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64 6f 20  ined then we do 
c600: 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68 65 63  some sanity chec
c610: 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63  king.** on the c
c620: 61 63 68 65 20 75 73 69 6e 67 20 61 20 68 61 73  ache using a has
c630: 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69  h function.  Thi
c640: 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  s is used for te
c650: 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62  sting.** and deb
c660: 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a  ugging only..*/.
c670: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
c680: 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20  ECK_PAGES./*.** 
c690: 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20  Return a 32-bit 
c6a0: 68 61 73 68 20 6f 66 20 74 68 65 20 70 61 67 65  hash of the page
c6b0: 20 64 61 74 61 20 66 6f 72 20 70 50 61 67 65 2e   data for pPage.
c6c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70  .*/.static u32 p
c6d0: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 69 6e  ager_datahash(in
c6e0: 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67 6e 65  t nByte, unsigne
c6f0: 64 20 63 68 61 72 20 2a 70 44 61 74 61 29 7b 0a  d char *pData){.
c700: 20 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b 0a    u32 hash = 0;.
c710: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
c720: 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b  =0; i<nByte; i++
c730: 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68  ){.    hash = (h
c740: 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44 61 74  ash*1039) + pDat
c750: 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  a[i];.  }.  retu
c760: 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69  rn hash;.}.stati
c770: 63 20 75 33 32 20 70 61 67 65 72 5f 70 61 67 65  c u32 pager_page
c780: 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67  hash(PgHdr *pPag
c790: 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 61 67  e){.  return pag
c7a0: 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67  er_datahash(pPag
c7b0: 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67 65 53  e->pPager->pageS
c7c0: 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  ize, (unsigned c
c7d0: 68 61 72 20 2a 29 70 50 61 67 65 2d 3e 70 44 61  har *)pPage->pDa
c7e0: 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  ta);.}.static vo
c7f0: 69 64 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67  id pager_set_pag
c800: 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61  ehash(PgHdr *pPa
c810: 67 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e 70 61  ge){.  pPage->pa
c820: 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
c830: 61 67 65 68 61 73 68 28 70 50 61 67 65 29 3b 0a  agehash(pPage);.
c840: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45  }../*.** The CHE
c850: 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61  CK_PAGE macro ta
c860: 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61 73 20  kes a PgHdr* as 
c870: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20  an argument. If 
c880: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
c890: 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64  ES.** is defined
c8a0: 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20  , and NDEBUG is 
c8b0: 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20  not defined, an 
c8c0: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
c8d0: 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61  nt checks.** tha
c8e0: 74 20 74 68 65 20 70 61 67 65 20 69 73 20 65 69  t the page is ei
c8f0: 74 68 65 72 20 64 69 72 74 79 20 6f 72 20 73 74  ther dirty or st
c900: 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20  ill matches the 
c910: 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d  calculated page-
c920: 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  hash..*/.#define
c930: 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63   CHECK_PAGE(x) c
c940: 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74  heckPage(x).stat
c950: 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67  ic void checkPag
c960: 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
c970: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
c980: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
c990: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
c9a0: 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52  eState!=PAGER_ER
c9b0: 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ROR );.  assert(
c9c0: 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
c9d0: 44 52 5f 44 49 52 54 59 29 20 7c 7c 20 70 50 67  DR_DIRTY) || pPg
c9e0: 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67 65  ->pageHash==page
c9f0: 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 20  r_pagehash(pPg) 
ca00: 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66  );.}..#else.#def
ca10: 69 6e 65 20 70 61 67 65 72 5f 64 61 74 61 68 61  ine pager_dataha
ca20: 73 68 28 58 2c 59 29 20 20 30 0a 23 64 65 66 69  sh(X,Y)  0.#defi
ca30: 6e 65 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  ne pager_pagehas
ca40: 68 28 58 29 20 20 30 0a 23 64 65 66 69 6e 65 20  h(X)  0.#define 
ca50: 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61  pager_set_pageha
ca60: 73 68 28 58 29 0a 23 64 65 66 69 6e 65 20 43 48  sh(X).#define CH
ca70: 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e 64  ECK_PAGE(x).#end
ca80: 69 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48  if  /* SQLITE_CH
ca90: 45 43 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a  ECK_PAGES */../*
caa0: 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73  .** When this is
cab0: 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72   called the jour
cac0: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
cad0: 65 72 20 70 50 61 67 65 72 20 6d 75 73 74 20 62  er pPager must b
cae0: 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69 73 20  e open..** This 
caf0: 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
cb00: 73 20 74 6f 20 72 65 61 64 20 61 20 6d 61 73 74  s to read a mast
cb10: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
cb20: 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a  name from the .*
cb30: 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  * end of the fil
cb40: 65 20 61 6e 64 2c 20 69 66 20 73 75 63 63 65 73  e and, if succes
cb50: 73 66 75 6c 2c 20 63 6f 70 69 65 73 20 69 74 20  sful, copies it 
cb60: 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70  into memory supp
cb70: 6c 69 65 64 20 0a 2a 2a 20 62 79 20 74 68 65 20  lied .** by the 
cb80: 63 61 6c 6c 65 72 2e 20 53 65 65 20 63 6f 6d 6d  caller. See comm
cb90: 65 6e 74 73 20 61 62 6f 76 65 20 77 72 69 74 65  ents above write
cba0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20  MasterJournal() 
cbb0: 66 6f 72 20 74 68 65 20 66 6f 72 6d 61 74 0a 2a  for the format.*
cbc0: 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20  * used to store 
cbd0: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
cbe0: 20 66 69 6c 65 20 6e 61 6d 65 20 61 74 20 74 68   file name at th
cbf0: 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e  e end of a journ
cc00: 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a  al file..**.** z
cc10: 4d 61 73 74 65 72 20 6d 75 73 74 20 70 6f 69 6e  Master must poin
cc20: 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66  t to a buffer of
cc30: 20 61 74 20 6c 65 61 73 74 20 6e 4d 61 73 74 65   at least nMaste
cc40: 72 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65  r bytes allocate
cc50: 64 20 62 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c  d by.** the call
cc60: 65 72 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20  er. This should 
cc70: 62 65 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d  be sqlite3_vfs.m
cc80: 78 50 61 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20  xPathname+1 (to 
cc90: 65 6e 73 75 72 65 20 74 68 65 72 65 20 69 73 0a  ensure there is.
cca0: 2a 2a 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20  ** enough space 
ccb0: 74 6f 20 77 72 69 74 65 20 74 68 65 20 6d 61 73  to write the mas
ccc0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
ccd0: 29 2e 20 49 66 20 74 68 65 20 6d 61 73 74 65 72  ). If the master
cce0: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65   journal.** name
ccf0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
cd00: 69 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e  is longer than n
cd10: 4d 61 73 74 65 72 20 62 79 74 65 73 20 28 69 6e  Master bytes (in
cd20: 63 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c  cluding a.** nul
cd30: 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68  -terminator), th
cd40: 65 6e 20 74 68 69 73 20 69 73 20 68 61 6e 64 6c  en this is handl
cd50: 65 64 20 61 73 20 69 66 20 6e 6f 20 6d 61 73 74  ed as if no mast
cd60: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a  er journal name.
cd70: 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 20  ** were present 
cd80: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  in the journal..
cd90: 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 61 73 74 65  **.** If a maste
cda0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
cdb0: 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 61  ame is present a
cdc0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
cdd0: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
cde0: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 63 6f 70  , then it is cop
cdf0: 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62 75 66  ied into the buf
ce00: 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  fer pointed to b
ce10: 79 20 7a 4d 61 73 74 65 72 2e 20 41 0a 2a 2a 20  y zMaster. A.** 
ce20: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62  nul-terminator b
ce30: 79 74 65 20 69 73 20 61 70 70 65 6e 64 65 64 20  yte is appended 
ce40: 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 66 6f  to the buffer fo
ce50: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6d 61 73 74  llowing the mast
ce60: 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  er.** journal fi
ce70: 6c 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49  le name..**.** I
ce80: 66 20 69 74 20 69 73 20 64 65 74 65 72 6d 69 6e  f it is determin
ce90: 65 64 20 74 68 61 74 20 6e 6f 20 6d 61 73 74 65  ed that no maste
cea0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
ceb0: 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 0a  ame is present .
cec0: 2a 2a 20 7a 4d 61 73 74 65 72 5b 30 5d 20 69 73  ** zMaster[0] is
ced0: 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51   set to 0 and SQ
cee0: 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
cef0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
cf00: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
cf10: 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68   reading from th
cf20: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  e journal file, 
cf30: 61 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65 72 72  an SQLite.** err
cf40: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
cf50: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
cf60: 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75  nt readMasterJou
cf70: 72 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c  rnal(sqlite3_fil
cf80: 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a  e *pJrnl, char *
cf90: 7a 4d 61 73 74 65 72 2c 20 75 33 32 20 6e 4d 61  zMaster, u32 nMa
cfa0: 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ster){.  int rc;
cfb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cfc0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
cfd0: 64 65 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 3b  de */.  u32 len;
cfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cff0: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 69 6e 20     /* Length in 
d000: 62 79 74 65 73 20 6f 66 20 6d 61 73 74 65 72 20  bytes of master 
d010: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a  journal name */.
d020: 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20    i64 szJ;      
d030: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d040: 54 6f 74 61 6c 20 73 69 7a 65 20 69 6e 20 62 79  Total size in by
d050: 74 65 73 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66  tes of journal f
d060: 69 6c 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75  ile pJrnl */.  u
d070: 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20  32 cksum;       
d080: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 4a 20            /* MJ 
d090: 63 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 72  checksum value r
d0a0: 65 61 64 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c  ead from journal
d0b0: 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20   */.  u32 u;    
d0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0d0: 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f   /* Unsigned loo
d0e0: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75  p counter */.  u
d0f0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61  nsigned char aMa
d100: 67 69 63 5b 38 5d 3b 20 20 20 2f 2a 20 41 20 62  gic[8];   /* A b
d110: 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68  uffer to hold th
d120: 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a  e magic header *
d130: 2f 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d  /.  zMaster[0] =
d140: 20 27 5c 30 27 3b 0a 0a 20 20 69 66 28 20 53 51   '\0';..  if( SQ
d150: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
d160: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
d170: 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20  (pJrnl, &szJ)). 
d180: 20 20 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20 20 7c    || szJ<16.   |
d190: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
d1a0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a   = read32bits(pJ
d1b0: 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c 65  rnl, szJ-16, &le
d1c0: 6e 29 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e  n)).   || len>=n
d1d0: 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20 6c 65  Master .   || le
d1e0: 6e 3d 3d 30 20 0a 20 20 20 7c 7c 20 53 51 4c 49  n==0 .   || SQLI
d1f0: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
d200: 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73  d32bits(pJrnl, s
d210: 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29 29 0a  zJ-12, &cksum)).
d220: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
d230: 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
d240: 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67  Read(pJrnl, aMag
d250: 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 29 0a 20  ic, 8, szJ-8)). 
d260: 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67    || memcmp(aMag
d270: 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  ic, aJournalMagi
d280: 63 2c 20 38 29 0a 20 20 20 7c 7c 20 53 51 4c 49  c, 8).   || SQLI
d290: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
d2a0: 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c  ite3OsRead(pJrnl
d2b0: 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20  , zMaster, len, 
d2c0: 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20 20 29  szJ-16-len)).  )
d2d0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
d2e0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69  .  }..  /* See i
d2f0: 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d  f the checksum m
d300: 61 74 63 68 65 73 20 74 68 65 20 6d 61 73 74 65  atches the maste
d310: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
d320: 2f 0a 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6c  /.  for(u=0; u<l
d330: 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 63 6b  en; u++){.    ck
d340: 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 75  sum -= zMaster[u
d350: 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b 73  ];.  }.  if( cks
d360: 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  um ){.    /* If 
d370: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65  the checksum doe
d380: 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68 65  sn't add up, the
d390: 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66  n one or more of
d3a0: 20 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72   the disk sector
d3b0: 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e  s.    ** contain
d3c0: 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ing the master j
d3d0: 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20  ournal filename 
d3e0: 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68  is corrupted. Th
d3f0: 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20  is means.    ** 
d400: 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20  definitely roll 
d410: 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65  back, so just re
d420: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61  turn SQLITE_OK a
d430: 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c  nd report a (nul
d440: 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d  ).    ** master-
d450: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
d460: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e  ..    */.    len
d470: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73   = 0;.  }.  zMas
d480: 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b  ter[len] = '\0';
d490: 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51  .   .  return SQ
d4a0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
d4b0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66  * Return the off
d4c0: 73 65 74 20 6f 66 20 74 68 65 20 73 65 63 74 6f  set of the secto
d4d0: 72 20 62 6f 75 6e 64 61 72 79 20 61 74 20 6f 72  r boundary at or
d4e0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a   immediately .**
d4f0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 76   following the v
d500: 61 6c 75 65 20 69 6e 20 70 50 61 67 65 72 2d 3e  alue in pPager->
d510: 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 61 73 73 75  journalOff, assu
d520: 6d 69 6e 67 20 61 20 73 65 63 74 6f 72 20 0a 2a  ming a sector .*
d530: 2a 20 73 69 7a 65 20 6f 66 20 70 50 61 67 65 72  * size of pPager
d540: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 62 79 74  ->sectorSize byt
d550: 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f  es..**.** i.e fo
d560: 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20  r a sector size 
d570: 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20  of 512:.**.**   
d580: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66  Pager.journalOff
d590: 20 20 20 20 20 20 20 20 20 20 52 65 74 75 72 6e            Return
d5a0: 20 76 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d   value.**   ----
d5b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d5c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d5d0: 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20  ---.**   0      
d5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5f0: 20 20 20 30 0a 2a 2a 20 20 20 35 31 32 20 20 20     0.**   512   
d600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d610: 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 31 30 30      512.**   100
d620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d630: 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20         512.**   
d640: 32 30 30 30 20 20 20 20 20 20 20 20 20 20 20 20  2000            
d650: 20 20 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a            2048.*
d660: 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34  * .*/.static i64
d670: 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
d680: 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
d690: 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d  {.  i64 offset =
d6a0: 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50   0;.  i64 c = pP
d6b0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
d6c0: 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20  ;.  if( c ){.   
d6d0: 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29   offset = ((c-1)
d6e0: 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  /JOURNAL_HDR_SZ(
d6f0: 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a  pPager) + 1) * J
d700: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
d710: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73  ager);.  }.  ass
d720: 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52  ert( offset%JOUR
d730: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
d740: 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  r)==0 );.  asser
d750: 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a  t( offset>=c );.
d760: 20 20 61 73 73 65 72 74 28 20 28 6f 66 66 73 65    assert( (offse
d770: 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52  t-c)<JOURNAL_HDR
d780: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20  _SZ(pPager) );. 
d790: 20 72 65 74 75 72 6e 20 6f 66 66 73 65 74 3b 0a   return offset;.
d7a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  }../*.** The jou
d7b0: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
d7c0: 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73  e open when this
d7d0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
d7e0: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  led..**.** This 
d7f0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
d800: 2d 6f 70 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  -op if the journ
d810: 61 6c 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  al file has not 
d820: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 0a  been written to.
d830: 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 63 75  ** within the cu
d840: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
d850: 6e 20 28 69 2e 65 2e 20 69 66 20 50 61 67 65 72  n (i.e. if Pager
d860: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e  .journalOff==0).
d870: 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f 54 72 75 6e  .**.** If doTrun
d880: 63 61 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  cate is non-zero
d890: 20 6f 72 20 74 68 65 20 50 61 67 65 72 2e 6a 6f   or the Pager.jo
d8a0: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 76  urnalSizeLimit v
d8b0: 61 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20 73 65  ariable is.** se
d8c0: 74 20 74 6f 20 30 2c 20 74 68 65 6e 20 74 72 75  t to 0, then tru
d8d0: 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  ncate the journa
d8e0: 6c 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62  l file to zero b
d8f0: 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 4f 74  ytes in size. Ot
d900: 68 65 72 77 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f  herwise,.** zero
d910: 20 74 68 65 20 32 38 2d 62 79 74 65 20 68 65 61   the 28-byte hea
d920: 64 65 72 20 61 74 20 74 68 65 20 73 74 61 72 74  der at the start
d930: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
d940: 66 69 6c 65 2e 20 49 6e 20 65 69 74 68 65 72 20  file. In either 
d950: 63 61 73 65 2c 20 0a 2a 2a 20 69 66 20 74 68 65  case, .** if the
d960: 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e   pager is not in
d970: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 73   no-sync mode, s
d980: 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
d990: 66 69 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  file immediately
d9a0: 20 0a 2a 2a 20 61 66 74 65 72 20 77 72 69 74 69   .** after writi
d9b0: 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67  ng or truncating
d9c0: 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61   it..**.** If Pa
d9d0: 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  ger.journalSizeL
d9e0: 69 6d 69 74 20 69 73 20 73 65 74 20 74 6f 20 61  imit is set to a
d9f0: 20 70 6f 73 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a   positive, non-z
da00: 65 72 6f 20 76 61 6c 75 65 2c 20 61 6e 64 0a 2a  ero value, and.*
da10: 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  * following the 
da20: 74 72 75 6e 63 61 74 69 6f 6e 20 6f 72 20 7a 65  truncation or ze
da30: 72 6f 69 6e 67 20 64 65 73 63 72 69 62 65 64 20  roing described 
da40: 61 62 6f 76 65 20 74 68 65 20 73 69 7a 65 20 6f  above the size o
da50: 66 20 74 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61  f the .** journa
da60: 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20  l file in bytes 
da70: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
da80: 68 69 73 20 76 61 6c 75 65 2c 20 74 68 65 6e 20  his value, then 
da90: 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20  truncate the.** 
daa0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
dab0: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a  Pager.journalSiz
dac0: 65 4c 69 6d 69 74 20 62 79 74 65 73 2e 20 54 68  eLimit bytes. Th
dad0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
dae0: 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64 20  oes.** not need 
daf0: 74 6f 20 62 65 20 73 79 6e 63 65 64 20 66 6f 6c  to be synced fol
db00: 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72  lowing this oper
db10: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ation..**.** If 
db20: 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
db30: 72 73 2c 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63  rs, abandon proc
db40: 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72  essing and retur
db50: 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  n the IO error c
db60: 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ode..** Otherwis
db70: 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  e, return SQLITE
db80: 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  _OK..*/.static i
db90: 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64  nt zeroJournalHd
dba0: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
dbb0: 20 69 6e 74 20 64 6f 54 72 75 6e 63 61 74 65 29   int doTruncate)
dbc0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
dbd0: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
dbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbf0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
dc00: 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  code */.  assert
dc10: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
dc20: 3e 6a 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72  >jfd) );.  asser
dc30: 74 28 20 21 73 71 6c 69 74 65 33 4a 6f 75 72 6e  t( !sqlite3Journ
dc40: 61 6c 49 73 49 6e 4d 65 6d 6f 72 79 28 70 50 61  alIsInMemory(pPa
dc50: 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 69  ger->jfd) );.  i
dc60: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
dc70: 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 63 6f 6e  alOff ){.    con
dc80: 73 74 20 69 36 34 20 69 4c 69 6d 69 74 20 3d 20  st i64 iLimit = 
dc90: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
dca0: 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20  izeLimit;    /* 
dcb0: 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 6a  Local cache of j
dcc0: 73 6c 20 2a 2f 0a 0a 20 20 20 20 49 4f 54 52 41  sl */..    IOTRA
dcd0: 43 45 28 28 22 4a 5a 45 52 4f 48 44 52 20 25 70  CE(("JZEROHDR %p
dce0: 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
dcf0: 20 20 69 66 28 20 64 6f 54 72 75 6e 63 61 74 65    if( doTruncate
dd00: 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30 20 29 7b   || iLimit==0 ){
dd10: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
dd20: 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
dd30: 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20  ager->jfd, 0);. 
dd40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
dd50: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
dd60: 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d 20 3d 20  r zeroHdr[28] = 
dd70: 7b 30 7d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  {0};.      rc = 
dd80: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
dd90: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f  Pager->jfd, zero
dda0: 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f  Hdr, sizeof(zero
ddb0: 48 64 72 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Hdr), 0);.    }.
ddc0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
ddd0: 54 45 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72  TE_OK && !pPager
dde0: 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
ddf0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
de00: 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
de10: 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41  , SQLITE_SYNC_DA
de20: 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73  TAONLY|pPager->s
de30: 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d  yncFlags);.    }
de40: 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73  ..    /* At this
de50: 20 70 6f 69 6e 74 20 74 68 65 20 74 72 61 6e 73   point the trans
de60: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
de70: 74 65 64 20 62 75 74 20 74 68 65 20 77 72 69 74  ted but the writ
de80: 65 20 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69  e lock .    ** i
de90: 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20  s still held on 
dea0: 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  the file. If the
deb0: 72 65 20 69 73 20 61 20 73 69 7a 65 20 6c 69 6d  re is a size lim
dec0: 69 74 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f  it configured fo
ded0: 72 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 65  r .    ** the pe
dee0: 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c  rsistent journal
def0: 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c   and the journal
df00: 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20   file currently 
df10: 63 6f 6e 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20  consumes more.  
df20: 20 20 2a 2a 20 73 70 61 63 65 20 74 68 61 6e 20    ** space than 
df30: 74 68 61 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77  that limit allow
df40: 73 20 66 6f 72 2c 20 74 72 75 6e 63 61 74 65 20  s for, truncate 
df50: 69 74 20 6e 6f 77 2e 20 54 68 65 72 65 20 69 73  it now. There is
df60: 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20   no need.    ** 
df70: 74 6f 20 73 79 6e 63 20 74 68 65 20 66 69 6c 65  to sync the file
df80: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
df90: 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  operation..    *
dfa0: 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
dfb0: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69  LITE_OK && iLimi
dfc0: 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 36 34  t>0 ){.      i64
dfd0: 20 73 7a 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   sz;.      rc = 
dfe0: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
dff0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
e000: 73 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  sz);.      if( r
e010: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
e020: 73 7a 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  sz>iLimit ){.   
e030: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
e040: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
e050: 65 72 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29  er->jfd, iLimit)
e060: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
e070: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
e080: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .}../*.** The jo
e090: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
e0a0: 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  be open when thi
e0b0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
e0c0: 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a  led. A journal.*
e0d0: 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41  * header (JOURNA
e0e0: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20  L_HDR_SZ bytes) 
e0f0: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
e100: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
e110: 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65   at the.** curre
e120: 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a  nt location..**.
e130: 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f  ** The format fo
e140: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  r the journal he
e150: 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f  ader is as follo
e160: 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73  ws:.** - 8 bytes
e170: 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79  : Magic identify
e180: 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ing journal form
e190: 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  at..** - 4 bytes
e1a0: 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  : Number of reco
e1b0: 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  rds in journal, 
e1c0: 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f  or -1 no-sync mo
e1d0: 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34  de is on..** - 4
e1e0: 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e   bytes: Random n
e1f0: 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20 70  umber used for p
e200: 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34  age hash..** - 4
e210: 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20   bytes: Initial 
e220: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f  database page co
e230: 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  unt..** - 4 byte
e240: 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75  s: Sector size u
e250: 73 65 64 20 62 79 20 74 68 65 20 70 72 6f 63 65  sed by the proce
e260: 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68  ss that wrote th
e270: 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d  is journal..** -
e280: 20 34 20 62 79 74 65 73 3a 20 44 61 74 61 62 61   4 bytes: Databa
e290: 73 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  se page size..**
e2a0: 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79   .** Followed by
e2b0: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
e2c0: 20 2d 20 32 38 29 20 62 79 74 65 73 20 6f 66 20   - 28) bytes of 
e2d0: 75 6e 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f  unused space..*/
e2e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
e2f0: 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65  eJournalHdr(Page
e300: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
e310: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
e320: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e330: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
e340: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 48 65 61   */.  char *zHea
e350: 64 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  der = pPager->pT
e360: 6d 70 53 70 61 63 65 3b 20 20 2f 2a 20 54 65 6d  mpSpace;  /* Tem
e370: 70 6f 72 61 72 79 20 73 70 61 63 65 20 75 73 65  porary space use
e380: 64 20 74 6f 20 62 75 69 6c 64 20 68 65 61 64 65  d to build heade
e390: 72 20 2a 2f 0a 20 20 75 33 32 20 6e 48 65 61 64  r */.  u32 nHead
e3a0: 65 72 20 3d 20 28 75 33 32 29 70 50 61 67 65 72  er = (u32)pPager
e3b0: 2d 3e 70 61 67 65 53 69 7a 65 3b 2f 2a 20 53 69  ->pageSize;/* Si
e3c0: 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70 6f 69  ze of buffer poi
e3d0: 6e 74 65 64 20 74 6f 20 62 79 20 7a 48 65 61 64  nted to by zHead
e3e0: 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 57 72 69  er */.  u32 nWri
e3f0: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
e400: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
e410: 79 74 65 73 20 6f 66 20 68 65 61 64 65 72 20 73  ytes of header s
e420: 65 63 74 6f 72 20 77 72 69 74 74 65 6e 20 2a 2f  ector written */
e430: 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20  .  int ii;      
e440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e450: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
e460: 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73  ounter */..  ass
e470: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
e480: 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20  er->jfd) );     
e490: 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65   /* Journal file
e4a0: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a   must be open. *
e4b0: 2f 0a 0a 20 20 69 66 28 20 6e 48 65 61 64 65 72  /..  if( nHeader
e4c0: 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  >JOURNAL_HDR_SZ(
e4d0: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 6e  pPager) ){.    n
e4e0: 48 65 61 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c  Header = JOURNAL
e4f0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
e500: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
e510: 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20 73  ere are active s
e520: 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 61 6e  avepoints and an
e530: 79 20 6f 66 20 74 68 65 6d 20 77 65 72 65 20 63  y of them were c
e540: 72 65 61 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e  reated .  ** sin
e550: 63 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  ce the most rece
e560: 6e 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  nt journal heade
e570: 72 20 77 61 73 20 77 72 69 74 74 65 6e 2c 20 75  r was written, u
e580: 70 64 61 74 65 20 74 68 65 20 0a 20 20 2a 2a 20  pdate the .  ** 
e590: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
e5a0: 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64 73  HdrOffset fields
e5b0: 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72   now..  */.  for
e5c0: 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72  (ii=0; ii<pPager
e5d0: 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69  ->nSavepoint; ii
e5e0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  ++){.    if( pPa
e5f0: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
e600: 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 3d 3d  ii].iHdrOffset==
e610: 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  0 ){.      pPage
e620: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
e630: 5d 2e 69 48 64 72 4f 66 66 73 65 74 20 3d 20 70  ].iHdrOffset = p
e640: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
e650: 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  f;.    }.  }..  
e660: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
e670: 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  dr = pPager->jou
e680: 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61  rnalOff = journa
e690: 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
e6a0: 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  r);..  /* .  ** 
e6b0: 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 46  Write the nRec F
e6c0: 69 65 6c 64 20 2d 20 74 68 65 20 6e 75 6d 62 65  ield - the numbe
e6d0: 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64  r of page record
e6e0: 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68  s that follow th
e6f0: 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  is.  ** journal 
e700: 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79  header. Normally
e710: 2c 20 7a 65 72 6f 20 69 73 20 77 72 69 74 74 65  , zero is writte
e720: 6e 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20  n to this value 
e730: 61 74 20 74 68 69 73 20 74 69 6d 65 2e 0a 20 20  at this time..  
e740: 2a 2a 20 41 66 74 65 72 20 74 68 65 20 72 65 63  ** After the rec
e750: 6f 72 64 73 20 61 72 65 20 61 64 64 65 64 20 74  ords are added t
e760: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61  o the journal (a
e770: 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73  nd the journal s
e780: 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20  ynced, .  ** if 
e790: 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
e7a0: 65 29 2c 20 74 68 65 20 7a 65 72 6f 20 69 73 20  e), the zero is 
e7b0: 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69 74 68  overwritten with
e7c0: 20 74 68 65 20 74 72 75 65 20 6e 75 6d 62 65 72   the true number
e7d0: 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73  .  ** of records
e7e0: 20 28 73 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61   (see syncJourna
e7f0: 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  l())..  **.  ** 
e800: 41 20 66 61 73 74 65 72 20 61 6c 74 65 72 6e 61  A faster alterna
e810: 74 69 76 65 20 69 73 20 74 6f 20 77 72 69 74 65  tive is to write
e820: 20 30 78 46 46 46 46 46 46 46 46 20 74 6f 20 74   0xFFFFFFFF to t
e830: 68 65 20 6e 52 65 63 20 66 69 65 6c 64 2e 20 57  he nRec field. W
e840: 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67  hen.  ** reading
e850: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69   the journal thi
e860: 73 20 76 61 6c 75 65 20 74 65 6c 6c 73 20 53 51  s value tells SQ
e870: 4c 69 74 65 20 74 6f 20 61 73 73 75 6d 65 20 74  Lite to assume t
e880: 68 61 74 20 74 68 65 0a 20 20 2a 2a 20 72 65 73  hat the.  ** res
e890: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
e8a0: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76   file contains v
e8b0: 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64  alid page record
e8c0: 73 2e 20 54 68 69 73 20 61 73 73 75 6d 70 74 69  s. This assumpti
e8d0: 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61 6e 67 65  on.  ** is dange
e8e0: 72 6f 75 73 2c 20 61 73 20 69 66 20 61 20 66 61  rous, as if a fa
e8f0: 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77  ilure occurred w
e900: 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f  hilst writing to
e910: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a   the journal.  *
e920: 2a 20 66 69 6c 65 20 69 74 20 6d 61 79 20 63 6f  * file it may co
e930: 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61 72 62 61  ntain some garba
e940: 67 65 20 64 61 74 61 2e 20 54 68 65 72 65 20 61  ge data. There a
e950: 72 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73  re two scenarios
e960: 0a 20 20 2a 2a 20 77 68 65 72 65 20 74 68 69 73  .  ** where this
e970: 20 72 69 73 6b 20 63 61 6e 20 62 65 20 69 67 6e   risk can be ign
e980: 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ored:.  **.  ** 
e990: 20 20 2a 20 57 68 65 6e 20 74 68 65 20 70 61 67    * When the pag
e9a0: 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63  er is in no-sync
e9b0: 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70 74 69 6f   mode. Corruptio
e9c0: 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20  n can follow a. 
e9d0: 20 2a 2a 20 20 20 20 20 70 6f 77 65 72 20 66 61   **     power fa
e9e0: 69 6c 75 72 65 20 69 6e 20 74 68 69 73 20 63 61  ilure in this ca
e9f0: 73 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a  se anyway..  **.
ea00: 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68    **   * When th
ea10: 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  e SQLITE_IOCAP_S
ea20: 41 46 45 5f 41 50 50 45 4e 44 20 66 6c 61 67 20  AFE_APPEND flag 
ea30: 69 73 20 73 65 74 2e 20 54 68 69 73 20 67 75 61  is set. This gua
ea40: 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20 20 20 20  rantees.  **    
ea50: 20 74 68 61 74 20 67 61 72 62 61 67 65 20 64 61   that garbage da
ea60: 74 61 20 69 73 20 6e 65 76 65 72 20 61 70 70 65  ta is never appe
ea70: 6e 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72  nded to the jour
ea80: 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  nal file..  */. 
ea90: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
eaa0: 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
eab0: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b  Pager->noSync );
eac0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
ead0: 6f 53 79 6e 63 20 7c 7c 20 28 70 50 61 67 65 72  oSync || (pPager
eae0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
eaf0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
eb00: 5f 4d 45 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28  _MEMORY).   || (
eb10: 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
eb20: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
eb30: 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54  Pager->fd)&SQLIT
eb40: 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
eb50: 45 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d  END) .  ){.    m
eb60: 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61  emcpy(zHeader, a
eb70: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
eb80: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
eb90: 69 63 29 29 3b 0a 20 20 20 20 70 75 74 33 32 62  ic));.    put32b
eba0: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
ebb0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
ebc0: 63 29 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29  c)], 0xffffffff)
ebd0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d  ;.  }else{.    m
ebe0: 65 6d 73 65 74 28 7a 48 65 61 64 65 72 2c 20 30  emset(zHeader, 0
ebf0: 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
ec00: 6c 4d 61 67 69 63 29 2b 34 29 3b 0a 20 20 7d 0a  lMagic)+4);.  }.
ec10: 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d  .  /* The random
ec20: 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74   check-hash init
ec30: 69 61 6c 69 7a 65 72 20 2a 2f 20 0a 20 20 73 71  ializer */ .  sq
ec40: 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
ec50: 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  (sizeof(pPager->
ec60: 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61  cksumInit), &pPa
ec70: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
ec80: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
ec90: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
eca0: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20  urnalMagic)+4], 
ecb0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
ecc0: 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69  t);.  /* The ini
ecd0: 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 73 69  tial database si
ece0: 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  ze */.  put32bit
ecf0: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
ed00: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
ed10: 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f  +8], pPager->dbO
ed20: 72 69 67 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54  rigSize);.  /* T
ed30: 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f  he assumed secto
ed40: 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  r size for this 
ed50: 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74  process */.  put
ed60: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
ed70: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
ed80: 61 67 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65  agic)+12], pPage
ed90: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a  r->sectorSize);.
eda0: 0a 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 73  .  /* The page s
edb0: 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69  ize */.  put32bi
edc0: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
edd0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
ede0: 29 2b 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70  )+16], pPager->p
edf0: 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20  ageSize);..  /* 
ee00: 49 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  Initializing the
ee10: 20 74 61 69 6c 20 6f 66 20 74 68 65 20 62 75 66   tail of the buf
ee20: 66 65 72 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  fer is not neces
ee30: 73 61 72 79 2e 20 20 45 76 65 72 79 74 68 69 6e  sary.  Everythin
ee40: 67 0a 20 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e  g.  ** works fin
ee50: 64 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  d if the followi
ee60: 6e 67 20 6d 65 6d 73 65 74 28 29 20 69 73 20 6f  ng memset() is o
ee70: 6d 69 74 74 65 64 2e 20 20 42 75 74 20 69 6e 69  mitted.  But ini
ee80: 74 69 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74  tializing.  ** t
ee90: 68 65 20 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e  he memory preven
eea0: 74 73 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d  ts valgrind from
eeb0: 20 63 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f   complaining, so
eec0: 20 77 65 20 61 72 65 20 77 69 6c 6c 69 6e 67 20   we are willing 
eed0: 74 6f 0a 20 20 2a 2a 20 74 61 6b 65 20 74 68 65  to.  ** take the
eee0: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74   performance hit
eef0: 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ..  */.  memset(
ef00: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
ef10: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32  aJournalMagic)+2
ef20: 30 5d 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  0], 0,.         
ef30: 6e 48 65 61 64 65 72 2d 28 73 69 7a 65 6f 66 28  nHeader-(sizeof(
ef40: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32  aJournalMagic)+2
ef50: 30 29 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68  0));..  /* In th
ef60: 65 6f 72 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79  eory, it is only
ef70: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72   necessary to wr
ef80: 69 74 65 20 74 68 65 20 32 38 20 62 79 74 65 73  ite the 28 bytes
ef90: 20 74 68 61 74 20 74 68 65 20 0a 20 20 2a 2a 20   that the .  ** 
efa0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 63  journal header c
efb0: 6f 6e 73 75 6d 65 73 20 74 6f 20 74 68 65 20 6a  onsumes to the j
efc0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65  ournal file here
efd0: 2e 20 54 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74  . Then increment
efe0: 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72   the .  ** Pager
eff0: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 76 61 72 69  .journalOff vari
f000: 61 62 6c 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f  able by JOURNAL_
f010: 48 44 52 5f 53 5a 20 73 6f 20 74 68 61 74 20 74  HDR_SZ so that t
f020: 68 65 20 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65  he next .  ** re
f030: 63 6f 72 64 20 69 73 20 77 72 69 74 74 65 6e 20  cord is written 
f040: 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
f050: 20 73 65 63 74 6f 72 20 28 6c 65 61 76 69 6e 67   sector (leaving
f060: 20 61 20 67 61 70 20 69 6e 20 74 68 65 20 66 69   a gap in the fi
f070: 6c 65 0a 20 20 2a 2a 20 74 68 61 74 20 77 69 6c  le.  ** that wil
f080: 6c 20 62 65 20 69 6d 70 6c 69 63 69 74 6c 79 20  l be implicitly 
f090: 66 69 6c 6c 65 64 20 69 6e 20 62 79 20 74 68 65  filled in by the
f0a0: 20 4f 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20   OS)..  **.  ** 
f0b0: 48 6f 77 65 76 65 72 20 69 74 20 68 61 73 20 62  However it has b
f0c0: 65 65 6e 20 64 69 73 63 6f 76 65 72 65 64 20 74  een discovered t
f0d0: 68 61 74 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74  hat on some syst
f0e0: 65 6d 73 20 74 68 69 73 20 70 61 74 74 65 72 6e  ems this pattern
f0f0: 20 63 61 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69   can .  ** be si
f100: 67 6e 69 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77  gnificantly slow
f110: 65 72 20 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f  er than contiguo
f120: 75 73 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74  usly writing dat
f130: 61 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20  a to the file,. 
f140: 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 61 74   ** even if that
f150: 20 6d 65 61 6e 73 20 65 78 70 6c 69 63 69 74 6c   means explicitl
f160: 79 20 77 72 69 74 69 6e 67 20 64 61 74 61 20 74  y writing data t
f170: 6f 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a  o the block of .
f180: 20 20 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44    ** (JOURNAL_HD
f190: 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73  R_SZ - 28) bytes
f1a0: 20 74 68 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62   that will not b
f1b0: 65 20 75 73 65 64 2e 20 53 6f 20 74 68 61 74 20  e used. So that 
f1c0: 69 73 20 77 68 61 74 0a 20 20 2a 2a 20 69 73 20  is what.  ** is 
f1d0: 64 6f 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  done. .  **.  **
f1e0: 20 54 68 65 20 6c 6f 6f 70 20 69 73 20 72 65 71   The loop is req
f1f0: 75 69 72 65 64 20 68 65 72 65 20 69 6e 20 63 61  uired here in ca
f200: 73 65 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69  se the sector-si
f210: 7a 65 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  ze is larger tha
f220: 6e 20 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61  n the .  ** data
f230: 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e 20  base page size. 
f240: 53 69 6e 63 65 20 74 68 65 20 7a 48 65 61 64 65  Since the zHeade
f250: 72 20 62 75 66 66 65 72 20 69 73 20 6f 6e 6c 79  r buffer is only
f260: 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a   Pager.pageSize.
f270: 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69    ** bytes in si
f280: 7a 65 2c 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  ze, more than on
f290: 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
f2a0: 33 4f 73 57 72 69 74 65 28 29 20 6d 61 79 20 62  3OsWrite() may b
f2b0: 65 20 72 65 71 75 69 72 65 64 0a 20 20 2a 2a 20  e required.  ** 
f2c0: 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  to populate the 
f2d0: 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68  entire journal h
f2e0: 65 61 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20  eader sector..  
f2f0: 2a 2f 20 0a 20 20 66 6f 72 28 6e 57 72 69 74 65  */ .  for(nWrite
f300: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
f310: 4b 26 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41  K&&nWrite<JOURNA
f320: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
f330: 3b 20 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64 65  ; nWrite+=nHeade
f340: 72 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28  r){.    IOTRACE(
f350: 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25  ("JHDR %p %lld %
f360: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
f370: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
f380: 2c 20 6e 48 65 61 64 65 72 29 29 0a 20 20 20 20  , nHeader)).    
f390: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
f3a0: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
f3b0: 20 7a 48 65 61 64 65 72 2c 20 6e 48 65 61 64 65   zHeader, nHeade
f3c0: 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r, pPager->journ
f3d0: 61 6c 4f 66 66 29 3b 0a 20 20 20 20 61 73 73 65  alOff);.    asse
f3e0: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
f3f0: 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72  nalHdr <= pPager
f400: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a  ->journalOff );.
f410: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
f420: 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65  nalOff += nHeade
f430: 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  r;.  }..  return
f440: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
f450: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
f460: 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e  ust be open when
f470: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e   this is called.
f480: 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   A journal heade
f490: 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e  r file.** (JOURN
f4a0: 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29  AL_HDR_SZ bytes)
f4b0: 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68   is read from th
f4c0: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
f4d0: 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  on in the journa
f4e0: 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54 68 65 20 63  l.** file. The c
f4f0: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20  urrent location 
f500: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
f510: 69 6c 65 20 69 73 20 67 69 76 65 6e 20 62 79 0a  ile is given by.
f520: 2a 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ** pPager->journ
f530: 61 6c 4f 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65  alOff. See comme
f540: 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69  nts above functi
f550: 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48  on writeJournalH
f560: 64 72 28 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65  dr() for.** a de
f570: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
f580: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
f590: 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  format..**.** If
f5a0: 20 74 68 65 20 68 65 61 64 65 72 20 69 73 20 72   the header is r
f5b0: 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ead successfully
f5c0: 2c 20 2a 70 4e 52 65 63 20 69 73 20 73 65 74 20  , *pNRec is set 
f5d0: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
f5e0: 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73  .** page records
f5f0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
f600: 68 65 61 64 65 72 20 61 6e 64 20 2a 70 44 62 53  header and *pDbS
f610: 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ize is set to th
f620: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  e size of the.**
f630: 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
f640: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
f650: 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73   began, in pages
f660: 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e  . Also, pPager->
f670: 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20  cksumInit.** is 
f680: 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
f690: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
f6a0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53  ournal header. S
f6b0: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
f6c0: 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20  rned.** in this 
f6d0: 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  case..**.** If t
f6e0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
f6f0: 72 20 66 69 6c 65 20 61 70 70 65 61 72 73 20 74  r file appears t
f700: 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20  o be corrupted, 
f710: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a  SQLITE_DONE is.*
f720: 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  * returned and *
f730: 70 4e 52 65 63 20 61 6e 64 20 2a 50 44 62 53 69  pNRec and *PDbSi
f740: 7a 65 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64  ze are undefined
f750: 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44  .  If JOURNAL_HD
f760: 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61  R_SZ bytes.** ca
f770: 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f  nnot be read fro
f780: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
f790: 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  le an error code
f7a0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
f7b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
f7c0: 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61  JournalHdr(.  Pa
f7d0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
f7e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
f7f0: 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
f800: 69 6e 74 20 69 73 48 6f 74 2c 0a 20 20 69 36 34  int isHot,.  i64
f810: 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20   journalSize,   
f820: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
f830: 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f  e of the open jo
f840: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79  urnal file in by
f850: 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e  tes */.  u32 *pN
f860: 52 65 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  Rec,            
f870: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61        /* OUT: Va
f880: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
f890: 65 20 6e 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a  e nRec field */.
f8a0: 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65 20 20    u32 *pDbSize  
f8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f8c0: 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 6f 66 20  * OUT: Value of 
f8d0: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
f8e0: 65 20 73 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a  e size field */.
f8f0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
f900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f910: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
f920: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
f930: 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20  har aMagic[8];  
f940: 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74     /* A buffer t
f950: 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63  o hold the magic
f960: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34   header */.  i64
f970: 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20   iHdrOff;       
f980: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
f990: 73 65 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  set of journal h
f9a0: 65 61 64 65 72 20 62 65 69 6e 67 20 72 65 61 64  eader being read
f9b0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69   */..  assert( i
f9c0: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
f9d0: 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f  d) );      /* Jo
f9e0: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
f9f0: 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f  be open. */..  /
fa00: 2a 20 41 64 76 61 6e 63 65 20 50 61 67 65 72 2e  * Advance Pager.
fa10: 6a 6f 75 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68  journalOff to th
fa20: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e  e start of the n
fa30: 65 78 74 20 73 65 63 74 6f 72 2e 20 49 66 20 74  ext sector. If t
fa40: 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  he.  ** journal 
fa50: 66 69 6c 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c  file is too smal
fa60: 6c 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62  l for there to b
fa70: 65 20 61 20 68 65 61 64 65 72 20 73 74 6f 72 65  e a header store
fa80: 64 20 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 70  d at this.  ** p
fa90: 6f 69 6e 74 2c 20 72 65 74 75 72 6e 20 53 51 4c  oint, return SQL
faa0: 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20  ITE_DONE..  */. 
fab0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
fac0: 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  Off = journalHdr
fad0: 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
fae0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
faf0: 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c  urnalOff+JOURNAL
fb00: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
fb10: 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b  > journalSize ){
fb20: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
fb30: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69  TE_DONE;.  }.  i
fb40: 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  HdrOff = pPager-
fb50: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20  >journalOff;..  
fb60: 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20 66  /* Read in the f
fb70: 69 72 73 74 20 38 20 62 79 74 65 73 20 6f 66 20  irst 8 bytes of 
fb80: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
fb90: 65 72 2e 20 49 66 20 74 68 65 79 20 64 6f 20 6e  er. If they do n
fba0: 6f 74 20 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68  ot match.  ** th
fbb0: 65 20 20 6d 61 67 69 63 20 73 74 72 69 6e 67 20  e  magic string 
fbc0: 66 6f 75 6e 64 20 61 74 20 74 68 65 20 73 74 61  found at the sta
fbd0: 72 74 20 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e  rt of each journ
fbe0: 61 6c 20 68 65 61 64 65 72 2c 20 72 65 74 75 72  al header, retur
fbf0: 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f  n.  ** SQLITE_DO
fc00: 4e 45 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  NE. If an IO err
fc10: 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
fc20: 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e  n an error code.
fc30: 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a   Otherwise,.  **
fc40: 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20   proceed..  */. 
fc50: 20 69 66 28 20 69 73 48 6f 74 20 7c 7c 20 69 48   if( isHot || iH
fc60: 64 72 4f 66 66 21 3d 70 50 61 67 65 72 2d 3e 6a  drOff!=pPager->j
fc70: 6f 75 72 6e 61 6c 48 64 72 20 29 7b 0a 20 20 20  ournalHdr ){.   
fc80: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
fc90: 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ead(pPager->jfd,
fca0: 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28   aMagic, sizeof(
fcb0: 61 4d 61 67 69 63 29 2c 20 69 48 64 72 4f 66 66  aMagic), iHdrOff
fcc0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
fcd0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
fce0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
fcf0: 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
fd00: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
fd10: 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30  zeof(aMagic))!=0
fd20: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
fd30: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
fd40: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65    }.  }..  /* Re
fd50: 61 64 20 74 68 65 20 66 69 72 73 74 20 74 68 72  ad the first thr
fd60: 65 65 20 33 32 2d 62 69 74 20 66 69 65 6c 64 73  ee 32-bit fields
fd70: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
fd80: 68 65 61 64 65 72 3a 20 54 68 65 20 6e 52 65 63  header: The nRec
fd90: 0a 20 20 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65  .  ** field, the
fda0: 20 63 68 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61   checksum-initia
fdb0: 6c 69 7a 65 72 20 61 6e 64 20 74 68 65 20 64 61  lizer and the da
fdc0: 74 61 62 61 73 65 20 73 69 7a 65 20 61 74 20 74  tabase size at t
fdd0: 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66  he start.  ** of
fde0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
fdf0: 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  . Return an erro
fe00: 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69  r code if anythi
fe10: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20  ng goes wrong.. 
fe20: 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45   */.  if( SQLITE
fe30: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
fe40: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
fe50: 64 2c 20 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e  d, iHdrOff+8, pN
fe60: 52 65 63 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49  Rec)).   || SQLI
fe70: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
fe80: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
fe90: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c  jfd, iHdrOff+12,
fea0: 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49   &pPager->cksumI
feb0: 6e 69 74 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49  nit)).   || SQLI
fec0: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
fed0: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
fee0: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c  jfd, iHdrOff+16,
fef0: 20 70 44 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a   pDbSize)).  ){.
ff00: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
ff10: 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72   }..  if( pPager
ff20: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20  ->journalOff==0 
ff30: 29 7b 0a 20 20 20 20 75 33 32 20 69 50 61 67 65  ){.    u32 iPage
ff40: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
ff50: 20 20 20 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65      /* Page-size
ff60: 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61   field of journa
ff70: 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20  l header */.    
ff80: 75 33 32 20 69 53 65 63 74 6f 72 53 69 7a 65 3b  u32 iSectorSize;
ff90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ffa0: 53 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c  Sector-size fiel
ffb0: 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61  d of journal hea
ffc0: 64 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52  der */..    /* R
ffd0: 65 61 64 20 74 68 65 20 70 61 67 65 2d 73 69 7a  ead the page-siz
ffe0: 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a  e and sector-siz
fff0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
10000 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20 20 20 20   fields. */.    
10010 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
10020 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
10030 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
10040 72 4f 66 66 2b 32 30 2c 20 26 69 53 65 63 74 6f  rOff+20, &iSecto
10050 72 53 69 7a 65 29 29 0a 20 20 20 20 20 7c 7c 20  rSize)).     || 
10060 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
10070 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
10080 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
10090 2b 32 34 2c 20 26 69 50 61 67 65 53 69 7a 65 29  +24, &iPageSize)
100a0 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
100b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
100c0 0a 20 20 20 20 2f 2a 20 56 65 72 73 69 6f 6e 73  .    /* Versions
100d0 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72   of SQLite prior
100e0 20 74 6f 20 33 2e 35 2e 38 20 73 65 74 20 74 68   to 3.5.8 set th
100f0 65 20 70 61 67 65 2d 73 69 7a 65 20 66 69 65 6c  e page-size fiel
10100 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  d of the.    ** 
10110 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74  journal header t
10120 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20  o zero. In this 
10130 63 61 73 65 2c 20 61 73 73 75 6d 65 20 74 68 61  case, assume tha
10140 74 20 74 68 65 20 50 61 67 65 72 2e 70 61 67 65  t the Pager.page
10150 53 69 7a 65 0a 20 20 20 20 2a 2a 20 76 61 72 69  Size.    ** vari
10160 61 62 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20  able is already 
10170 73 65 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65  set to the corre
10180 63 74 20 70 61 67 65 20 73 69 7a 65 2e 0a 20 20  ct page size..  
10190 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61    */.    if( iPa
101a0 67 65 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20  geSize==0 ){.   
101b0 20 20 20 69 50 61 67 65 53 69 7a 65 20 3d 20 70     iPageSize = p
101c0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
101d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
101e0 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 76 61  heck that the va
101f0 6c 75 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74  lues read from t
10200 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64  he page-size and
10210 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65   sector-size fie
10220 6c 64 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 77  lds.    ** are w
10230 69 74 68 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20  ithin range. To 
10240 62 65 20 27 69 6e 20 72 61 6e 67 65 27 2c 20 62  be 'in range', b
10250 6f 74 68 20 76 61 6c 75 65 73 20 6e 65 65 64 20  oth values need 
10260 74 6f 20 62 65 20 61 20 70 6f 77 65 72 0a 20 20  to be a power.  
10270 20 20 2a 2a 20 6f 66 20 74 77 6f 20 67 72 65 61    ** of two grea
10280 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
10290 6c 20 74 6f 20 35 31 32 20 6f 72 20 33 32 2c 20  l to 512 or 32, 
102a0 61 6e 64 20 6e 6f 74 20 67 72 65 61 74 65 72 20  and not greater 
102b0 74 68 61 6e 20 74 68 65 69 72 20 0a 20 20 20 20  than their .    
102c0 2a 2a 20 72 65 73 70 65 63 74 69 76 65 20 63 6f  ** respective co
102d0 6d 70 69 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d  mpile time maxim
102e0 75 6d 20 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a  um limits..    *
102f0 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 53  /.    if( iPageS
10300 69 7a 65 3c 35 31 32 20 20 20 20 20 20 20 20 20  ize<512         
10310 20 20 20 20 20 20 20 20 20 7c 7c 20 69 53 65 63           || iSec
10320 74 6f 72 53 69 7a 65 3c 33 32 0a 20 20 20 20 20  torSize<32.     
10330 7c 7c 20 69 50 61 67 65 53 69 7a 65 3e 53 51 4c  || iPageSize>SQL
10340 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
10350 45 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65  E || iSectorSize
10360 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45  >MAX_SECTOR_SIZE
10370 0a 20 20 20 20 20 7c 7c 20 28 28 69 50 61 67 65  .     || ((iPage
10380 53 69 7a 65 2d 31 29 26 69 50 61 67 65 53 69 7a  Size-1)&iPageSiz
10390 65 29 21 3d 30 20 20 20 7c 7c 20 28 28 69 53 65  e)!=0   || ((iSe
103a0 63 74 6f 72 53 69 7a 65 2d 31 29 26 69 53 65 63  ctorSize-1)&iSec
103b0 74 6f 72 53 69 7a 65 29 21 3d 30 20 0a 20 20 20  torSize)!=0 .   
103c0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
103d0 74 68 65 20 65 69 74 68 65 72 20 74 68 65 20 70  the either the p
103e0 61 67 65 2d 73 69 7a 65 20 6f 72 20 73 65 63 74  age-size or sect
103f0 6f 72 2d 73 69 7a 65 20 69 6e 20 74 68 65 20 6a  or-size in the j
10400 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73  ournal-header is
10410 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c   .      ** inval
10420 69 64 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f  id, then the pro
10430 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20  cess that wrote 
10440 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  the journal-head
10450 65 72 20 6d 75 73 74 20 68 61 76 65 20 0a 20 20  er must have .  
10460 20 20 20 20 2a 2a 20 63 72 61 73 68 65 64 20 62      ** crashed b
10470 65 66 6f 72 65 20 74 68 65 20 68 65 61 64 65 72  efore the header
10480 20 77 61 73 20 73 79 6e 63 65 64 2e 20 49 6e 20   was synced. In 
10490 74 68 69 73 20 63 61 73 65 20 73 74 6f 70 20 72  this case stop r
104a0 65 61 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a  eading .      **
104b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
104c0 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f  e here..      */
104d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
104e0 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
104f0 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
10500 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 74 6f  the page-size to
10510 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65   match the value
10520 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
10530 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20  ournal. .    ** 
10540 55 73 65 20 61 20 74 65 73 74 63 61 73 65 28 29  Use a testcase()
10550 20 6d 61 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73   macro to make s
10560 75 72 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20  ure that malloc 
10570 66 61 69 6c 75 72 65 20 77 69 74 68 69 6e 20 0a  failure within .
10580 20 20 20 20 2a 2a 20 50 61 67 65 72 53 65 74 50      ** PagerSetP
10590 61 67 65 73 69 7a 65 28 29 20 69 73 20 74 65 73  agesize() is tes
105a0 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
105b0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
105c0 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50 61  rSetPagesize(pPa
105d0 67 65 72 2c 20 26 69 50 61 67 65 53 69 7a 65 2c  ger, &iPageSize,
105e0 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61   -1);.    testca
105f0 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
10600 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64  K );..    /* Upd
10610 61 74 65 20 74 68 65 20 61 73 73 75 6d 65 64 20  ate the assumed 
10620 73 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d  sector-size to m
10630 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 75  atch the value u
10640 73 65 64 20 62 79 20 0a 20 20 20 20 2a 2a 20 74  sed by .    ** t
10650 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
10660 63 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75  created this jou
10670 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f  rnal. If this jo
10680 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a  urnal was.    **
10690 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
106a0 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e  ocess other than
106b0 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20   this one, then 
106c0 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 20  this routine.   
106d0 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c   ** is being cal
106e0 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  led from within 
106f0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
10700 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75  . The local valu
10710 65 0a 20 20 20 20 2a 2a 20 6f 66 20 50 61 67 65  e.    ** of Page
10720 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20  r.sectorSize is 
10730 72 65 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  restored at the 
10740 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74  end of that rout
10750 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ine..    */.    
10760 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
10770 7a 65 20 3d 20 69 53 65 63 74 6f 72 53 69 7a 65  ze = iSectorSize
10780 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d  ;.  }..  pPager-
10790 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a  >journalOff += J
107a0 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
107b0 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
107c0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72  rc;.}.../*.** Wr
107d0 69 74 65 20 74 68 65 20 73 75 70 70 6c 69 65 64  ite the supplied
107e0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
107f0 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  name into the jo
10800 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
10810 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61  ager.** pPager a
10820 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  t the current lo
10830 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74  cation. The mast
10840 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
10850 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61 73 74  must be the last
10860 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65  .** thing writte
10870 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66  n to a journal f
10880 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65  ile. If the page
10890 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  r is in full-syn
108a0 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a  c mode, the.** j
108b0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
108c0 72 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63  riptor is advanc
108d0 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73  ed to the next s
108e0 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62  ector boundary b
108f0 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e  efore.** anythin
10900 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68  g is written. Th
10910 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a  e format is:.**.
10920 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20  **   + 4 bytes: 
10930 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a  PAGER_MJ_PGNO..*
10940 2a 20 20 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d  *   + N bytes: M
10950 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
10960 6c 65 6e 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e  lename in utf-8.
10970 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a  .**   + 4 bytes:
10980 20 4e 20 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61   N (length of ma
10990 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
109a0 65 20 69 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e  e in bytes, no n
109b0 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a  ul-terminator)..
109c0 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20  **   + 4 bytes: 
109d0 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  Master journal n
109e0 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a  ame checksum..**
109f0 20 20 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a     + 8 bytes: aJ
10a00 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a  ournalMagic[]..*
10a10 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20  *.** The master 
10a20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65  journal page che
10a30 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d  cksum is the sum
10a40 20 6f 66 20 74 68 65 20 62 79 74 65 73 20 69 6e   of the bytes in
10a50 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a   the master.** j
10a60 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65  ournal name, whe
10a70 72 65 20 65 61 63 68 20 62 79 74 65 20 69 73 20  re each byte is 
10a80 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61  interpreted as a
10a90 20 73 69 67 6e 65 64 20 38 2d 62 69 74 20 69 6e   signed 8-bit in
10aa0 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  teger..**.** If 
10ab0 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c  zMaster is a NUL
10ac0 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72  L pointer (occur
10ad0 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64  s for a single d
10ae0 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
10af0 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63  ion), .** this c
10b00 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  all is a no-op..
10b10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
10b20 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  iteMasterJournal
10b30 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
10b40 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
10b50 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ter){.  int rc; 
10b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b70 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
10b80 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
10b90 20 6e 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20   nMaster;       
10ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10bb0 20 4c 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e   Length of strin
10bc0 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69  g zMaster */.  i
10bd0 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20  64 iHdrOff;     
10be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10bf0 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61  /* Offset of hea
10c00 64 65 72 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  der in journal f
10c10 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e  ile */.  i64 jrn
10c20 6c 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  lSize;          
10c30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
10c40 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e of journal fil
10c50 65 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75  e on disk */.  u
10c60 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20  32 cksum = 0;   
10c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c80 2f 2a 20 43 68 65 63 6b 73 75 6d 20 6f 66 20 73  /* Checksum of s
10c90 74 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f  tring zMaster */
10ca0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
10cb0 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30  er->setMaster==0
10cc0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
10cd0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
10ce0 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 7a 4d  r) );..  if( !zM
10cf0 61 73 74 65 72 20 0a 20 20 20 7c 7c 20 70 50 61  aster .   || pPa
10d00 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
10d10 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
10d20 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c  ODE_MEMORY .   |
10d30 7c 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  | !isOpen(pPager
10d40 2d 3e 6a 66 64 29 0a 20 20 29 7b 0a 20 20 20 20  ->jfd).  ){.    
10d50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10d60 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
10d70 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 20  setMaster = 1;. 
10d80 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
10d90 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70  >journalHdr <= p
10da0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
10db0 66 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75  f );..  /* Calcu
10dc0 6c 61 74 65 20 74 68 65 20 6c 65 6e 67 74 68 20  late the length 
10dd0 69 6e 20 62 79 74 65 73 20 61 6e 64 20 74 68 65  in bytes and the
10de0 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61   checksum of zMa
10df0 73 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d  ster */.  for(nM
10e00 61 73 74 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72  aster=0; zMaster
10e10 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74  [nMaster]; nMast
10e20 65 72 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d  er++){.    cksum
10e30 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73   += zMaster[nMas
10e40 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ter];.  }..  /* 
10e50 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  If in full-sync 
10e60 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f  mode, advance to
10e70 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73   the next disk s
10e80 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69  ector before wri
10e90 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61  ting.  ** the ma
10ea0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
10eb0 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63 61  e. This is in ca
10ec0 73 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  se the previous 
10ed0 70 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a  page written to.
10ee0 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
10ef0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
10f00 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20  n synced..  */. 
10f10 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
10f20 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61  lSync ){.    pPa
10f30 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
10f40 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  = journalHdrOffs
10f50 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  et(pPager);.  }.
10f60 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67    iHdrOff = pPag
10f70 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
10f80 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  .  /* Write the 
10f90 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64  master journal d
10fa0 61 74 61 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ata to the end o
10fb0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
10fc0 6c 65 2e 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65  le. If.  ** an e
10fd0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
10fe0 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f  urn the error co
10ff0 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  de to the caller
11000 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 30 20  ..  */.  if( (0 
11010 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32  != (rc = write32
11020 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
11030 2c 20 69 48 64 72 4f 66 66 2c 20 50 41 47 45 52  , iHdrOff, PAGER
11040 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
11050 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20  ))).   || (0 != 
11060 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57  (rc = sqlite3OsW
11070 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
11080 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74  , zMaster, nMast
11090 65 72 2c 20 69 48 64 72 4f 66 66 2b 34 29 29 29  er, iHdrOff+4)))
110a0 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63  .   || (0 != (rc
110b0 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
110c0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
110d0 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e  Off+4+nMaster, n
110e0 4d 61 73 74 65 72 29 29 29 0a 20 20 20 7c 7c 20  Master))).   || 
110f0 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74  (0 != (rc = writ
11100 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
11110 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e  jfd, iHdrOff+4+n
11120 4d 61 73 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29  Master+4, cksum)
11130 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28  )).   || (0 != (
11140 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
11150 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
11160 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
11170 38 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  8,.             
11180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11190 20 20 20 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d      iHdrOff+4+nM
111a0 61 73 74 65 72 2b 38 29 29 29 0a 20 20 29 7b 0a  aster+8))).  ){.
111b0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
111c0 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75   }.  pPager->jou
111d0 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61 73  rnalOff += (nMas
111e0 74 65 72 2b 32 30 29 3b 0a 0a 20 20 2f 2a 20 49  ter+20);..  /* I
111f0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
11200 6e 20 70 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72  n peristent-jour
11210 6e 61 6c 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74  nal mode, then t
11220 68 65 20 70 68 79 73 69 63 61 6c 20 0a 20 20 2a  he physical .  *
11230 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d  * journal-file m
11240 61 79 20 65 78 74 65 6e 64 20 70 61 73 74 20 74  ay extend past t
11250 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61  he end of the ma
11260 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster-journal nam
11270 65 0a 20 20 2a 2a 20 61 6e 64 20 38 20 62 79 74  e.  ** and 8 byt
11280 65 73 20 6f 66 20 6d 61 67 69 63 20 64 61 74 61  es of magic data
11290 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 74 6f   just written to
112a0 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20   the file. This 
112b0 69 73 20 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f  is .  ** dangero
112c0 75 73 20 62 65 63 61 75 73 65 20 74 68 65 20 63  us because the c
112d0 6f 64 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ode to rollback 
112e0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
112f0 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74  le.  ** will not
11300 20 62 65 20 61 62 6c 65 20 74 6f 20 66 69 6e 64   be able to find
11310 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
11320 6e 61 6c 20 6e 61 6d 65 20 74 6f 20 64 65 74 65  nal name to dete
11330 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74  rmine .  ** whet
11340 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a  her or not the j
11350 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a  ournal is hot. .
11360 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73    **.  ** Easies
11370 74 20 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e  t thing to do in
11380 20 74 68 69 73 20 73 63 65 6e 61 72 69 6f 20 69   this scenario i
11390 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68  s to truncate th
113a0 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20  e journal .  ** 
113b0 66 69 6c 65 20 74 6f 20 74 68 65 20 72 65 71 75  file to the requ
113c0 69 72 65 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20  ired size..  */ 
113d0 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
113e0 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  ==(rc = sqlite3O
113f0 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
11400 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65  ->jfd, &jrnlSize
11410 29 29 0a 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a  )).   && jrnlSiz
11420 65 3e 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  e>pPager->journa
11430 6c 4f 66 66 0a 20 20 29 7b 0a 20 20 20 20 72 63  lOff.  ){.    rc
11440 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
11450 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  cate(pPager->jfd
11460 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
11470 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74  lOff);.  }.  ret
11480 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
11490 20 44 69 73 63 61 72 64 20 74 68 65 20 65 6e 74   Discard the ent
114a0 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ire contents of 
114b0 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
114c0 67 65 2d 63 61 63 68 65 2e 0a 2a 2f 0a 73 74 61  ge-cache..*/.sta
114d0 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72  tic void pager_r
114e0 65 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67  eset(Pager *pPag
114f0 65 72 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 69  er){.  pPager->i
11500 44 61 74 61 56 65 72 73 69 6f 6e 2b 2b 3b 0a 20  DataVersion++;. 
11510 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65   sqlite3BackupRe
11520 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42  start(pPager->pB
11530 61 63 6b 75 70 29 3b 0a 20 20 73 71 6c 69 74 65  ackup);.  sqlite
11540 33 50 63 61 63 68 65 43 6c 65 61 72 28 70 50 61  3PcacheClear(pPa
11550 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d  ger->pPCache);.}
11560 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
11570 68 65 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61  he pPager->iData
11580 56 65 72 73 69 6f 6e 20 76 61 6c 75 65 0a 2a 2f  Version value.*/
11590 0a 75 33 32 20 73 71 6c 69 74 65 33 50 61 67 65  .u32 sqlite3Page
115a0 72 44 61 74 61 56 65 72 73 69 6f 6e 28 50 61 67  rDataVersion(Pag
115b0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61  er *pPager){.  a
115c0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
115d0 53 74 61 74 65 3e 50 41 47 45 52 5f 4f 50 45 4e  State>PAGER_OPEN
115e0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61   );.  return pPa
115f0 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f  ger->iDataVersio
11600 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  n;.}../*.** Free
11610 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20   all structures 
11620 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61  in the Pager.aSa
11630 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20  vepoint[] array 
11640 61 6e 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20  and set both.** 
11650 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
11660 20 61 6e 64 20 50 61 67 65 72 2e 6e 53 61 76 65   and Pager.nSave
11670 70 6f 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43  point to zero. C
11680 6c 6f 73 65 20 74 68 65 20 73 75 62 2d 6a 6f 75  lose the sub-jou
11690 72 6e 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73  rnal.** if it is
116a0 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61   open and the pa
116b0 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78  ger is not in ex
116c0 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f  clusive mode..*/
116d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
116e0 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74  easeAllSavepoint
116f0 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
11700 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20  {.  int ii;     
11710 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
11720 72 61 74 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e  rator for loopin
11730 67 20 74 68 72 6f 75 67 68 20 50 61 67 65 72 2e  g through Pager.
11740 61 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20  aSavepoint */.  
11750 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61  for(ii=0; ii<pPa
11760 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
11770 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69   ii++){.    sqli
11780 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
11790 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  (pPager->aSavepo
117a0 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70  int[ii].pInSavep
117b0 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  oint);.  }.  if(
117c0 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
117d0 69 76 65 4d 6f 64 65 20 7c 7c 20 73 71 6c 69 74  iveMode || sqlit
117e0 65 33 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d 65 6d  e3JournalIsInMem
117f0 6f 72 79 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  ory(pPager->sjfd
11800 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
11810 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
11820 73 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  sjfd);.  }.  sql
11830 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
11840 2d 3e 61 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  ->aSavepoint);. 
11850 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f   pPager->aSavepo
11860 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  int = 0;.  pPage
11870 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20  r->nSavepoint = 
11880 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 75  0;.  pPager->nSu
11890 62 52 65 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  bRec = 0;.}../*.
118a0 2a 2a 20 53 65 74 20 74 68 65 20 62 69 74 20 6e  ** Set the bit n
118b0 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 74 68  umber pgno in th
118c0 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
118d0 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 0a 2a  .pInSavepoint .*
118e0 2a 20 62 69 74 76 65 63 73 20 6f 66 20 61 6c 6c  * bitvecs of all
118f0 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
11900 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
11910 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  OK if successful
11920 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f  .** or SQLITE_NO
11930 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20  MEM if a malloc 
11940 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a  failure occurs..
11950 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64  */.static int ad
11960 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
11970 65 63 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  ecs(Pager *pPage
11980 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
11990 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
119a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
119b0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
119c0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
119d0 4f 4b 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73  OK;       /* Res
119e0 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 66  ult code */..  f
119f0 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67  or(ii=0; ii<pPag
11a00 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20  er->nSavepoint; 
11a10 69 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65 72  ii++){.    Pager
11a20 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26  Savepoint *p = &
11a30 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
11a40 6e 74 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28 20  nt[ii];.    if( 
11a50 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20 29  pgno<=p->nOrig )
11a60 7b 0a 20 20 20 20 20 20 72 63 20 7c 3d 20 73 71  {.      rc |= sq
11a70 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
11a80 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20  ->pInSavepoint, 
11a90 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 74 65 73  pgno);.      tes
11aa0 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54  tcase( rc==SQLIT
11ab0 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
11ac0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
11ad0 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51  ITE_OK || rc==SQ
11ae0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
11af0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
11b00 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
11b10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43  SQLITE_OMIT_CONC
11b20 55 52 52 45 4e 54 0a 2f 2a 0a 2a 2a 20 49 66 20  URRENT./*.** If 
11b30 74 68 65 79 20 61 72 65 20 6e 6f 74 20 61 6c 72  they are not alr
11b40 65 61 64 79 2c 20 62 65 67 69 6e 20 72 65 63 6f  eady, begin reco
11b50 72 64 69 6e 67 20 61 6c 6c 20 70 61 67 65 73 20  rding all pages 
11b60 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70 61  read from the pa
11b70 67 65 72 20 6c 61 79 65 72 0a 2a 2a 20 62 79 20  ger layer.** by 
11b80 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
11b90 20 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79   This is used by
11ba0 20 63 6f 6e 63 75 72 72 65 6e 74 20 74 72 61 6e   concurrent tran
11bb0 73 61 63 74 69 6f 6e 73 2e 20 52 65 74 75 72 6e  sactions. Return
11bc0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  .** SQLITE_OK if
11bd0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
11be0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
11bf0 63 6f 64 65 20 28 53 51 4c 49 54 45 5f 4e 4f 4d  code (SQLITE_NOM
11c00 45 4d 29 20 69 66 20 61 6e 20 65 72 72 6f 72 0a  EM) if an error.
11c10 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e  ** occurs..*/.in
11c20 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65  t sqlite3PagerBe
11c30 67 69 6e 43 6f 6e 63 75 72 72 65 6e 74 28 50 61  ginConcurrent(Pa
11c40 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
11c50 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
11c60 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  OK;.  if( pPager
11c70 2d 3e 70 41 6c 6c 52 65 61 64 3d 3d 30 20 29 7b  ->pAllRead==0 ){
11c80 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c  .    pPager->pAl
11c90 6c 52 65 61 64 20 3d 20 73 71 6c 69 74 65 33 42  lRead = sqlite3B
11ca0 69 74 76 65 63 43 72 65 61 74 65 28 70 50 61 67  itvecCreate(pPag
11cb0 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20  er->dbSize);.   
11cc0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 41 6c   if( pPager->pAl
11cd0 6c 52 65 61 64 3d 3d 30 20 29 7b 0a 20 20 20 20  lRead==0 ){.    
11ce0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
11cf0 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MEM;.    }.  }. 
11d00 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11d10 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
11d20 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e  E_OMIT_CONCURREN
11d30 54 29 0a 2a 2a 0a 2a 2a 20 53 74 6f 70 20 72 65  T).**.** Stop re
11d40 63 6f 72 64 69 6e 67 20 61 6c 6c 20 70 61 67 65  cording all page
11d50 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
11d60 70 61 67 65 72 20 6c 61 79 65 72 20 62 79 20 74  pager layer by t
11d70 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72 0a  he b-tree layer.
11d80 2a 2a 20 61 6e 64 20 64 69 73 63 61 72 64 20 61  ** and discard a
11d90 6e 79 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72  ny current recor
11da0 64 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ds..*/.void sqli
11db0 74 65 33 50 61 67 65 72 45 6e 64 43 6f 6e 63 75  te3PagerEndConcu
11dc0 72 72 65 6e 74 28 50 61 67 65 72 20 2a 70 50 61  rrent(Pager *pPa
11dd0 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 42  ger){.  sqlite3B
11de0 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
11df0 67 65 72 2d 3e 70 41 6c 6c 52 65 61 64 29 3b 0a  ger->pAllRead);.
11e00 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 52 65    pPager->pAllRe
11e10 61 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 20 21 64  ad = 0;.}../* !d
11e20 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
11e30 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 29 0a 2a  IT_CONCURRENT).*
11e40 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
11e50 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
11e60 20 69 73 20 69 6e 20 77 61 6c 20 6d 6f 64 65 2e   is in wal mode.
11e70 20 46 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65   False otherwise
11e80 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11e90 50 61 67 65 72 49 73 57 61 6c 28 50 61 67 65 72  PagerIsWal(Pager
11ea0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
11eb0 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 57 61 6c  urn pPager->pWal
11ec0 21 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  !=0;.}.#endif /*
11ed0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e   SQLITE_OMIT_CON
11ee0 43 55 52 52 45 4e 54 20 2a 2f 0a 0a 2f 2a 0a 2a  CURRENT */../*.*
11ef0 2a 20 46 72 65 65 20 74 68 65 20 50 61 67 65 72  * Free the Pager
11f00 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 61 6e 64 20  .pInJournal and 
11f10 50 61 67 65 72 2e 70 41 6c 6c 52 65 61 64 20 62  Pager.pAllRead b
11f20 69 74 76 65 63 20 6f 62 6a 65 63 74 73 2e 0a 2a  itvec objects..*
11f30 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
11f40 67 65 72 46 72 65 65 42 69 74 76 65 63 73 28 50  gerFreeBitvecs(P
11f50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
11f60 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
11f70 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49  stroy(pPager->pI
11f80 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61  nJournal);.  pPa
11f90 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
11fa0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  = 0;.  sqlite3Pa
11fb0 67 65 72 45 6e 64 43 6f 6e 63 75 72 72 65 6e 74  gerEndConcurrent
11fc0 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  (pPager);.}../*.
11fd0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
11fe0 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74   is a no-op if t
11ff0 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65  he pager is in e
12000 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e  xclusive mode an
12010 64 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65 20  d not.** in the 
12020 45 52 52 4f 52 20 73 74 61 74 65 2e 20 4f 74 68  ERROR state. Oth
12030 65 72 77 69 73 65 2c 20 69 74 20 73 77 69 74 63  erwise, it switc
12040 68 65 73 20 74 68 65 20 70 61 67 65 72 20 74 6f  hes the pager to
12050 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 73   PAGER_OPEN.** s
12060 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  tate..**.** If t
12070 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
12080 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  in exclusive-acc
12090 65 73 73 20 6d 6f 64 65 2c 20 74 68 65 20 64 61  ess mode, the da
120a0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 2a  tabase file is.*
120b0 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20 75 6e 6c  * completely unl
120c0 6f 63 6b 65 64 2e 20 49 66 20 74 68 65 20 66 69  ocked. If the fi
120d0 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20 61  le is unlocked a
120e0 6e 64 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  nd the file-syst
120f0 65 6d 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65  em does.** not e
12100 78 68 69 62 69 74 20 74 68 65 20 55 4e 44 45 4c  xhibit the UNDEL
12110 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e  ETABLE_WHEN_OPEN
12120 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 20 6a   property, the j
12130 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a  ournal file is.*
12140 2a 20 63 6c 6f 73 65 64 20 28 69 66 20 69 74 20  * closed (if it 
12150 69 73 20 6f 70 65 6e 29 2e 0a 2a 2a 0a 2a 2a 20  is open)..**.** 
12160 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
12170 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20 77  in ERROR state w
12180 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
12190 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  n is called, the
121a0 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66   .** contents of
121b0 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
121c0 20 61 72 65 20 64 69 73 63 61 72 64 65 64 20 62   are discarded b
121d0 65 66 6f 72 65 20 73 77 69 74 63 68 69 6e 67 20  efore switching 
121e0 62 61 63 6b 20 74 6f 20 0a 2a 2a 20 74 68 65 20  back to .** the 
121f0 4f 50 45 4e 20 73 74 61 74 65 2e 20 52 65 67 61  OPEN state. Rega
12200 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
12210 72 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  r the pager is i
12220 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65  n exclusive-mode
12230 0a 2a 2a 20 6f 72 20 6e 6f 74 2c 20 61 6e 79 20  .** or not, any 
12240 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6c 65 66  journal file lef
12250 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  t in the file-sy
12260 73 74 65 6d 20 77 69 6c 6c 20 62 65 20 74 72 65  stem will be tre
12270 61 74 65 64 0a 2a 2a 20 61 73 20 61 20 68 6f 74  ated.** as a hot
12280 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c  -journal and rol
12290 6c 65 64 20 62 61 63 6b 20 74 68 65 20 6e 65 78  led back the nex
122a0 74 20 74 69 6d 65 20 61 20 72 65 61 64 2d 74 72  t time a read-tr
122b0 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
122c0 6f 70 65 6e 65 64 20 28 62 79 20 74 68 69 73 20  opened (by this 
122d0 6f 72 20 62 79 20 61 6e 79 20 6f 74 68 65 72 20  or by any other 
122e0 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0a 2a 2f 0a  connection)..*/.
122f0 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
12300 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a  r_unlock(Pager *
12310 70 50 61 67 65 72 29 7b 0a 0a 20 20 61 73 73 65  pPager){..  asse
12320 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
12330 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
12340 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67   .       || pPag
12350 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
12360 52 5f 4f 50 45 4e 20 0a 20 20 20 20 20 20 20 7c  R_OPEN .       |
12370 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
12380 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 0a 20  ==PAGER_ERROR . 
12390 20 29 3b 0a 0a 20 20 70 61 67 65 72 46 72 65 65   );..  pagerFree
123a0 42 69 74 76 65 63 73 28 70 50 61 67 65 72 29 3b  Bitvecs(pPager);
123b0 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76  .  releaseAllSav
123c0 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b  epoints(pPager);
123d0 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  ..  if( pagerUse
123e0 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
123f0 20 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70     assert( !isOp
12400 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
12410 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61  );.    sqlite3Wa
12420 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74  lEndReadTransact
12430 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ion(pPager->pWal
12440 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  );.    pPager->e
12450 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50  State = PAGER_OP
12460 45 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  EN;.  }else if( 
12470 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
12480 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e  veMode ){.    in
12490 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
124a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
124b0 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e  rror code return
124c0 65 64 20 62 79 20 70 61 67 65 72 55 6e 6c 6f 63  ed by pagerUnloc
124d0 6b 44 62 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74  kDb() */.    int
124e0 20 69 44 63 20 3d 20 69 73 4f 70 65 6e 28 70 50   iDc = isOpen(pP
124f0 61 67 65 72 2d 3e 66 64 29 3f 73 71 6c 69 74 65  ager->fd)?sqlite
12500 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
12510 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
12520 3e 66 64 29 3a 30 3b 0a 0a 20 20 20 20 2f 2a 20  >fd):0;..    /* 
12530 49 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  If the operating
12540 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20   system support 
12550 64 65 6c 65 74 69 6f 6e 20 6f 66 20 6f 70 65 6e  deletion of open
12560 20 66 69 6c 65 73 2c 20 74 68 65 6e 0a 20 20 20   files, then.   
12570 20 2a 2a 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f   ** close the jo
12580 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20  urnal file when 
12590 64 72 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74  dropping the dat
125a0 61 62 61 73 65 20 6c 6f 63 6b 2e 20 20 4f 74 68  abase lock.  Oth
125b0 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 6e  erwise.    ** an
125c0 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
125d0 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f   with journal_mo
125e0 64 65 3d 64 65 6c 65 74 65 20 6d 69 67 68 74 20  de=delete might 
125f0 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 0a  delete the file.
12600 20 20 20 20 2a 2a 20 6f 75 74 20 66 72 6f 6d 20      ** out from 
12610 75 6e 64 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f  under us..    */
12620 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41  .    assert( (PA
12630 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
12640 4d 45 4d 4f 52 59 20 20 20 26 20 35 29 21 3d 31  MEMORY   & 5)!=1
12650 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
12660 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  (PAGER_JOURNALMO
12670 44 45 5f 4f 46 46 20 20 20 20 20 20 26 20 35 29  DE_OFF      & 5)
12680 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=1 );.    asser
12690 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
126a0 4c 4d 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 26  LMODE_WAL      &
126b0 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73   5)!=1 );.    as
126c0 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
126d0 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20  RNALMODE_DELETE 
126e0 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20    & 5)!=1 );.   
126f0 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
12700 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
12710 43 41 54 45 20 26 20 35 29 3d 3d 31 20 29 3b 0a  CATE & 5)==1 );.
12720 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
12730 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
12740 45 52 53 49 53 54 20 20 26 20 35 29 3d 3d 31 20  ERSIST  & 5)==1 
12750 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 69  );.    if( 0==(i
12760 44 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 43 41  Dc & SQLITE_IOCA
12770 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48  P_UNDELETABLE_WH
12780 45 4e 5f 4f 50 45 4e 29 0a 20 20 20 20 20 7c 7c  EN_OPEN).     ||
12790 20 31 21 3d 28 70 50 61 67 65 72 2d 3e 6a 6f 75   1!=(pPager->jou
127a0 72 6e 61 6c 4d 6f 64 65 20 26 20 35 29 0a 20 20  rnalMode & 5).  
127b0 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74    ){.      sqlit
127c0 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
127d0 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20  ->jfd);.    }.. 
127e0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67     /* If the pag
127f0 65 72 20 69 73 20 69 6e 20 74 68 65 20 45 52 52  er is in the ERR
12800 4f 52 20 73 74 61 74 65 20 61 6e 64 20 74 68 65  OR state and the
12810 20 63 61 6c 6c 20 74 6f 20 75 6e 6c 6f 63 6b 20   call to unlock 
12820 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
12830 20 2a 2a 20 66 69 6c 65 20 66 61 69 6c 73 2c 20   ** file fails, 
12840 73 65 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  set the current 
12850 6c 6f 63 6b 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f  lock to UNKNOWN_
12860 4c 4f 43 4b 2e 20 53 65 65 20 74 68 65 20 63 6f  LOCK. See the co
12870 6d 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 61 62 6f  mment.    ** abo
12880 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 66  ve the #define f
12890 6f 72 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  or UNKNOWN_LOCK 
128a0 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69  for an explanati
128b0 6f 6e 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20  on of why this. 
128c0 20 20 20 2a 2a 20 69 73 20 6e 65 63 65 73 73 61     ** is necessa
128d0 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ry..    */.    r
128e0 63 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44  c = pagerUnlockD
128f0 62 28 70 50 61 67 65 72 2c 20 4e 4f 5f 4c 4f 43  b(pPager, NO_LOC
12900 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  K);.    if( rc!=
12910 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
12920 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
12930 45 52 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20  ER_ERROR ){.    
12940 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20    pPager->eLock 
12950 3d 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a  = UNKNOWN_LOCK;.
12960 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
12970 65 20 70 61 67 65 72 20 73 74 61 74 65 20 6d 61  e pager state ma
12980 79 20 62 65 20 63 68 61 6e 67 65 64 20 66 72 6f  y be changed fro
12990 6d 20 50 41 47 45 52 5f 45 52 52 4f 52 20 74 6f  m PAGER_ERROR to
129a0 20 50 41 47 45 52 5f 4f 50 45 4e 20 68 65 72 65   PAGER_OPEN here
129b0 0a 20 20 20 20 2a 2a 20 77 69 74 68 6f 75 74 20  .    ** without 
129c0 63 6c 65 61 72 69 6e 67 20 74 68 65 20 65 72 72  clearing the err
129d0 6f 72 20 63 6f 64 65 2e 20 54 68 69 73 20 69 73  or code. This is
129e0 20 69 6e 74 65 6e 74 69 6f 6e 61 6c 20 2d 20 74   intentional - t
129f0 68 65 20 65 72 72 6f 72 0a 20 20 20 20 2a 2a 20  he error.    ** 
12a00 63 6f 64 65 20 69 73 20 63 6c 65 61 72 65 64 20  code is cleared 
12a10 61 6e 64 20 74 68 65 20 63 61 63 68 65 20 72 65  and the cache re
12a20 73 65 74 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b  set in the block
12a30 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20   below..    */. 
12a40 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
12a50 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 70 50  r->errCode || pP
12a60 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
12a70 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 20  GER_ERROR );.   
12a80 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
12a90 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20  ountDone = 0;.  
12aa0 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
12ab0 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20   = PAGER_OPEN;. 
12ac0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 50 61 67 65   }..  /* If Page
12ad0 72 2e 65 72 72 43 6f 64 65 20 69 73 20 73 65 74  r.errCode is set
12ae0 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  , the contents o
12af0 66 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  f the pager cach
12b00 65 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20 2a 2a  e cannot be.  **
12b10 20 74 72 75 73 74 65 64 2e 20 4e 6f 77 20 74 68   trusted. Now th
12b20 61 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  at there are no 
12b30 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
12b40 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
12b50 67 65 72 2c 0a 20 20 2a 2a 20 69 74 20 63 61 6e  ger,.  ** it can
12b60 20 73 61 66 65 6c 79 20 6d 6f 76 65 20 62 61 63   safely move bac
12b70 6b 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20  k to PAGER_OPEN 
12b80 73 74 61 74 65 2e 20 54 68 69 73 20 68 61 70 70  state. This happ
12b90 65 6e 73 20 69 6e 20 62 6f 74 68 0a 20 20 2a 2a  ens in both.  **
12ba0 20 6e 6f 72 6d 61 6c 20 61 6e 64 20 65 78 63 6c   normal and excl
12bb0 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f  usive-locking mo
12bc0 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  de..  */.  asser
12bd0 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  t( pPager->errCo
12be0 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  de==SQLITE_OK ||
12bf0 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28   !MEMDB );.  if(
12c00 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
12c10 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
12c20 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20  er->tempFile==0 
12c30 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72  ){.      pager_r
12c40 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
12c50 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e      pPager->chan
12c60 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b  geCountDone = 0;
12c70 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65  .      pPager->e
12c80 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50  State = PAGER_OP
12c90 45 4e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EN;.    }else{. 
12ca0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74       pPager->eSt
12cb0 61 74 65 20 3d 20 28 69 73 4f 70 65 6e 28 70 50  ate = (isOpen(pP
12cc0 61 67 65 72 2d 3e 6a 66 64 29 20 3f 20 50 41 47  ager->jfd) ? PAG
12cd0 45 52 5f 4f 50 45 4e 20 3a 20 50 41 47 45 52 5f  ER_OPEN : PAGER_
12ce0 52 45 41 44 45 52 29 3b 0a 20 20 20 20 7d 0a 20  READER);.    }. 
12cf0 20 20 20 69 66 28 20 55 53 45 46 45 54 43 48 28     if( USEFETCH(
12d00 70 50 61 67 65 72 29 20 29 20 73 71 6c 69 74 65  pPager) ) sqlite
12d10 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65  3OsUnfetch(pPage
12d20 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20  r->fd, 0, 0);.  
12d30 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
12d40 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  e = SQLITE_OK;. 
12d50 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   }..  pPager->jo
12d60 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
12d70 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
12d80 64 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  dr = 0;.  pPager
12d90 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
12da0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
12db0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
12dc0 64 20 77 68 65 6e 65 76 65 72 20 61 6e 20 49 4f  d whenever an IO
12dd0 45 52 52 20 6f 72 20 46 55 4c 4c 20 65 72 72 6f  ERR or FULL erro
12de0 72 20 74 68 61 74 20 72 65 71 75 69 72 65 73 0a  r that requires.
12df0 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f 20  ** the pager to 
12e00 74 72 61 6e 73 69 74 69 6f 6e 20 69 6e 74 6f 20  transition into 
12e10 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20  the ERROR state 
12e20 6d 61 79 20 61 68 76 65 20 6f 63 63 75 72 72 65  may ahve occurre
12e30 64 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  d..** The first 
12e40 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f  argument is a po
12e50 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
12e60 65 72 20 73 74 72 75 63 74 75 72 65 2c 20 74 68  er structure, th
12e70 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 74 68 65  e second .** the
12e80 20 65 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f 75   error-code abou
12e90 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  t to be returned
12ea0 20 62 79 20 61 20 70 61 67 65 72 20 41 50 49 20   by a pager API 
12eb0 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 0a 2a  function. The .*
12ec0 2a 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  * value returned
12ed0 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68   is a copy of th
12ee0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
12ef0 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
12f00 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  on. .**.** If th
12f10 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
12f20 74 20 69 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c  t is SQLITE_FULL
12f30 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f  , SQLITE_IOERR o
12f40 72 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20  r one of the.** 
12f50 49 4f 45 52 52 20 73 75 62 2d 63 6f 64 65 73 2c  IOERR sub-codes,
12f60 20 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72   the pager enter
12f70 73 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  s the ERROR stat
12f80 65 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20  e and the error 
12f90 63 6f 64 65 0a 2a 2a 20 69 73 20 73 74 6f 72 65  code.** is store
12fa0 64 20 69 6e 20 50 61 67 65 72 2e 65 72 72 43 6f  d in Pager.errCo
12fb0 64 65 2e 20 57 68 69 6c 65 20 74 68 65 20 70 61  de. While the pa
12fc0 67 65 72 20 72 65 6d 61 69 6e 73 20 69 6e 20 74  ger remains in t
12fd0 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 0a  he ERROR state,.
12fe0 2a 2a 20 61 6c 6c 20 6d 61 6a 6f 72 20 41 50 49  ** all major API
12ff0 20 63 61 6c 6c 73 20 6f 6e 20 74 68 65 20 50 61   calls on the Pa
13000 67 65 72 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61  ger will immedia
13010 74 65 6c 79 20 72 65 74 75 72 6e 20 50 61 67 65  tely return Page
13020 72 2e 65 72 72 43 6f 64 65 2e 0a 2a 2a 0a 2a 2a  r.errCode..**.**
13030 20 54 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   The ERROR state
13040 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
13050 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
13060 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
13070 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 74 72  .** cannot be tr
13080 75 73 74 65 64 2e 20 54 68 69 73 20 73 74 61 74  usted. This stat
13090 65 20 63 61 6e 20 62 65 20 63 6c 65 61 72 65 64  e can be cleared
130a0 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64   by completely d
130b0 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20 74 68  iscarding .** th
130c0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
130d0 65 20 70 61 67 65 72 2d 63 61 63 68 65 2e 20 49  e pager-cache. I
130e0 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
130f0 77 61 73 20 61 63 74 69 76 65 20 77 68 65 6e 0a  was active when.
13100 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  ** the persisten
13110 74 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  t error occurred
13120 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62  , then the rollb
13130 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  ack journal may 
13140 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 72 65  need.** to be re
13150 70 6c 61 79 65 64 20 74 6f 20 72 65 73 74 6f 72  played to restor
13160 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
13170 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
13180 69 6c 65 20 28 61 73 20 69 66 0a 2a 2a 20 69 74  ile (as if.** it
13190 20 77 65 72 65 20 61 20 68 6f 74 2d 6a 6f 75 72   were a hot-jour
131a0 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nal)..*/.static 
131b0 69 6e 74 20 70 61 67 65 72 5f 65 72 72 6f 72 28  int pager_error(
131c0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
131d0 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74 20 72 63  nt rc){.  int rc
131e0 32 20 3d 20 72 63 20 26 20 30 78 66 66 3b 0a 20  2 = rc & 0xff;. 
131f0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
13200 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42  ITE_OK || !MEMDB
13210 20 29 3b 0a 20 20 61 73 73 65 72 74 28 0a 20 20   );.  assert(.  
13220 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72       pPager->err
13230 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c  Code==SQLITE_FUL
13240 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50 61 67  L ||.       pPag
13250 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
13260 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20  ITE_OK ||.      
13270 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64   (pPager->errCod
13280 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c 49 54  e & 0xff)==SQLIT
13290 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69  E_IOERR.  );.  i
132a0 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46  f( rc2==SQLITE_F
132b0 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d 53 51 4c 49  ULL || rc2==SQLI
132c0 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20  TE_IOERR ){.    
132d0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
132e0 3d 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72  = rc;.    pPager
132f0 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
13300 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
13310 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74  turn rc;.}..stat
13320 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75  ic int pager_tru
13330 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61  ncate(Pager *pPa
13340 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29  ger, Pgno nPage)
13350 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 77 72 69  ;../*.** The wri
13360 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  te transaction o
13370 70 65 6e 20 6f 6e 20 74 68 65 20 70 61 67 65 72  pen on the pager
13380 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f   passed as the o
13390 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 69 73 0a  nly argument is.
133a0 2a 2a 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74  ** being committ
133b0 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ed. This functio
133c0 6e 20 72 65 74 75 72 6e 73 20 74 72 75 65 20 69  n returns true i
133d0 66 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  f all dirty page
133e0 73 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 66  s should.** be f
133f0 6c 75 73 68 65 64 20 74 6f 20 64 69 73 6b 2c 20  lushed to disk, 
13400 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69  or false otherwi
13410 73 65 2e 20 50 61 67 65 73 20 73 68 6f 75 6c 64  se. Pages should
13420 20 62 65 20 66 6c 75 73 68 65 64 20 74 6f 20 64   be flushed to d
13430 69 73 6b 0a 2a 2a 20 75 6e 6c 65 73 73 20 6f 6e  isk.** unless on
13440 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
13450 6e 67 20 69 73 20 74 72 75 65 3a 0a 2a 2a 0a 2a  ng is true:.**.*
13460 2a 20 20 20 2a 20 54 68 65 20 64 62 20 69 73 20  *   * The db is 
13470 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
13480 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  abase..**.**   *
13490 20 54 68 65 20 64 62 20 69 73 20 61 20 74 65 6d   The db is a tem
134a0 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20  porary database 
134b0 61 6e 64 20 74 68 65 20 64 62 20 66 69 6c 65 20  and the db file 
134c0 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6f 70 65  has not been ope
134d0 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54  ned..**.**   * T
134e0 68 65 20 64 62 20 69 73 20 61 20 74 65 6d 70 6f  he db is a tempo
134f0 72 61 72 79 20 64 61 74 61 62 61 73 65 20 61 6e  rary database an
13500 64 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74  d the cache cont
13510 61 69 6e 73 20 6c 65 73 73 20 74 68 61 6e 0a 2a  ains less than.*
13520 2a 20 20 20 20 20 43 2f 34 20 64 69 72 74 79 20  *     C/4 dirty 
13530 70 61 67 65 73 2c 20 77 68 65 72 65 20 43 20 69  pages, where C i
13540 73 20 74 68 65 20 63 6f 6e 66 69 67 75 72 65 64  s the configured
13550 20 63 61 63 68 65 2d 73 69 7a 65 2e 0a 2a 2f 0a   cache-size..*/.
13560 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
13570 46 6c 75 73 68 4f 6e 43 6f 6d 6d 69 74 28 50 61  FlushOnCommit(Pa
13580 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
13590 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  if( pPager->temp
135a0 46 69 6c 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  File==0 ) return
135b0 20 31 3b 0a 20 20 69 66 28 20 21 69 73 4f 70 65   1;.  if( !isOpe
135c0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 20  n(pPager->fd) ) 
135d0 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
135e0 72 6e 20 28 73 71 6c 69 74 65 33 50 43 61 63 68  rn (sqlite3PCach
135f0 65 50 65 72 63 65 6e 74 44 69 72 74 79 28 70 50  ePercentDirty(pP
13600 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 3d  ager->pPCache)>=
13610 32 35 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  25);.}../*.** Th
13620 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 64 73 20  is routine ends 
13630 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41  a transaction. A
13640 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
13650 75 73 75 61 6c 6c 79 20 65 6e 64 65 64 20 62 79  usually ended by
13660 20 0a 2a 2a 20 65 69 74 68 65 72 20 61 20 43 4f   .** either a CO
13670 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41  MMIT or a ROLLBA
13680 43 4b 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68  CK operation. Th
13690 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 62  is routine may b
136a0 65 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 61 66 74  e called .** aft
136b0 65 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61  er rollback of a
136c0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72   hot-journal, or
136d0 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
136e0 75 72 73 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e  urs while openin
136f0 67 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g.** the journal
13700 20 66 69 6c 65 20 6f 72 20 77 72 69 74 69 6e 67   file or writing
13710 20 74 68 65 20 76 65 72 79 20 66 69 72 73 74 20   the very first 
13720 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6f  journal-header o
13730 66 20 61 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  f a.** database 
13740 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
13750 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
13760 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
13770 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20   in PAGER_ERROR 
13780 73 74 61 74 65 2e 20 49 66 20 69 74 20 69 73 20  state. If it is 
13790 63 61 6c 6c 65 64 0a 2a 2a 20 69 6e 20 50 41 47  called.** in PAG
137a0 45 52 5f 4e 4f 4e 45 20 6f 72 20 50 41 47 45 52  ER_NONE or PAGER
137b0 5f 53 48 41 52 45 44 20 73 74 61 74 65 20 61 6e  _SHARED state an
137c0 64 20 74 68 65 20 6c 6f 63 6b 20 68 65 6c 64 20  d the lock held 
137d0 69 73 20 6c 65 73 73 0a 2a 2a 20 65 78 63 6c 75  is less.** exclu
137e0 73 69 76 65 20 74 68 61 6e 20 61 20 52 45 53 45  sive than a RESE
137f0 52 56 45 44 20 6c 6f 63 6b 2c 20 69 74 20 69 73  RVED lock, it is
13800 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
13810 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 79 20 61  Otherwise, any a
13820 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73  ctive savepoints
13830 20 61 72 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a   are released..*
13840 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
13850 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  nal file is open
13860 2c 20 74 68 65 6e 20 69 74 20 69 73 20 22 66 69  , then it is "fi
13870 6e 61 6c 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61  nalized". Once a
13880 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c   journal .** fil
13890 65 20 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c  e has been final
138a0 69 7a 65 64 20 69 74 20 69 73 20 6e 6f 74 20 70  ized it is not p
138b0 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20 69  ossible to use i
138c0 74 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61  t to roll back a
138d0 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e   .** transaction
138e0 2e 20 4e 6f 72 20 77 69 6c 6c 20 69 74 20 62 65  . Nor will it be
138f0 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62   considered to b
13900 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  e a hot-journal 
13910 62 79 20 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e  by this.** or an
13920 79 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  y other database
13930 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61   connection. Exa
13940 63 74 6c 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e  ctly how a journ
13950 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a  al is finalized.
13960 2a 2a 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68  ** depends on wh
13970 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
13980 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e   pager is runnin
13990 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  g in exclusive m
139a0 6f 64 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63  ode and.** the c
139b0 75 72 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d  urrent journal-m
139c0 6f 64 65 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e  ode (Pager.journ
139d0 61 6c 4d 6f 64 65 20 76 61 6c 75 65 29 2c 20 61  alMode value), a
139e0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
139f0 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d     journalMode==
13a00 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f  MEMORY.**     Jo
13a10 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
13a20 69 70 74 6f 72 20 69 73 20 73 69 6d 70 6c 79 20  iptor is simply 
13a30 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 64 65 73  closed. This des
13a40 74 72 6f 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20  troys an .**    
13a50 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e   in-memory journ
13a60 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72  al..**.**   jour
13a70 6e 61 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54  nalMode==TRUNCAT
13a80 45 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c  E.**     Journal
13a90 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74   file is truncat
13aa0 65 64 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73  ed to zero bytes
13ab0 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20   in size..**.** 
13ac0 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50    journalMode==P
13ad0 45 52 53 49 53 54 0a 2a 2a 20 20 20 20 20 54 68  ERSIST.**     Th
13ae0 65 20 66 69 72 73 74 20 32 38 20 62 79 74 65 73  e first 28 bytes
13af0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
13b00 66 69 6c 65 20 61 72 65 20 7a 65 72 6f 65 64 2e  file are zeroed.
13b10 20 54 68 69 73 20 69 6e 76 61 6c 69 64 61 74 65   This invalidate
13b20 73 0a 2a 2a 20 20 20 20 20 74 68 65 20 66 69 72  s.**     the fir
13b30 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
13b40 72 20 69 6e 20 74 68 65 20 66 69 6c 65 2c 20 61  r in the file, a
13b50 6e 64 20 68 65 6e 63 65 20 74 68 65 20 65 6e 74  nd hence the ent
13b60 69 72 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  ire journal.**  
13b70 20 20 20 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61     file. An inva
13b80 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  lid journal file
13b90 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65   cannot be rolle
13ba0 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20  d back..**.**   
13bb0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c  journalMode==DEL
13bc0 45 54 45 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a  ETE.**     The j
13bd0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63  ournal file is c
13be0 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65  losed and delete
13bf0 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f  d using sqlite3O
13c00 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a  sDelete()..**.**
13c10 20 20 20 20 20 49 66 20 74 68 65 20 70 61 67 65       If the page
13c20 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20  r is running in 
13c30 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20  exclusive mode, 
13c40 74 68 69 73 20 6d 65 74 68 6f 64 20 6f 66 20 66  this method of f
13c50 69 6e 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20  inalizing.**    
13c60 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
13c70 65 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e  e is never used.
13c80 20 49 6e 73 74 65 61 64 2c 20 69 66 20 74 68 65   Instead, if the
13c90 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a   journalMode is.
13ca0 2a 2a 20 20 20 20 20 44 45 4c 45 54 45 20 61 6e  **     DELETE an
13cb0 64 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  d the pager is i
13cc0 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
13cd0 2c 20 74 68 65 20 6d 65 74 68 6f 64 20 64 65 73  , the method des
13ce0 63 72 69 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20  cribed under.** 
13cf0 20 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d      journalMode=
13d00 3d 50 45 52 53 49 53 54 20 69 73 20 75 73 65 64  =PERSIST is used
13d10 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20   instead..**.** 
13d20 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61  After the journa
13d30 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20  l is finalized, 
13d40 74 68 65 20 70 61 67 65 72 20 6d 6f 76 65 73 20  the pager moves 
13d50 74 6f 20 50 41 47 45 52 5f 52 45 41 44 45 52 20  to PAGER_READER 
13d60 73 74 61 74 65 2e 0a 2a 2a 20 49 66 20 72 75 6e  state..** If run
13d70 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c  ning in non-excl
13d80 75 73 69 76 65 20 72 6f 6c 6c 62 61 63 6b 20 6d  usive rollback m
13d90 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20 6f 6e  ode, the lock on
13da0 20 74 68 65 20 66 69 6c 65 20 69 73 20 0a 2a 2a   the file is .**
13db0 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 61   downgraded to a
13dc0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
13dd0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
13de0 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20   returned if no 
13df0 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 49 66  error occurs. If
13e00 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
13e10 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f   during.** any o
13e20 66 20 74 68 65 20 49 4f 20 6f 70 65 72 61 74 69  f the IO operati
13e30 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20  ons to finalize 
13e40 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
13e50 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a   or unlock the.*
13e60 2a 20 64 61 74 61 62 61 73 65 20 74 68 65 6e 20  * database then 
13e70 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
13e80 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f  e is returned to
13e90 20 74 68 65 20 75 73 65 72 2e 20 49 66 20 74 68   the user. If th
13ea0 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20  e .** operation 
13eb0 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20  to finalize the 
13ec0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69  journal file fai
13ed0 6c 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 64  ls, then the cod
13ee0 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72 69 65 73  e still.** tries
13ef0 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64   to unlock the d
13f00 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20  atabase file if 
13f10 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65  not in exclusive
13f20 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 0a 2a 2a   mode. If the.**
13f30 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f   unlock operatio
13f40 6e 20 66 61 69 6c 73 20 61 73 20 77 65 6c 6c 2c  n fails as well,
13f50 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   then the first 
13f60 65 72 72 6f 72 20 63 6f 64 65 20 72 65 6c 61 74  error code relat
13f70 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72  ed.** to the fir
13f80 73 74 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74  st error encount
13f90 65 72 65 64 20 28 74 68 65 20 6a 6f 75 72 6e 61  ered (the journa
13fa0 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f  l finalization o
13fb0 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  ne) is.** return
13fc0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
13fd0 74 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  t pager_end_tran
13fe0 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70  saction(Pager *p
13ff0 50 61 67 65 72 2c 20 69 6e 74 20 68 61 73 4d 61  Pager, int hasMa
14000 73 74 65 72 2c 20 69 6e 74 20 62 43 6f 6d 6d 69  ster, int bCommi
14010 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
14020 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f  QLITE_OK;      /
14030 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f  * Error code fro
14040 6d 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69  m journal finali
14050 7a 61 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e  zation operation
14060 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32 20 3d 20   */.  int rc2 = 
14070 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f  SQLITE_OK;     /
14080 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f  * Error code fro
14090 6d 20 64 62 20 66 69 6c 65 20 75 6e 6c 6f 63 6b  m db file unlock
140a0 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20   operation */.. 
140b0 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69   /* Do nothing i
140c0 66 20 74 68 65 20 70 61 67 65 72 20 64 6f 65 73  f the pager does
140d0 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 6f 70 65   not have an ope
140e0 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  n write transact
140f0 69 6f 6e 0a 20 20 2a 2a 20 6f 72 20 61 74 20 6c  ion.  ** or at l
14100 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44 20  east a RESERVED 
14110 6c 6f 63 6b 2e 20 54 68 69 73 20 66 75 6e 63 74  lock. This funct
14120 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65  ion may be calle
14130 64 20 77 68 65 6e 20 74 68 65 72 65 0a 20 20 2a  d when there.  *
14140 2a 20 69 73 20 6e 6f 20 77 72 69 74 65 2d 74 72  * is no write-tr
14150 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65  ansaction active
14160 20 62 75 74 20 61 20 52 45 53 45 52 56 45 44 20   but a RESERVED 
14170 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
14180 69 73 0a 20 20 2a 2a 20 68 65 6c 64 20 75 6e 64  is.  ** held und
14190 65 72 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61  er two circumsta
141a0 6e 63 65 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  nces:.  **.  ** 
141b0 20 20 31 2e 20 41 66 74 65 72 20 61 20 73 75 63    1. After a suc
141c0 63 65 73 73 66 75 6c 20 68 6f 74 2d 6a 6f 75 72  cessful hot-jour
141d0 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74  nal rollback, it
141e0 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 0a   is called with.
141f0 20 20 2a 2a 20 20 20 20 20 20 65 53 74 61 74 65    **      eState
14200 3d 3d 50 41 47 45 52 5f 4e 4f 4e 45 20 61 6e 64  ==PAGER_NONE and
14210 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56   eLock==EXCLUSIV
14220 45 5f 4c 4f 43 4b 2e 0a 20 20 2a 2a 0a 20 20 2a  E_LOCK..  **.  *
14230 2a 20 20 20 32 2e 20 49 66 20 61 20 63 6f 6e 6e  *   2. If a conn
14240 65 63 74 69 6f 6e 20 77 69 74 68 20 6c 6f 63 6b  ection with lock
14250 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
14260 76 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58  ve holding an EX
14270 43 4c 55 53 49 56 45 20 0a 20 20 2a 2a 20 20 20  CLUSIVE .  **   
14280 20 20 20 6c 6f 63 6b 20 73 77 69 74 63 68 65 73     lock switches
14290 20 62 61 63 6b 20 74 6f 20 6c 6f 63 6b 69 6e 67   back to locking
142a0 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 61 6e 64  _mode=normal and
142b0 20 74 68 65 6e 20 65 78 65 63 75 74 65 73 20 61   then executes a
142c0 0a 20 20 2a 2a 20 20 20 20 20 20 72 65 61 64 2d  .  **      read-
142d0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 69  transaction, thi
142e0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
142f0 6c 6c 65 64 20 77 69 74 68 20 65 53 74 61 74 65  lled with eState
14300 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 0a  ==PAGER_READER .
14310 20 20 2a 2a 20 20 20 20 20 20 61 6e 64 20 65 4c    **      and eL
14320 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
14330 4f 43 4b 20 77 68 65 6e 20 74 68 65 20 72 65 61  OCK when the rea
14340 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d-transaction is
14350 20 63 6c 6f 73 65 64 2e 0a 20 20 2a 2f 0a 20 20   closed..  */.  
14360 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
14370 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
14380 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
14390 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
143a0 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20  PAGER_ERROR );. 
143b0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
143c0 61 74 65 3c 50 41 47 45 52 5f 57 52 49 54 45 52  ate<PAGER_WRITER
143d0 5f 4c 4f 43 4b 45 44 20 26 26 20 70 50 61 67 65  _LOCKED && pPage
143e0 72 2d 3e 65 4c 6f 63 6b 3c 52 45 53 45 52 56 45  r->eLock<RESERVE
143f0 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65  D_LOCK ){.    re
14400 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14410 20 20 7d 0a 0a 20 20 72 65 6c 65 61 73 65 41 6c    }..  releaseAl
14420 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67  lSavepoints(pPag
14430 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  er);.  assert( i
14440 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
14450 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 49  d) || pPager->pI
14460 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
14470 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
14480 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
14490 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
144a0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
144b0 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65  .    /* Finalize
144c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
144d0 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71  e. */.    if( sq
144e0 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 49 73 49 6e  lite3JournalIsIn
144f0 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 6a  Memory(pPager->j
14500 66 64 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  fd) ){.      /* 
14510 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
14520 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
14530 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
14540 45 4d 4f 52 59 20 29 3b 20 2a 2f 0a 20 20 20 20  EMORY ); */.    
14550 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
14560 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
14570 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61     }else if( pPa
14580 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
14590 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
145a0 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 29 7b 0a  ODE_TRUNCATE ){.
145b0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
145c0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20  ->journalOff==0 
145d0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
145e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
145f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14600 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
14610 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
14620 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  fd, 0);.        
14630 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
14640 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 66 75 6c  K && pPager->ful
14650 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  lSync ){.       
14660 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
14670 74 68 65 20 6e 65 77 20 66 69 6c 65 20 73 69 7a  the new file siz
14680 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  e is written int
14690 6f 20 74 68 65 20 69 6e 6f 64 65 20 72 69 67 68  o the inode righ
146a0 74 20 61 77 61 79 2e 0a 20 20 20 20 20 20 20 20  t away..        
146b0 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 74    ** Otherwise t
146c0 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  he journal might
146d0 20 72 65 73 75 72 72 65 63 74 20 66 6f 6c 6c 6f   resurrect follo
146e0 77 69 6e 67 20 61 20 70 6f 77 65 72 20 6c 6f 73  wing a power los
146f0 73 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20  s and.          
14700 2a 2a 20 63 61 75 73 65 20 74 68 65 20 6c 61 73  ** cause the las
14710 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f  t transaction to
14720 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 20 53 65 65   roll back.  See
14730 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68 74  .          ** ht
14740 74 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c 61 2e 6d  tps://bugzilla.m
14750 6f 7a 69 6c 6c 61 2e 6f 72 67 2f 73 68 6f 77 5f  ozilla.org/show_
14760 62 75 67 2e 63 67 69 3f 69 64 3d 31 30 37 32 37  bug.cgi?id=10727
14770 37 33 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  73.          */.
14780 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
14790 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
147a0 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
147b0 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20  ->syncFlags);.  
147c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
147d0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
147e0 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
147f0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
14800 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
14810 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
14820 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20 20  DE_PERSIST.     
14830 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 78 63   || (pPager->exc
14840 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50  lusiveMode && pP
14850 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
14860 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
14870 4d 4f 44 45 5f 57 41 4c 29 0a 20 20 20 20 29 7b  MODE_WAL).    ){
14880 0a 20 20 20 20 20 20 72 63 20 3d 20 7a 65 72 6f  .      rc = zero
14890 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
148a0 72 2c 20 68 61 73 4d 61 73 74 65 72 29 3b 0a 20  r, hasMaster);. 
148b0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
148c0 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
148d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
148e0 20 54 68 69 73 20 62 72 61 6e 63 68 20 6d 61 79   This branch may
148f0 20 62 65 20 65 78 65 63 75 74 65 64 20 77 69 74   be executed wit
14900 68 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d  h Pager.journalM
14910 6f 64 65 3d 3d 4d 45 4d 4f 52 59 20 69 66 0a 20  ode==MEMORY if. 
14920 20 20 20 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f       ** a hot-jo
14930 75 72 6e 61 6c 20 77 61 73 20 6a 75 73 74 20 72  urnal was just r
14940 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 6e 20 74  olled back. In t
14950 68 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75  his case the jou
14960 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 66 69  rnal.      ** fi
14970 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f  le should be clo
14980 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64 2e  sed and deleted.
14990 20 49 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   If this connect
149a0 69 6f 6e 20 77 72 69 74 65 73 20 74 6f 0a 20 20  ion writes to.  
149b0 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
149c0 61 73 65 20 66 69 6c 65 2c 20 69 74 20 77 69 6c  ase file, it wil
149d0 6c 20 64 6f 20 73 6f 20 75 73 69 6e 67 20 61 6e  l do so using an
149e0 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e   in-memory journ
149f0 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  al..      */.   
14a00 20 20 20 69 6e 74 20 62 44 65 6c 65 74 65 20 3d     int bDelete =
14a10 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
14a20 6c 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  le;.      assert
14a30 28 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  ( sqlite3Journal
14a40 49 73 49 6e 4d 65 6d 6f 72 79 28 70 50 61 67 65  IsInMemory(pPage
14a50 72 2d 3e 6a 66 64 29 3d 3d 30 20 29 3b 0a 20 20  r->jfd)==0 );.  
14a60 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
14a70 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
14a80 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
14a90 44 45 5f 44 45 4c 45 54 45 20 0a 20 20 20 20 20  DE_DELETE .     
14aa0 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
14ab0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
14ac0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
14ad0 4d 45 4d 4f 52 59 20 0a 20 20 20 20 20 20 20 20  MEMORY .        
14ae0 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f     || pPager->jo
14af0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
14b00 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
14b10 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20   .      );.     
14b20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
14b30 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
14b40 20 20 20 20 69 66 28 20 62 44 65 6c 65 74 65 20      if( bDelete 
14b50 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
14b60 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
14b70 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50  pPager->pVfs, pP
14b80 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
14b90 70 50 61 67 65 72 2d 3e 65 78 74 72 61 53 79 6e  pPager->extraSyn
14ba0 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
14bb0 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  }.  }..#ifdef SQ
14bc0 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
14bd0 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
14be0 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61  IterateDirty(pPa
14bf0 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61  ger->pPCache, pa
14c00 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
14c10 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
14c20 3e 64 62 53 69 7a 65 3d 3d 30 20 26 26 20 73 71  >dbSize==0 && sq
14c30 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
14c40 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
14c50 63 68 65 29 3e 30 20 29 7b 0a 20 20 20 20 50 67  che)>0 ){.    Pg
14c60 48 64 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  Hdr *p = sqlite3
14c70 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67  PagerLookup(pPag
14c80 65 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20  er, 1);.    if( 
14c90 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 61  p ){.      p->pa
14ca0 67 65 48 61 73 68 20 3d 20 30 3b 0a 20 20 20 20  geHash = 0;.    
14cb0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
14cc0 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 29 3b 0a 20  refNotNull(p);. 
14cd0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
14ce0 0a 20 20 70 61 67 65 72 46 72 65 65 42 69 74 76  .  pagerFreeBitv
14cf0 65 63 73 28 70 50 61 67 65 72 29 3b 0a 20 20 70  ecs(pPager);.  p
14d00 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
14d10 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 7c 7c 20  .  if( MEMDB || 
14d20 70 61 67 65 72 46 6c 75 73 68 4f 6e 43 6f 6d 6d  pagerFlushOnComm
14d30 69 74 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  it(pPager) ){.  
14d40 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
14d50 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e  leanAll(pPager->
14d60 70 50 43 61 63 68 65 29 3b 0a 20 20 7d 65 6c 73  pPCache);.  }els
14d70 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  e{.    sqlite3Pc
14d80 61 63 68 65 43 6c 65 61 72 57 72 69 74 61 62 6c  acheClearWritabl
14d90 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
14da0 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
14db0 33 50 63 61 63 68 65 54 72 75 6e 63 61 74 65 28  3PcacheTruncate(
14dc0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
14dd0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29   pPager->dbSize)
14de0 3b 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73  ;..  if( pagerUs
14df0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
14e00 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20      /* Drop the 
14e10 57 41 4c 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20  WAL write-lock, 
14e20 69 66 20 61 6e 79 2e 20 41 6c 73 6f 2c 20 69 66  if any. Also, if
14e30 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
14e40 77 61 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20 6c  was in .    ** l
14e50 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
14e60 75 73 69 76 65 20 6d 6f 64 65 20 62 75 74 20 69  usive mode but i
14e70 73 20 6e 6f 20 6c 6f 6e 67 65 72 2c 20 64 72 6f  s no longer, dro
14e80 70 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20  p the EXCLUSIVE 
14e90 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 68 65 6c  .    ** lock hel
14ea0 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
14eb0 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
14ec0 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
14ed0 57 61 6c 45 6e 64 57 72 69 74 65 54 72 61 6e 73  WalEndWriteTrans
14ee0 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70  action(pPager->p
14ef0 57 61 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Wal);.    assert
14f00 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2==SQLITE_OK
14f10 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   );.  }else if( 
14f20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
14f30 20 62 43 6f 6d 6d 69 74 20 26 26 20 70 50 61 67   bCommit && pPag
14f40 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 3e 70  er->dbFileSize>p
14f50 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b  Pager->dbSize ){
14f60 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61  .    /* This bra
14f70 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65  nch is taken whe
14f80 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  n committing a t
14f90 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 72 6f  ransaction in ro
14fa0 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 0a 20  llback-journal. 
14fb0 20 20 20 2a 2a 20 6d 6f 64 65 20 69 66 20 74 68     ** mode if th
14fc0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
14fd0 6f 6e 20 64 69 73 6b 20 69 73 20 6c 61 72 67 65  on disk is large
14fe0 72 20 74 68 61 6e 20 74 68 65 20 64 61 74 61 62  r than the datab
14ff0 61 73 65 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a  ase image..    *
15000 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
15010 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20  the journal has 
15020 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 61  been finalized a
15030 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  nd the transacti
15040 6f 6e 20 0a 20 20 20 20 2a 2a 20 73 75 63 63 65  on .    ** succe
15050 73 73 66 75 6c 6c 79 20 63 6f 6d 6d 69 74 74 65  ssfully committe
15060 64 2c 20 62 75 74 20 74 68 65 20 45 58 43 4c 55  d, but the EXCLU
15070 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 73 74 69  SIVE lock is sti
15080 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20  ll held on the. 
15090 20 20 20 2a 2a 20 66 69 6c 65 2e 20 53 6f 20 69     ** file. So i
150a0 74 20 69 73 20 73 61 66 65 20 74 6f 20 74 72 75  t is safe to tru
150b0 6e 63 61 74 65 20 74 68 65 20 64 61 74 61 62 61  ncate the databa
150c0 73 65 20 66 69 6c 65 20 74 6f 20 69 74 73 20 6d  se file to its m
150d0 69 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 72 65  inimum.    ** re
150e0 71 75 69 72 65 64 20 73 69 7a 65 2e 20 20 2a 2f  quired size.  */
150f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
15100 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c  ger->eLock==EXCL
15110 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  USIVE_LOCK );.  
15120 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75    rc = pager_tru
15130 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 70 50  ncate(pPager, pP
15140 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20  ager->dbSize);. 
15150 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
15160 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6f 6d 6d  LITE_OK && bComm
15170 69 74 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61  it && isOpen(pPa
15180 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
15190 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
151a0 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72  leControl(pPager
151b0 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e  ->fd, SQLITE_FCN
151c0 54 4c 5f 43 4f 4d 4d 49 54 5f 50 48 41 53 45 54  TL_COMMIT_PHASET
151d0 57 4f 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  WO, 0);.    if( 
151e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  rc==SQLITE_NOTFO
151f0 55 4e 44 20 29 20 72 63 20 3d 20 53 51 4c 49 54  UND ) rc = SQLIT
15200 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  E_OK;.  }..  if(
15210 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
15220 69 76 65 4d 6f 64 65 20 0a 20 20 20 26 26 20 28  iveMode .   && (
15230 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
15240 67 65 72 29 20 7c 7c 20 73 71 6c 69 74 65 33 57  ger) || sqlite3W
15250 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28  alExclusiveMode(
15260 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 30 29  pPager->pWal, 0)
15270 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 32 20 3d  ).  ){.    rc2 =
15280 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70   pagerUnlockDb(p
15290 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f  Pager, SHARED_LO
152a0 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  CK);.    pPager-
152b0 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
152c0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67   = 0;.  }.  pPag
152d0 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
152e0 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 70 50 61  ER_READER;.  pPa
152f0 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
15300 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 28 72   0;..  return (r
15310 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32  c==SQLITE_OK?rc2
15320 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  :rc);.}../*.** E
15330 78 65 63 75 74 65 20 61 20 72 6f 6c 6c 62 61 63  xecute a rollbac
15340 6b 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69  k if a transacti
15350 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 64  on is active and
15360 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20   unlock the .** 
15370 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a  database file. .
15380 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
15390 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 65  er has already e
153a0 6e 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52  ntered the ERROR
153b0 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74 20 61   state, do not a
153c0 74 74 65 6d 70 74 20 0a 2a 2a 20 74 68 65 20 72  ttempt .** the r
153d0 6f 6c 6c 62 61 63 6b 20 61 74 20 74 68 69 73 20  ollback at this 
153e0 74 69 6d 65 2e 20 49 6e 73 74 65 61 64 2c 20 70  time. Instead, p
153f0 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73  ager_unlock() is
15400 20 63 61 6c 6c 65 64 2e 20 54 68 65 0a 2a 2a 20   called. The.** 
15410 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e  call to pager_un
15420 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 64 69 73 63  lock() will disc
15430 61 72 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72  ard all in-memor
15440 79 20 70 61 67 65 73 2c 20 75 6e 6c 6f 63 6b 0a  y pages, unlock.
15450 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
15460 66 69 6c 65 20 61 6e 64 20 6d 6f 76 65 20 74 68  file and move th
15470 65 20 70 61 67 65 72 20 62 61 63 6b 20 74 6f 20  e pager back to 
15480 4f 50 45 4e 20 73 74 61 74 65 2e 20 49 66 20 74  OPEN state. If t
15490 68 69 73 20 0a 2a 2a 20 6d 65 61 6e 73 20 74 68  his .** means th
154a0 61 74 20 74 68 65 72 65 20 69 73 20 61 20 68 6f  at there is a ho
154b0 74 2d 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 69  t-journal left i
154c0 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
154d0 6d 2c 20 74 68 65 20 6e 65 78 74 20 0a 2a 2a 20  m, the next .** 
154e0 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6f 62  connection to ob
154f0 74 61 69 6e 20 61 20 73 68 61 72 65 64 20 6c 6f  tain a shared lo
15500 63 6b 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20  ck on the pager 
15510 28 77 68 69 63 68 20 6d 61 79 20 62 65 20 74 68  (which may be th
15520 69 73 20 6f 6e 65 29 20 0a 2a 2a 20 77 69 6c 6c  is one) .** will
15530 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a   roll it back..*
15540 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
15550 72 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64  r has not alread
15560 79 20 65 6e 74 65 72 65 64 20 74 68 65 20 45 52  y entered the ER
15570 52 4f 52 20 73 74 61 74 65 2c 20 62 75 74 20 61  ROR state, but a
15580 6e 20 49 4f 20 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f  n IO or.** mallo
15590 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  c error occurs d
155a0 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
155b0 2c 20 74 68 65 6e 20 74 68 69 73 20 77 69 6c 6c  , then this will
155c0 20 69 74 73 65 6c 66 20 63 61 75 73 65 20 0a 2a   itself cause .*
155d0 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 65  * the pager to e
155e0 6e 74 65 72 20 74 68 65 20 45 52 52 4f 52 20 73  nter the ERROR s
155f0 74 61 74 65 2e 20 57 68 69 63 68 20 77 69 6c 6c  tate. Which will
15600 20 62 65 20 63 6c 65 61 72 65 64 20 62 79 20 74   be cleared by t
15610 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61  he.** call to pa
15620 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 2c 20 61 73  ger_unlock(), as
15630 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65   described above
15640 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
15650 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52   pagerUnlockAndR
15660 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70  ollback(Pager *p
15670 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50  Pager){.  if( pP
15680 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
15690 47 45 52 5f 45 52 52 4f 52 20 26 26 20 70 50 61  GER_ERROR && pPa
156a0 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
156b0 45 52 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20 61  ER_OPEN ){.    a
156c0 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
156d0 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
156e0 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  ) );.    if( pPa
156f0 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
15700 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
15710 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
15720 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
15730 6f 63 28 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  oc();.      sqli
15740 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
15750 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
15760 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
15770 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 7d 65  Malloc();.    }e
15780 6c 73 65 20 69 66 28 20 21 70 50 61 67 65 72 2d  lse if( !pPager-
15790 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
157a0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
157b0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
157c0 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a  PAGER_READER );.
157d0 20 20 20 20 20 20 70 61 67 65 72 5f 65 6e 64 5f        pager_end_
157e0 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
157f0 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  er, 0, 0);.    }
15800 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c  .  }.  pager_unl
15810 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a  ock(pPager);.}..
15820 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  /*.** Parameter 
15830 61 44 61 74 61 20 6d 75 73 74 20 70 6f 69 6e 74  aData must point
15840 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20   to a buffer of 
15850 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
15860 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74   bytes.** of dat
15870 61 2e 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72  a. Compute and r
15880 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d  eturn a checksum
15890 20 62 61 73 65 64 20 6f 6e 74 20 74 68 65 20 63   based ont the c
158a0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a  ontents of the .
158b0 2a 2a 20 70 61 67 65 20 6f 66 20 64 61 74 61 20  ** page of data 
158c0 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  and the current 
158d0 76 61 6c 75 65 20 6f 66 20 70 50 61 67 65 72 2d  value of pPager-
158e0 3e 63 6b 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a  >cksumInit..**.*
158f0 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20  * This is not a 
15900 72 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 49  real checksum. I
15910 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74  t is really just
15920 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
15930 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69  .** random initi
15940 61 6c 20 76 61 6c 75 65 20 28 70 50 61 67 65 72  al value (pPager
15950 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 20 61 6e 64  ->cksumInit) and
15960 20 65 76 65 72 79 20 32 30 30 74 68 20 62 79 74   every 200th byt
15970 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65  e.** of the page
15980 20 64 61 74 61 2c 20 73 74 61 72 74 69 6e 67 20   data, starting 
15990 77 69 74 68 20 62 79 74 65 20 6f 66 66 73 65 74  with byte offset
159a0 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69   (pPager->pageSi
159b0 7a 65 25 32 30 30 29 2e 0a 2a 2a 20 45 61 63 68  ze%200)..** Each
159c0 20 62 79 74 65 20 69 73 20 69 6e 74 65 72 70 72   byte is interpr
159d0 65 74 65 64 20 61 73 20 61 6e 20 38 2d 62 69 74  eted as an 8-bit
159e0 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65   unsigned intege
159f0 72 2e 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e  r..**.** Changin
15a00 67 20 74 68 65 20 66 6f 72 6d 75 6c 61 20 75 73  g the formula us
15a10 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ed to compute th
15a20 69 73 20 63 68 65 63 6b 73 75 6d 20 72 65 73 75  is checksum resu
15a30 6c 74 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63  lts in an.** inc
15a40 6f 6d 70 61 74 69 62 6c 65 20 6a 6f 75 72 6e 61  ompatible journa
15a50 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a  l file format..*
15a60 2a 0a 2a 2a 20 49 66 20 6a 6f 75 72 6e 61 6c 20  *.** If journal 
15a70 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72  corruption occur
15a80 73 20 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72  s due to a power
15a90 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f   failure, the mo
15aa0 73 74 20 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73 63  st likely .** sc
15ab0 65 6e 61 72 69 6f 20 69 73 20 74 68 61 74 20 6f  enario is that o
15ac0 6e 65 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74  ne end or the ot
15ad0 68 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72  her of the recor
15ae0 64 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65  d will be change
15af0 64 2e 20 0a 2a 2a 20 49 74 20 69 73 20 6d 75 63  d. .** It is muc
15b00 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68  h less likely th
15b10 61 74 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20  at the two ends 
15b20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72  of the journal r
15b30 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a  ecord will be.**
15b40 20 63 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65   correct and the
15b50 20 6d 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75   middle be corru
15b60 70 74 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20  pt.  Thus, this 
15b70 22 63 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d  "checksum" schem
15b80 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73  e,.** though fas
15b90 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61  t and simple, ca
15ba0 74 63 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79  tches the mostly
15bb0 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20   likely kind of 
15bc0 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73  corruption..*/.s
15bd0 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f  tatic u32 pager_
15be0 63 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61  cksum(Pager *pPa
15bf0 67 65 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61  ger, const u8 *a
15c00 44 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73  Data){.  u32 cks
15c10 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73  um = pPager->cks
15c20 75 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20  umInit;         
15c30 2f 2a 20 43 68 65 63 6b 73 75 6d 20 76 61 6c 75  /* Checksum valu
15c40 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20  e to return */. 
15c50 20 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d   int i = pPager-
15c60 3e 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 20 20  >pageSize-200;  
15c70 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
15c80 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 77 68 69  counter */.  whi
15c90 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63  le( i>0 ){.    c
15ca0 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d  ksum += aData[i]
15cb0 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a  ;.    i -= 200;.
15cc0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73    }.  return cks
15cd0 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70  um;.}../*.** Rep
15ce0 6f 72 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  ort the current 
15cf0 70 61 67 65 20 73 69 7a 65 20 61 6e 64 20 6e 75  page size and nu
15d00 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64  mber of reserved
15d10 20 62 79 74 65 73 20 62 61 63 6b 0a 2a 2a 20 74   bytes back.** t
15d20 6f 20 74 68 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a  o the codec..*/.
15d30 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
15d40 53 5f 43 4f 44 45 43 0a 73 74 61 74 69 63 20 76  S_CODEC.static v
15d50 6f 69 64 20 70 61 67 65 72 52 65 70 6f 72 74 53  oid pagerReportS
15d60 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
15d70 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r){.  if( pPager
15d80 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67  ->xCodecSizeChng
15d90 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
15da0 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 28 70  xCodecSizeChng(p
15db0 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 2c 20 70  Pager->pCodec, p
15dc0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
15dd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15de0 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74              (int
15df0 29 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76  )pPager->nReserv
15e00 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a  e);.  }.}.#else.
15e10 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 52 65  # define pagerRe
15e20 70 6f 72 74 53 69 7a 65 28 58 29 20 20 20 20 20  portSize(X)     
15e30 2f 2a 20 4e 6f 2d 6f 70 20 69 66 20 77 65 20 64  /* No-op if we d
15e40 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 20  o not support a 
15e50 63 6f 64 65 63 20 2a 2f 0a 23 65 6e 64 69 66 0a  codec */.#endif.
15e60 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
15e70 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 4d  AS_CODEC./*.** M
15e80 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e 75 6d  ake sure the num
15e90 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20  ber of reserved 
15ea0 62 69 74 73 20 69 73 20 74 68 65 20 73 61 6d 65  bits is the same
15eb0 20 69 6e 20 74 68 65 20 64 65 73 74 69 6e 61 74   in the destinat
15ec0 69 6f 6e 0a 2a 2a 20 70 61 67 65 72 20 61 73 20  ion.** pager as 
15ed0 69 74 20 69 73 20 69 6e 20 74 68 65 20 73 6f 75  it is in the sou
15ee0 72 63 65 2e 20 20 54 68 69 73 20 63 6f 6d 65 73  rce.  This comes
15ef0 20 75 70 20 77 68 65 6e 20 61 20 56 41 43 55 55   up when a VACUU
15f00 4d 20 63 68 61 6e 67 65 73 20 74 68 65 0a 2a 2a  M changes the.**
15f10 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72   number of reser
15f20 76 65 64 20 62 69 74 73 20 74 6f 20 74 68 65 20  ved bits to the 
15f30 22 6f 70 74 69 6d 61 6c 22 20 61 6d 6f 75 6e 74  "optimal" amount
15f40 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
15f50 33 50 61 67 65 72 41 6c 69 67 6e 52 65 73 65 72  3PagerAlignReser
15f60 76 65 28 50 61 67 65 72 20 2a 70 44 65 73 74 2c  ve(Pager *pDest,
15f70 20 50 61 67 65 72 20 2a 70 53 72 63 29 7b 0a 20   Pager *pSrc){. 
15f80 20 69 66 28 20 70 44 65 73 74 2d 3e 6e 52 65 73   if( pDest->nRes
15f90 65 72 76 65 21 3d 70 53 72 63 2d 3e 6e 52 65 73  erve!=pSrc->nRes
15fa0 65 72 76 65 20 29 7b 0a 20 20 20 20 70 44 65 73  erve ){.    pDes
15fb0 74 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 70 53  t->nReserve = pS
15fc0 72 63 2d 3e 6e 52 65 73 65 72 76 65 3b 0a 20 20  rc->nReserve;.  
15fd0 20 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a    pagerReportSiz
15fe0 65 28 70 44 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a  e(pDest);.  }.}.
15ff0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
16000 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  ad a single page
16010 20 66 72 6f 6d 20 65 69 74 68 65 72 20 74 68 65   from either the
16020 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69   journal file (i
16030 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29  f isMainJrnl==1)
16040 20 6f 72 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20   or.** from the 
16050 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 28 69 66 20  sub-journal (if 
16060 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61  isMainJrnl==0) a
16070 6e 64 20 70 6c 61 79 62 61 63 6b 20 74 68 61 74  nd playback that
16080 20 70 61 67 65 2e 0a 2a 2a 20 54 68 65 20 70 61   page..** The pa
16090 67 65 20 62 65 67 69 6e 73 20 61 74 20 6f 66 66  ge begins at off
160a0 73 65 74 20 2a 70 4f 66 66 73 65 74 20 69 6e 74  set *pOffset int
160b0 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68 65 20  o the file. The 
160c0 2a 70 4f 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75  *pOffset.** valu
160d0 65 20 69 73 20 69 6e 63 72 65 61 73 65 64 20 74  e is increased t
160e0 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
160f0 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
16100 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
16110 2a 2a 20 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  ** The main roll
16120 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65  back journal use
16130 73 20 63 68 65 63 6b 73 75 6d 73 20 2d 20 74 68  s checksums - th
16140 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
16150 6e 61 6c 20 64 6f 65 73 20 0a 2a 2a 20 6e 6f 74  nal does .** not
16160 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
16170 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
16180 65 20 70 61 67 65 20 72 65 63 6f 72 64 20 72 65  e page record re
16190 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62  ad from the (sub
161a0 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  -)journal file.*
161b0 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  * is greater tha
161c0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  n the current va
161d0 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53  lue of Pager.dbS
161e0 69 7a 65 2c 20 74 68 65 6e 20 70 6c 61 79 62 61  ize, then playba
161f0 63 6b 20 69 73 0a 2a 2a 20 73 6b 69 70 70 65 64  ck is.** skipped
16200 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69   and SQLITE_OK i
16210 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
16220 2a 20 49 66 20 70 44 6f 6e 65 20 69 73 20 6e 6f  * If pDone is no
16230 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20  t NULL, then it 
16240 69 73 20 61 20 72 65 63 6f 72 64 20 6f 66 20 70  is a record of p
16250 61 67 65 73 20 74 68 61 74 20 68 61 76 65 20 61  ages that have a
16260 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70  lready.** been p
16270 6c 61 79 65 64 20 62 61 63 6b 2e 20 20 49 66 20  layed back.  If 
16280 74 68 65 20 70 61 67 65 20 61 74 20 2a 70 4f 66  the page at *pOf
16290 66 73 65 74 20 68 61 73 20 61 6c 72 65 61 64 79  fset has already
162a0 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63   been played bac
162b0 6b 0a 2a 2a 20 28 69 66 20 74 68 65 20 63 6f 72  k.** (if the cor
162c0 72 65 73 70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65  responding pDone
162d0 20 62 69 74 20 69 73 20 73 65 74 29 20 74 68 65   bit is set) the
162e0 6e 20 73 6b 69 70 20 74 68 65 20 70 6c 61 79 62  n skip the playb
162f0 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ack..** Make sur
16300 65 20 74 68 65 20 70 44 6f 6e 65 20 62 69 74 20  e the pDone bit 
16310 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
16320 20 74 68 65 20 2a 70 4f 66 66 73 65 74 20 70 61   the *pOffset pa
16330 67 65 20 69 73 20 73 65 74 0a 2a 2a 20 70 72 69  ge is set.** pri
16340 6f 72 20 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e  or to returning.
16350 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
16360 67 65 20 72 65 63 6f 72 64 20 69 73 20 73 75 63  ge record is suc
16370 63 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66  cessfully read f
16380 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f  rom the (sub-)jo
16390 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e  urnal file.** an
163a0 64 20 70 6c 61 79 65 64 20 62 61 63 6b 2c 20 74  d played back, t
163b0 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  hen SQLITE_OK is
163c0 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
163d0 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
163e0 0a 2a 2a 20 77 68 69 6c 65 20 72 65 61 64 69 6e  .** while readin
163f0 67 20 74 68 65 20 72 65 63 6f 72 64 20 66 72 6f  g the record fro
16400 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72  m the (sub-)jour
16410 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 68 69 6c  nal file or whil
16420 65 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 6f 20  e writing.** to 
16430 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
16440 65 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65  e, then the IO e
16450 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
16460 75 72 6e 65 64 2e 20 49 66 20 64 61 74 61 0a 2a  urned. If data.*
16470 2a 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c  * is successfull
16480 79 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  y read from the 
16490 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69  (sub-)journal fi
164a0 6c 65 20 62 75 74 20 61 70 70 65 61 72 73 20 74  le but appears t
164b0 6f 20 62 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65  o be.** corrupte
164c0 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69  d, SQLITE_DONE i
164d0 73 20 72 65 74 75 72 6e 65 64 2e 20 44 61 74 61  s returned. Data
164e0 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 63   is considered c
164f0 6f 72 72 75 70 74 65 64 20 69 6e 0a 2a 2a 20 74  orrupted in.** t
16500 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73  wo circumstances
16510 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49 66 20  :.** .**   * If 
16520 74 68 65 20 72 65 63 6f 72 64 20 70 61 67 65 2d  the record page-
16530 6e 75 6d 62 65 72 20 69 73 20 69 6c 6c 65 67 61  number is illega
16540 6c 20 28 30 20 6f 72 20 50 41 47 45 52 5f 4d 4a  l (0 or PAGER_MJ
16550 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20  _PGNO), or.**   
16560 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20  * If the record 
16570 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20  is being rolled 
16580 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61  back from the ma
16590 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  in journal file.
165a0 2a 2a 20 20 20 20 20 61 6e 64 20 74 68 65 20 63  **     and the c
165b0 68 65 63 6b 73 75 6d 20 66 69 65 6c 64 20 64 6f  hecksum field do
165c0 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  es not match the
165d0 20 72 65 63 6f 72 64 20 63 6f 6e 74 65 6e 74 2e   record content.
165e0 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65 72 20 6f  .**.** Neither o
165f0 66 20 74 68 65 73 65 20 74 77 6f 20 73 63 65 6e  f these two scen
16600 61 72 69 6f 73 20 61 72 65 20 70 6f 73 73 69 62  arios are possib
16610 6c 65 20 64 75 72 69 6e 67 20 61 20 73 61 76 65  le during a save
16620 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a  point rollback..
16630 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 69 73  **.** If this is
16640 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c   a savepoint rol
16650 6c 62 61 63 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f  lback, then memo
16660 72 79 20 6d 61 79 20 68 61 76 65 20 74 6f 20 62  ry may have to b
16670 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a  e dynamically.**
16680 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68   allocated by th
16690 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20  is function. If 
166a0 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
166b0 20 61 6e 64 20 61 6e 20 61 6c 6c 6f 63 61 74 69   and an allocati
166c0 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c  on fails,.** SQL
166d0 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74  ITE_NOMEM is ret
166e0 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
166f0 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62   int pager_playb
16700 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20  ack_one_page(.  
16710 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
16720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16730 20 54 68 65 20 70 61 67 65 72 20 62 65 69 6e 67   The pager being
16740 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a   played back */.
16750 20 20 69 36 34 20 2a 70 4f 66 66 73 65 74 2c 20    i64 *pOffset, 
16760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16770 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 72 65 63  /* Offset of rec
16780 6f 72 64 20 74 6f 20 70 6c 61 79 62 61 63 6b 20  ord to playback 
16790 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f  */.  Bitvec *pDo
167a0 6e 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ne,             
167b0 20 20 20 2f 2a 20 42 69 74 76 65 63 20 6f 66 20     /* Bitvec of 
167c0 70 61 67 65 73 20 61 6c 72 65 61 64 79 20 70 6c  pages already pl
167d0 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69  ayed back */.  i
167e0 6e 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20  nt isMainJrnl,  
167f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16800 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61  1 -> main journa
16810 6c 2e 20 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72  l. 0 -> sub-jour
16820 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 73  nal. */.  int is
16830 53 61 76 65 70 6e 74 20 20 20 20 20 20 20 20 20  Savepnt         
16840 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
16850 66 6f 72 20 61 20 73 61 76 65 70 6f 69 6e 74 20  for a savepoint 
16860 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20  rollback */.){. 
16870 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72   int rc;.  PgHdr
16880 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20   *pPg;          
16890 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
168a0 78 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20  xisting page in 
168b0 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50  the cache */.  P
168c0 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  gno pgno;       
168d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
168e0 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
168f0 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75  of a page in jou
16900 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b  rnal */.  u32 ck
16910 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  sum;            
16920 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
16930 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e  sum used for san
16940 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a  ity checking */.
16950 20 20 63 68 61 72 20 2a 61 44 61 74 61 3b 20 20    char *aData;  
16960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16970 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 74 6f  /* Temporary sto
16980 72 61 67 65 20 66 6f 72 20 74 68 65 20 70 61 67  rage for the pag
16990 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  e */.  sqlite3_f
169a0 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20 20  ile *jfd;       
169b0 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65       /* The file
169c0 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
169d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
169e0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 79 6e 63   */.  int isSync
169f0 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
16a00 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a      /* True if j
16a10 6f 75 72 6e 61 6c 20 70 61 67 65 20 69 73 20 73  ournal page is s
16a20 79 6e 63 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65  ynced */..  asse
16a30 72 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26  rt( (isMainJrnl&
16a40 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f  ~1)==0 );      /
16a50 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20  * isMainJrnl is 
16a60 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65  0 or 1 */.  asse
16a70 72 74 28 20 28 69 73 53 61 76 65 70 6e 74 26 7e  rt( (isSavepnt&~
16a80 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 2f  1)==0 );       /
16a90 2a 20 69 73 53 61 76 65 70 6e 74 20 69 73 20 30  * isSavepnt is 0
16aa0 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72   or 1 */.  asser
16ab0 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c  t( isMainJrnl ||
16ac0 20 70 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a   pDone );     /*
16ad0 20 70 44 6f 6e 65 20 61 6c 77 61 79 73 20 75 73   pDone always us
16ae0 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61  ed on sub-journa
16af0 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ls */.  assert( 
16b00 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f  isSavepnt || pDo
16b10 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44  ne==0 );   /* pD
16b20 6f 6e 65 20 6e 65 76 65 72 20 75 73 65 64 20 6f  one never used o
16b30 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20  n non-savepoint 
16b40 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20 70 50  */..  aData = pP
16b50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
16b60 0a 20 20 61 73 73 65 72 74 28 20 61 44 61 74 61  .  assert( aData
16b70 20 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54   );         /* T
16b80 65 6d 70 20 73 74 6f 72 61 67 65 20 6d 75 73 74  emp storage must
16b90 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
16ba0 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a  en allocated */.
16bb0 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55    assert( pagerU
16bc0 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30  seWal(pPager)==0
16bd0 20 7c 7c 20 28 21 69 73 4d 61 69 6e 4a 72 6e 6c   || (!isMainJrnl
16be0 20 26 26 20 69 73 53 61 76 65 70 6e 74 29 20 29   && isSavepnt) )
16bf0 3b 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 74  ;..  /* Either t
16c00 68 65 20 73 74 61 74 65 20 69 73 20 67 72 65 61  he state is grea
16c10 74 65 72 20 74 68 61 6e 20 50 41 47 45 52 5f 57  ter than PAGER_W
16c20 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 28  RITER_CACHEMOD (
16c30 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20  a transaction . 
16c40 20 2a 2a 20 6f 72 20 73 61 76 65 70 6f 69 6e 74   ** or savepoint
16c50 20 72 6f 6c 6c 62 61 63 6b 20 64 6f 6e 65 20 61   rollback done a
16c60 74 20 74 68 65 20 72 65 71 75 65 73 74 20 6f 66  t the request of
16c70 20 74 68 65 20 63 61 6c 6c 65 72 29 20 6f 72 20   the caller) or 
16c80 74 68 69 73 20 69 73 0a 20 20 2a 2a 20 61 20 68  this is.  ** a h
16c90 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
16ca0 61 63 6b 2e 20 49 66 20 69 74 20 69 73 20 61 20  ack. If it is a 
16cb0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
16cc0 62 61 63 6b 2c 20 74 68 65 20 70 61 67 65 72 0a  back, the pager.
16cd0 20 20 2a 2a 20 69 73 20 69 6e 20 73 74 61 74 65    ** is in state
16ce0 20 4f 50 45 4e 20 61 6e 64 20 68 6f 6c 64 73 20   OPEN and holds 
16cf0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
16d00 6b 2e 20 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72  k. Hot-journal r
16d10 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6f 6e 6c  ollback.  ** onl
16d20 79 20 72 65 61 64 73 20 66 72 6f 6d 20 74 68 65  y reads from the
16d30 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6e   main journal, n
16d40 6f 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  ot the sub-journ
16d50 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  al..  */.  asser
16d60 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
16d70 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
16d80 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20  CACHEMOD.       
16d90 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61  || (pPager->eSta
16da0 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26  te==PAGER_OPEN &
16db0 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  & pPager->eLock=
16dc0 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29  =EXCLUSIVE_LOCK)
16dd0 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
16de0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
16df0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
16e00 48 45 4d 4f 44 20 7c 7c 20 69 73 4d 61 69 6e 4a  HEMOD || isMainJ
16e10 72 6e 6c 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61  rnl );..  /* Rea
16e20 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  d the page numbe
16e30 72 20 61 6e 64 20 70 61 67 65 20 64 61 74 61 20  r and page data 
16e40 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
16e50 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a   or sub-journal.
16e60 20 20 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75 72    ** file. Retur
16e70 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
16e80 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69 66  to the caller if
16e90 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
16ea0 75 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20  urs..  */.  jfd 
16eb0 3d 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70  = isMainJrnl ? p
16ec0 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61  Pager->jfd : pPa
16ed0 67 65 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20  ger->sjfd;.  rc 
16ee0 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
16ef0 2c 20 2a 70 4f 66 66 73 65 74 2c 20 26 70 67 6e  , *pOffset, &pgn
16f00 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  o);.  if( rc!=SQ
16f10 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
16f20 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   rc;.  rc = sqli
16f30 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 28  te3OsRead(jfd, (
16f40 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65  u8*)aData, pPage
16f50 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 2a 70  r->pageSize, (*p
16f60 4f 66 66 73 65 74 29 2b 34 29 3b 0a 20 20 69 66  Offset)+4);.  if
16f70 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16f80 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a  ) return rc;.  *
16f90 70 4f 66 66 73 65 74 20 2b 3d 20 70 50 61 67 65  pOffset += pPage
16fa0 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 20  r->pageSize + 4 
16fb0 2b 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a  + isMainJrnl*4;.
16fc0 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65  .  /* Sanity che
16fd0 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67  cking on the pag
16fe0 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65  e.  This is more
16ff0 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
17000 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a  I originally.  *
17010 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61  * thought.  If a
17020 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f   power failure o
17030 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20  ccurs while the 
17040 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67  journal is being
17050 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69   written,.  ** i
17060 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e  t could cause in
17070 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65  valid data to be
17080 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
17090 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e  e journal.  We n
170a0 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65  eed to.  ** dete
170b0 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20  ct this invalid 
170c0 64 61 74 61 20 28 77 69 74 68 20 68 69 67 68 20  data (with high 
170d0 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64  probability) and
170e0 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f   ignore it..  */
170f0 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c  .  if( pgno==0 |
17100 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a  | pgno==PAGER_MJ
17110 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
17120 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73  .    assert( !is
17130 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 72  Savepnt );.    r
17140 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
17150 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e  E;.  }.  if( pgn
17160 6f 3e 28 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e  o>(Pgno)pPager->
17170 64 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65  dbSize || sqlite
17180 33 42 69 74 76 65 63 54 65 73 74 28 70 44 6f 6e  3BitvecTest(pDon
17190 65 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20  e, pgno) ){.    
171a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
171b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4d 61  ;.  }.  if( isMa
171c0 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63  inJrnl ){.    rc
171d0 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66   = read32bits(jf
171e0 64 2c 20 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c  d, (*pOffset)-4,
171f0 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66   &cksum);.    if
17200 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
17210 3b 0a 20 20 20 20 69 66 28 20 21 69 73 53 61 76  ;.    if( !isSav
17220 65 70 6e 74 20 26 26 20 70 61 67 65 72 5f 63 6b  epnt && pager_ck
17230 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a  sum(pPager, (u8*
17240 29 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29  )aData)!=cksum )
17250 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
17260 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
17270 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
17280 68 69 73 20 70 61 67 65 20 68 61 73 20 61 6c 72  his page has alr
17290 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64  eady been played
172a0 20 62 61 63 6b 20 62 65 66 6f 72 65 20 64 75 72   back before dur
172b0 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 0a  ing the current.
172c0 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 74    ** rollback, t
172d0 68 65 6e 20 64 6f 6e 27 74 20 62 6f 74 68 65 72  hen don't bother
172e0 20 74 6f 20 70 6c 61 79 20 69 74 20 62 61 63 6b   to play it back
172f0 20 61 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69   again..  */.  i
17300 66 28 20 70 44 6f 6e 65 20 26 26 20 28 72 63 20  f( pDone && (rc 
17310 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  = sqlite3BitvecS
17320 65 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29  et(pDone, pgno))
17330 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
17340 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
17350 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61  }..  /* When pla
17360 79 69 6e 67 20 62 61 63 6b 20 70 61 67 65 20 31  ying back page 1
17370 2c 20 72 65 73 74 6f 72 65 20 74 68 65 20 6e 52  , restore the nR
17380 65 73 65 72 76 65 20 73 65 74 74 69 6e 67 0a 20  eserve setting. 
17390 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d   */.  if( pgno==
173a0 31 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65  1 && pPager->nRe
173b0 73 65 72 76 65 21 3d 28 28 75 38 2a 29 61 44 61  serve!=((u8*)aDa
173c0 74 61 29 5b 32 30 5d 20 29 7b 0a 20 20 20 20 70  ta)[20] ){.    p
173d0 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20  Pager->nReserve 
173e0 3d 20 28 28 75 38 2a 29 61 44 61 74 61 29 5b 32  = ((u8*)aData)[2
173f0 30 5d 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70  0];.    pagerRep
17400 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b  ortSize(pPager);
17410 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
17420 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 43 41  e pager is in CA
17430 43 48 45 4d 4f 44 20 73 74 61 74 65 2c 20 74 68  CHEMOD state, th
17440 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  en there must be
17450 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a   a copy of this.
17460 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65    ** page in the
17470 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e   pager cache. In
17480 20 74 68 69 73 20 63 61 73 65 20 6a 75 73 74 20   this case just 
17490 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72  update the pager
174a0 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74   cache,.  ** not
174b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
174c0 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
174d0 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74  left marked dirt
174e0 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  y in this case..
174f0 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63    **.  ** An exc
17500 65 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62  eption to the ab
17510 6f 76 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65  ove rule: If the
17520 20 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20   database is in 
17530 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a  no-sync mode.  *
17540 2a 20 61 6e 64 20 61 20 70 61 67 65 20 69 73 20  * and a page is 
17550 6d 6f 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20  moved during an 
17560 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
17570 75 6d 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  um then the page
17580 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65   may.  ** not be
17590 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   in the pager ca
175a0 63 68 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61  che. Later: if a
175b0 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20   malloc() or IO 
175c0 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a  error occurs.  *
175d0 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70  * during a Movep
175e0 61 67 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e  age() call, then
175f0 20 74 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f   the page may no
17600 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68  t be in the cach
17610 65 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53  e.  ** either. S
17620 6f 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  o the condition 
17630 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65  described in the
17640 20 61 62 6f 76 65 20 70 61 72 61 67 72 61 70 68   above paragraph
17650 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73   is not.  ** ass
17660 65 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a  ert()able..  **.
17670 20 20 2a 2a 20 49 66 20 69 6e 20 57 52 49 54 45    ** If in WRITE
17680 52 5f 44 42 4d 4f 44 2c 20 57 52 49 54 45 52 5f  R_DBMOD, WRITER_
17690 46 49 4e 49 53 48 45 44 20 6f 72 20 4f 50 45 4e  FINISHED or OPEN
176a0 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20   state, then we 
176b0 75 70 64 61 74 65 20 74 68 65 0a 20 20 2a 2a 20  update the.  ** 
176c0 70 61 67 65 72 20 63 61 63 68 65 20 69 66 20 69  pager cache if i
176d0 74 20 65 78 69 73 74 73 20 61 6e 64 20 74 68 65  t exists and the
176e0 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20   main file. The 
176f0 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72  page is then mar
17700 6b 65 64 20 0a 20 20 2a 2a 20 6e 6f 74 20 64 69  ked .  ** not di
17710 72 74 79 2e 20 53 69 6e 63 65 20 74 68 69 73 20  rty. Since this 
17720 63 6f 64 65 20 69 73 20 6f 6e 6c 79 20 65 78 65  code is only exe
17730 63 75 74 65 64 20 69 6e 20 50 41 47 45 52 5f 4f  cuted in PAGER_O
17740 50 45 4e 20 73 74 61 74 65 20 66 6f 72 0a 20 20  PEN state for.  
17750 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
17760 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73   rollback, it is
17770 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
17780 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20   the page-cache 
17790 69 73 20 65 6d 70 74 79 0a 20 20 2a 2a 20 69 66  is empty.  ** if
177a0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
177b0 20 4f 50 45 4e 20 73 74 61 74 65 2e 0a 20 20 2a   OPEN state..  *
177c0 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31  *.  ** Ticket #1
177d0 31 37 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d  171:  The statem
177e0 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  ent journal migh
177f0 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63  t contain page c
17800 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20  ontent that is. 
17810 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72   ** different fr
17820 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  om the page cont
17830 65 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74  ent at the start
17840 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
17850 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f  ion..  ** This o
17860 63 63 75 72 73 20 77 68 65 6e 20 61 20 70 61 67  ccurs when a pag
17870 65 20 69 73 20 63 68 61 6e 67 65 64 20 70 72 69  e is changed pri
17880 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  or to the start 
17890 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20  of a statement. 
178a0 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64   ** then changed
178b0 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68   again within th
178c0 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68  e statement.  Wh
178d0 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  en rolling back 
178e0 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74  such a.  ** stat
178f0 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f  ement we must no
17900 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f  t write to the o
17910 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
17920 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a   unless we know.
17930 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e    ** for certain
17940 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70   that original p
17950 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65  age contents are
17960 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65   synced into the
17970 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20   main rollback. 
17980 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74   ** journal.  Ot
17990 68 65 72 77 69 73 65 2c 20 61 20 70 6f 77 65 72  herwise, a power
179a0 20 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65 61 76   loss might leav
179b0 65 20 6d 6f 64 69 66 69 65 64 20 64 61 74 61 20  e modified data 
179c0 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  in the.  ** data
179d0 62 61 73 65 20 66 69 6c 65 20 77 69 74 68 6f 75  base file withou
179e0 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68  t an entry in th
179f0 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
17a00 61 6c 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a  al that can.  **
17a10 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
17a20 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
17a30 67 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f  ginal form.  Two
17a40 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74   conditions must
17a50 20 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66   be.  ** met bef
17a60 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74  ore writing to t
17a70 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
17a80 73 2e 20 28 31 29 20 74 68 65 20 64 61 74 61 62  s. (1) the datab
17a90 61 73 65 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a  ase must be.  **
17aa0 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65   locked.  (2) we
17ab0 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f   know that the o
17ac0 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e  riginal page con
17ad0 74 65 6e 74 20 69 73 20 66 75 6c 6c 79 20 73 79  tent is fully sy
17ae0 6e 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65  nced.  ** in the
17af0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69   main journal ei
17b00 74 68 65 72 20 62 65 63 61 75 73 65 20 74 68 65  ther because the
17b10 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
17b20 63 61 63 68 65 20 6f 72 20 65 6c 73 65 0a 20 20  cache or else.  
17b30 2a 2a 20 74 68 65 20 70 61 67 65 20 69 73 20 6d  ** the page is m
17b40 61 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e  arked as needSyn
17b50 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  c==0..  **.  ** 
17b60 32 30 30 38 2d 30 34 2d 31 34 3a 20 20 57 68 65  2008-04-14:  Whe
17b70 6e 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  n attempting to 
17b80 76 61 63 75 75 6d 20 61 20 63 6f 72 72 75 70 74  vacuum a corrupt
17b90 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
17ba0 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69  it.  ** is possi
17bb0 62 6c 65 20 74 6f 20 66 61 69 6c 20 61 20 73 74  ble to fail a st
17bc0 61 74 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74  atement on a dat
17bd0 61 62 61 73 65 20 74 68 61 74 20 64 6f 65 73 20  abase that does 
17be0 6e 6f 74 20 79 65 74 20 65 78 69 73 74 2e 0a 20  not yet exist.. 
17bf0 20 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d   ** Do not attem
17c00 70 74 20 74 6f 20 77 72 69 74 65 20 69 66 20 64  pt to write if d
17c10 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
17c20 20 6e 65 76 65 72 20 62 65 65 6e 20 6f 70 65 6e   never been open
17c30 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
17c40 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
17c50 72 29 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20  r) ){.    pPg = 
17c60 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
17c70 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67  pPg = sqlite3Pag
17c80 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  erLookup(pPager,
17c90 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 61 73   pgno);.  }.  as
17ca0 73 65 72 74 28 20 70 50 67 20 7c 7c 20 21 4d 45  sert( pPg || !ME
17cb0 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MDB );.  assert(
17cc0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
17cd0 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70  =PAGER_OPEN || p
17ce0 50 67 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  Pg==0 || pPager-
17cf0 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 50  >tempFile );.  P
17d00 41 47 45 52 54 52 41 43 45 28 28 22 50 4c 41 59  AGERTRACE(("PLAY
17d10 42 41 43 4b 20 25 64 20 70 61 67 65 20 25 64 20  BACK %d page %d 
17d20 68 61 73 68 28 25 30 38 78 29 20 25 73 5c 6e 22  hash(%08x) %s\n"
17d30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 50 41 47  ,.           PAG
17d40 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
17d50 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68 61  no, pager_dataha
17d60 73 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53  sh(pPager->pageS
17d70 69 7a 65 2c 20 28 75 38 2a 29 61 44 61 74 61 29  ize, (u8*)aData)
17d80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 69 73  ,.           (is
17d90 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a  MainJrnl?"main-j
17da0 6f 75 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f 75  ournal":"sub-jou
17db0 72 6e 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20 69  rnal").  ));.  i
17dc0 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b  f( isMainJrnl ){
17dd0 0a 20 20 20 20 69 73 53 79 6e 63 65 64 20 3d 20  .    isSynced = 
17de0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c  pPager->noSync |
17df0 7c 20 28 2a 70 4f 66 66 73 65 74 20 3c 3d 20 70  | (*pOffset <= p
17e00 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
17e10 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
17e20 20 69 73 53 79 6e 63 65 64 20 3d 20 28 70 50 67   isSynced = (pPg
17e30 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e  ==0 || 0==(pPg->
17e40 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e 45  flags & PGHDR_NE
17e50 45 44 5f 53 59 4e 43 29 29 3b 0a 20 20 7d 0a 20  ED_SYNC));.  }. 
17e60 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
17e70 65 72 2d 3e 66 64 29 0a 20 20 20 26 26 20 28 70  er->fd).   && (p
17e80 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
17e90 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
17ea0 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  D || pPager->eSt
17eb0 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29  ate==PAGER_OPEN)
17ec0 0a 20 20 20 26 26 20 69 73 53 79 6e 63 65 64 0a  .   && isSynced.
17ed0 20 20 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 73    ){.    i64 ofs
17ee0 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36  t = (pgno-1)*(i6
17ef0 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
17f00 7a 65 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  ze;.    testcase
17f10 28 20 21 69 73 53 61 76 65 70 6e 74 20 26 26 20  ( !isSavepnt && 
17f20 70 50 67 21 3d 30 20 26 26 20 28 70 50 67 2d 3e  pPg!=0 && (pPg->
17f30 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
17f40 5f 53 59 4e 43 29 21 3d 30 20 29 3b 0a 20 20 20  _SYNC)!=0 );.   
17f50 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
17f60 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
17f70 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
17f80 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
17f90 3e 66 64 2c 20 28 75 38 20 2a 29 61 44 61 74 61  >fd, (u8 *)aData
17fa0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
17fb0 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20 69  ze, ofst);.    i
17fc0 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  f( pgno>pPager->
17fd0 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20  dbFileSize ){.  
17fe0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69      pPager->dbFi
17ff0 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20  leSize = pgno;. 
18000 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
18010 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a  ger->pBackup ){.
18020 20 20 20 20 20 20 43 4f 44 45 43 31 28 70 50 61        CODEC1(pPa
18030 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f  ger, aData, pgno
18040 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 3, rc=SQLITE_N
18050 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20 20 20 20  OMEM_BKPT);.    
18060 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55    sqlite3BackupU
18070 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42  pdate(pPager->pB
18080 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38  ackup, pgno, (u8
18090 2a 29 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20  *)aData);.      
180a0 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 61  CODEC2(pPager, a
180b0 44 61 74 61 2c 20 70 67 6e 6f 2c 20 37 2c 20 72  Data, pgno, 7, r
180c0 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  c=SQLITE_NOMEM_B
180d0 4b 50 54 2c 20 61 44 61 74 61 29 3b 0a 20 20 20  KPT, aData);.   
180e0 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21   }.  }else if( !
180f0 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50  isMainJrnl && pP
18100 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49  g==0 ){.    /* I
18110 66 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c 6c  f this is a roll
18120 62 61 63 6b 20 6f 66 20 61 20 73 61 76 65 70 6f  back of a savepo
18130 69 6e 74 20 61 6e 64 20 64 61 74 61 20 77 61 73  int and data was
18140 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 0a   not written to.
18150 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
18160 61 73 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  ase and the page
18170 20 69 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72   is not in-memor
18180 79 2c 20 74 68 65 72 65 20 69 73 20 61 20 70 6f  y, there is a po
18190 74 65 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70  tential.    ** p
181a0 72 6f 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65  roblem. When the
181b0 20 70 61 67 65 20 69 73 20 6e 65 78 74 20 66 65   page is next fe
181c0 74 63 68 65 64 20 62 79 20 74 68 65 20 62 2d 74  tched by the b-t
181d0 72 65 65 20 6c 61 79 65 72 2c 20 69 74 20 0a 20  ree layer, it . 
181e0 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65     ** will be re
181f0 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
18200 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68  base file, which
18210 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20   may or may not 
18220 62 65 20 0a 20 20 20 20 2a 2a 20 63 75 72 72 65  be .    ** curre
18230 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  nt. .    **.    
18240 2a 2a 20 54 68 65 72 65 20 61 72 65 20 61 20 63  ** There are a c
18250 6f 75 70 6c 65 20 6f 66 20 64 69 66 66 65 72 65  ouple of differe
18260 6e 74 20 77 61 79 73 20 74 68 69 73 20 63 61 6e  nt ways this can
18270 20 68 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65   happen. All are
18280 20 71 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62   quite.    ** ob
18290 73 63 75 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e  scure. When runn
182a0 69 6e 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f  ing in synchrono
182b0 75 73 20 6d 6f 64 65 2c 20 74 68 69 73 20 63 61  us mode, this ca
182c0 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20  n only happen . 
182d0 20 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67     ** if the pag
182e0 65 20 69 73 20 6f 6e 20 74 68 65 20 66 72 65 65  e is on the free
182f0 2d 6c 69 73 74 20 61 74 20 74 68 65 20 73 74 61  -list at the sta
18300 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  rt of the transa
18310 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20  ction, then.    
18320 2a 2a 20 70 6f 70 75 6c 61 74 65 64 2c 20 74 68  ** populated, th
18330 65 6e 20 6d 6f 76 65 64 20 75 73 69 6e 67 20 73  en moved using s
18340 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
18350 61 67 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  age()..    **.  
18360 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f    ** The solutio
18370 6e 20 69 73 20 74 6f 20 61 64 64 20 61 6e 20 69  n is to add an i
18380 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 74 6f  n-memory page to
18390 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61   the cache conta
183a0 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65  ining.    ** the
183b0 20 64 61 74 61 20 6a 75 73 74 20 72 65 61 64 20   data just read 
183c0 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
183d0 72 6e 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70  rnal. Mark the p
183e0 61 67 65 20 61 73 20 64 69 72 74 79 20 0a 20 20  age as dirty .  
183f0 20 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65 20    ** and if the 
18400 70 61 67 65 72 20 72 65 71 75 69 72 65 73 20 61  pager requires a
18410 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74   journal-sync, t
18420 68 65 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67  hen mark the pag
18430 65 20 61 73 20 0a 20 20 20 20 2a 2a 20 72 65 71  e as .    ** req
18440 75 69 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c  uiring a journal
18450 2d 73 79 6e 63 20 62 65 66 6f 72 65 20 69 74 20  -sync before it 
18460 69 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20  is written..    
18470 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  */.    assert( i
18480 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20  sSavepnt );.    
18490 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d  assert( (pPager-
184a0 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50  >doNotSpill & SP
184b0 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b  ILLFLAG_ROLLBACK
184c0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67  )==0 );.    pPag
184d0 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c  er->doNotSpill |
184e0 3d 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c  = SPILLFLAG_ROLL
184f0 42 41 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20 73  BACK;.    rc = s
18500 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
18510 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50  Pager, pgno, &pP
18520 67 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72  g, 1);.    asser
18530 74 28 20 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  t( (pPager->doNo
18540 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c  tSpill & SPILLFL
18550 41 47 5f 52 4f 4c 4c 42 41 43 4b 29 21 3d 30 20  AG_ROLLBACK)!=0 
18560 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
18570 6f 4e 6f 74 53 70 69 6c 6c 20 26 3d 20 7e 53 50  oNotSpill &= ~SP
18580 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b  ILLFLAG_ROLLBACK
18590 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
185a0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
185b0 20 72 63 3b 0a 20 20 20 20 70 50 67 2d 3e 66 6c   rc;.    pPg->fl
185c0 61 67 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45  ags &= ~PGHDR_NE
185d0 45 44 5f 52 45 41 44 3b 0a 20 20 20 20 73 71 6c  ED_READ;.    sql
185e0 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69  ite3PcacheMakeDi
185f0 72 74 79 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  rty(pPg);.  }.  
18600 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f  if( pPg ){.    /
18610 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64  * No page should
18620 20 65 76 65 72 20 62 65 20 65 78 70 6c 69 63 69   ever be explici
18630 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  tly rolled back 
18640 74 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20  that is in use, 
18650 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f  except.    ** fo
18660 72 20 70 61 67 65 20 31 20 77 68 69 63 68 20 69  r page 1 which i
18670 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e  s held in use in
18680 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74   order to keep t
18690 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  he lock on the. 
186a0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61     ** database a
186b0 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73  ctive. However s
186c0 75 63 68 20 61 20 70 61 67 65 20 6d 61 79 20 62  uch a page may b
186d0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73  e rolled back as
186e0 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a   a result.    **
186f0 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   of an internal 
18700 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20  error resulting 
18710 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  in an automatic 
18720 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73  call to.    ** s
18730 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
18740 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  ack()..    */.  
18750 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20    void *pData;. 
18760 20 20 20 70 44 61 74 61 20 3d 20 70 50 67 2d 3e     pData = pPg->
18770 70 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70  pData;.    memcp
18780 79 28 70 44 61 74 61 2c 20 28 75 38 2a 29 61 44  y(pData, (u8*)aD
18790 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
187a0 65 53 69 7a 65 29 3b 0a 20 20 20 20 70 50 61 67  eSize);.    pPag
187b0 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50  er->xReiniter(pP
187c0 67 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4d 61  g);.    if( isMa
187d0 69 6e 4a 72 6e 6c 20 26 26 20 28 21 69 73 53 61  inJrnl && (!isSa
187e0 76 65 70 6e 74 20 7c 7c 20 2a 70 4f 66 66 73 65  vepnt || *pOffse
187f0 74 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t<=pPager->journ
18800 61 6c 48 64 72 29 20 29 7b 0a 20 20 20 20 20 20  alHdr) ){.      
18810 2f 2a 20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e  /* If the conten
18820 74 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 20  ts of this page 
18830 77 65 72 65 20 6a 75 73 74 20 72 65 73 74 6f 72  were just restor
18840 65 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ed from the main
18850 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e   .      ** journ
18860 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  al file, then it
18870 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 62  s content must b
18880 65 20 61 73 20 74 68 65 79 20 77 65 72 65 20 77  e as they were w
18890 68 65 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a  hen the .      *
188a0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  * transaction wa
188b0 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 20  s first opened. 
188c0 49 6e 20 74 68 69 73 20 63 61 73 65 20 77 65 20  In this case we 
188d0 63 61 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67  can mark the pag
188e0 65 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 63 6c  e.      ** as cl
188f0 65 61 6e 2c 20 73 69 6e 63 65 20 74 68 65 72 65  ean, since there
18900 20 77 69 6c 6c 20 62 65 20 6e 6f 20 6e 65 65 64   will be no need
18910 20 74 6f 20 77 72 69 74 65 20 69 74 20 6f 75 74   to write it out
18920 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   to the.      **
18930 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20   database..     
18940 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65   **.      ** The
18950 72 65 20 69 73 20 6f 6e 65 20 65 78 63 65 70 74  re is one except
18960 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 75 6c 65  ion to this rule
18970 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73  . If the page is
18980 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 0a 20 20   being rolled.  
18990 20 20 20 20 2a 2a 20 62 61 63 6b 20 61 73 20 70      ** back as p
189a0 61 72 74 20 6f 66 20 61 20 73 61 76 65 70 6f 69  art of a savepoi
189b0 6e 74 20 28 6f 72 20 73 74 61 74 65 6d 65 6e 74  nt (or statement
189c0 29 20 72 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20  ) rollback from 
189d0 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73  an .      ** uns
189e0 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66  ynced portion of
189f0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
18a00 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20  l file, then it 
18a10 69 73 20 6e 6f 74 20 73 61 66 65 0a 20 20 20 20  is not safe.    
18a20 20 20 2a 2a 20 74 6f 20 6d 61 72 6b 20 74 68 65    ** to mark the
18a30 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20   page as clean. 
18a40 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
18a50 6d 61 72 6b 69 6e 67 20 74 68 65 20 70 61 67 65  marking the page
18a60 20 61 73 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65   as.      ** cle
18a70 61 6e 20 77 69 6c 6c 20 63 6c 65 61 72 20 74 68  an will clear th
18a80 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
18a90 43 20 66 6c 61 67 2e 20 53 69 6e 63 65 20 74 68  C flag. Since th
18aa0 65 20 70 61 67 65 20 69 73 0a 20 20 20 20 20 20  e page is.      
18ab0 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  ** already in th
18ac0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
18ad0 72 65 63 6f 72 64 65 64 20 69 6e 20 50 61 67 65  recorded in Page
18ae0 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e  r.pInJournal) an
18af0 64 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50  d.      ** the P
18b00 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
18b10 6c 61 67 20 69 73 20 63 6c 65 61 72 65 64 2c 20  lag is cleared, 
18b20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 77  if the page is w
18b30 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 20 20  ritten to.      
18b40 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20  ** again within 
18b50 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
18b60 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 6d 61 72  , it will be mar
18b70 6b 65 64 20 61 73 20 64 69 72 74 79 20 62 75 74  ked as dirty but
18b80 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47  .      ** the PG
18b90 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
18ba0 61 67 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73  ag will not be s
18bb0 65 74 2e 20 49 74 20 63 6f 75 6c 64 20 74 68 65  et. It could the
18bc0 6e 20 70 6f 74 65 6e 74 69 61 6c 6c 79 0a 20 20  n potentially.  
18bd0 20 20 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65      ** be writte
18be0 6e 20 6f 75 74 20 69 6e 74 6f 20 74 68 65 20 64  n out into the d
18bf0 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 66  atabase file bef
18c00 6f 72 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20  ore its journal 
18c10 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73 65  file.      ** se
18c20 67 6d 65 6e 74 20 69 73 20 73 79 6e 63 65 64 2e  gment is synced.
18c30 20 49 66 20 61 20 63 72 61 73 68 20 6f 63 63 75   If a crash occu
18c40 72 73 20 64 75 72 69 6e 67 20 6f 72 20 66 6f 6c  rs during or fol
18c50 6c 6f 77 69 6e 67 20 74 68 69 73 2c 0a 20 20 20  lowing this,.   
18c60 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 63     ** database c
18c70 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 65 6e  orruption may en
18c80 73 75 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  sue..      **.  
18c90 20 20 20 20 2a 2a 20 55 70 64 61 74 65 3a 20 41      ** Update: A
18ca0 6e 6f 74 68 65 72 20 65 78 63 65 70 74 69 6f 6e  nother exception
18cb0 20 69 73 20 66 6f 72 20 74 65 6d 70 20 66 69 6c   is for temp fil
18cc0 65 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  es that are not 
18cd0 0a 20 20 20 20 20 20 2a 2a 20 69 6e 2d 6d 65 6d  .      ** in-mem
18ce0 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e 20 49  ory databases. I
18cf0 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
18d00 70 61 67 65 20 6d 61 79 20 68 61 76 65 20 62 65  page may have be
18d10 65 6e 20 64 69 72 74 79 0a 20 20 20 20 20 20 2a  en dirty.      *
18d20 2a 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  * at the start o
18d30 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
18d40 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
18d50 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
18d60 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
18d70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  ;.      if( pPag
18d80 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20  er->tempFile==0 
18d90 29 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d  ) sqlite3PcacheM
18da0 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20  akeClean(pPg);. 
18db0 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73     }.    pager_s
18dc0 65 74 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  et_pagehash(pPg)
18dd0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ;..    /* If thi
18de0 73 20 77 61 73 20 70 61 67 65 20 31 2c 20 74 68  s was page 1, th
18df0 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20 76  en restore the v
18e00 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62  alue of Pager.db
18e10 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a  FileVers..    **
18e20 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20   Do this before 
18e30 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f  any decoding. */
18e40 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31  .    if( pgno==1
18e50 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
18e60 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
18e70 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44 61  Vers, &((u8*)pDa
18e80 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70  ta)[24],sizeof(p
18e90 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
18ea0 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  s));.    }..    
18eb0 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70 61  /* Decode the pa
18ec0 67 65 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f  ge just read fro
18ed0 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43 4f  m disk */.    CO
18ee0 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 44 61  DEC1(pPager, pDa
18ef0 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33  ta, pPg->pgno, 3
18f00 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  , rc=SQLITE_NOME
18f10 4d 5f 42 4b 50 54 29 3b 0a 20 20 20 20 73 71 6c  M_BKPT);.    sql
18f20 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61 73  ite3PcacheReleas
18f30 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65  e(pPg);.  }.  re
18f40 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
18f50 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61 73  * Parameter zMas
18f60 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ter is the name 
18f70 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
18f80 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e 67  nal file. A sing
18f90 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  le journal.** fi
18fa0 6c 65 20 74 68 61 74 20 72 65 66 65 72 72 65 64  le that referred
18fb0 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a   to the master j
18fc0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20  ournal file has 
18fd0 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64  just been rolled
18fe0 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72   back..** This r
18ff0 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
19000 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
19010 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  to delete the ma
19020 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
19030 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73  e,.** and does s
19040 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a  o if it is..**.*
19050 2a 20 41 72 67 75 6d 65 6e 74 20 7a 4d 61 73 74  * Argument zMast
19060 65 72 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20  er may point to 
19070 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 2e  Pager.pTmpSpace.
19080 20 53 6f 20 74 68 61 74 20 62 75 66 66 65 72 20   So that buffer 
19090 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 76 61 69 6c  is not .** avail
190a0 61 62 6c 65 20 66 6f 72 20 75 73 65 20 77 69 74  able for use wit
190b0 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hin this functio
190c0 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20  n..**.** When a 
190d0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
190e0 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c 20  ile is created, 
190f0 69 74 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  it is populated 
19100 77 69 74 68 20 74 68 65 20 6e 61 6d 65 73 20 0a  with the names .
19110 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 69 74 73  ** of all of its
19120 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c   child journals,
19130 20 6f 6e 65 20 61 66 74 65 72 20 61 6e 6f 74 68   one after anoth
19140 65 72 2c 20 66 6f 72 6d 61 74 74 65 64 20 61 73  er, formatted as
19150 20 75 74 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64   utf-8 .** encod
19160 65 64 20 74 65 78 74 2e 20 54 68 65 20 65 6e 64  ed text. The end
19170 20 6f 66 20 65 61 63 68 20 63 68 69 6c 64 20 6a   of each child j
19180 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6d  ournal file is m
19190 61 72 6b 65 64 20 77 69 74 68 20 61 20 0a 2a 2a  arked with a .**
191a0 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20   nul-terminator 
191b0 62 79 74 65 20 28 30 78 30 30 29 2e 20 69 2e 65  byte (0x00). i.e
191c0 2e 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e  . the entire con
191d0 74 65 6e 74 73 20 6f 66 20 61 20 6d 61 73 74 65  tents of a maste
191e0 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  r journal.** fil
191f0 65 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74  e for a transact
19200 69 6f 6e 20 69 6e 76 6f 6c 76 69 6e 67 20 74 77  ion involving tw
19210 6f 20 64 61 74 61 62 61 73 65 73 20 6d 69 67 68  o databases migh
19220 74 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f  t be:.**.**   "/
19230 68 6f 6d 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a  home/bill/a.db-j
19240 6f 75 72 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f  ournal\x00/home/
19250 62 69 6c 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61  bill/b.db-journa
19260 6c 5c 78 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d  l\x00".**.** A m
19270 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
19280 6c 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 64  le may only be d
19290 65 6c 65 74 65 64 20 6f 6e 63 65 20 61 6c 6c 20  eleted once all 
192a0 6f 66 20 69 74 73 20 63 68 69 6c 64 20 0a 2a 2a  of its child .**
192b0 20 6a 6f 75 72 6e 61 6c 73 20 68 61 76 65 20 62   journals have b
192c0 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  een rolled back.
192d0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
192e0 74 69 6f 6e 20 72 65 61 64 73 20 74 68 65 20 63  tion reads the c
192f0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d  ontents of the m
19300 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69  aster-journal fi
19310 6c 65 20 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f  le into .** memo
19320 72 79 20 61 6e 64 20 6c 6f 6f 70 73 20 74 68 72  ry and loops thr
19330 6f 75 67 68 20 65 61 63 68 20 6f 66 20 74 68 65  ough each of the
19340 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e   child journal n
19350 61 6d 65 73 2e 20 46 6f 72 0a 2a 2a 20 65 61 63  ames. For.** eac
19360 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c  h child journal,
19370 20 69 74 20 63 68 65 63 6b 73 20 69 66 3a 0a 2a   it checks if:.*
19380 2a 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20  *.**   * if the 
19390 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 65 78  child journal ex
193a0 69 73 74 73 2c 20 61 6e 64 20 69 66 20 73 6f 0a  ists, and if so.
193b0 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63 68  **   * if the ch
193c0 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74  ild journal cont
193d0 61 69 6e 73 20 61 20 72 65 66 65 72 65 6e 63 65  ains a reference
193e0 20 74 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   to master journ
193f0 61 6c 20 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20  al .**     file 
19400 7a 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66  zMaster.**.** If
19410 20 61 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c   a child journal
19420 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 74 68   can be found th
19430 61 74 20 6d 61 74 63 68 65 73 20 62 6f 74 68 20  at matches both 
19440 6f 66 20 74 68 65 20 63 72 69 74 65 72 69 61 0a  of the criteria.
19450 2a 2a 20 61 62 6f 76 65 2c 20 74 68 69 73 20 66  ** above, this f
19460 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
19470 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e  without doing an
19480 79 74 68 69 6e 67 2e 20 4f 74 68 65 72 77 69 73  ything. Otherwis
19490 65 2c 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68  e, if.** no such
194a0 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63   child journal c
194b0 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 66 69 6c  an be found, fil
194c0 65 20 7a 4d 61 73 74 65 72 20 69 73 20 64 65 6c  e zMaster is del
194d0 65 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65  eted from.** the
194e0 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 75 73 69   file-system usi
194f0 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65  ng sqlite3OsDele
19500 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  te()..**.** If a
19510 6e 20 49 4f 20 65 72 72 6f 72 20 77 69 74 68 69  n IO error withi
19520 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  n this function,
19530 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
19540 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73  s returned. This
19550 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c  .** function all
19560 6f 63 61 74 65 73 20 6d 65 6d 6f 72 79 20 62 79  ocates memory by
19570 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   calling sqlite3
19580 4d 61 6c 6c 6f 63 28 29 2e 20 49 66 20 61 6e 20  Malloc(). If an 
19590 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66 61  allocation.** fa
195a0 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ils, SQLITE_NOME
195b0 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  M is returned. O
195c0 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e 6f 20  therwise, if no 
195d0 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72  IO or malloc err
195e0 6f 72 73 20 0a 2a 2a 20 6f 63 63 75 72 2c 20 53  ors .** occur, S
195f0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
19600 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f  rned..**.** TODO
19610 3a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  : This function 
19620 61 6c 6c 6f 63 61 74 65 73 20 61 20 73 69 6e 67  allocates a sing
19630 6c 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f  le block of memo
19640 72 79 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68  ry to load.** th
19650 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  e entire content
19660 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  s of the master 
19670 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
19680 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 61  is could be.** a
19690 20 63 6f 75 70 6c 65 20 6f 66 20 6b 69 6c 6f 62   couple of kilob
196a0 79 74 65 73 20 6f 72 20 73 6f 20 2d 20 70 6f 74  ytes or so - pot
196b0 65 6e 74 69 61 6c 6c 79 20 6c 61 72 67 65 72 20  entially larger 
196c0 74 68 61 6e 20 74 68 65 20 70 61 67 65 20 0a 2a  than the page .*
196d0 2a 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  * size..*/.stati
196e0 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d  c int pager_delm
196f0 61 73 74 65 72 28 50 61 67 65 72 20 2a 70 50 61  aster(Pager *pPa
19700 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ger, const char 
19710 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73 71 6c  *zMaster){.  sql
19720 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
19730 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
19740 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
19750 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
19760 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73  turn code */.  s
19770 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61  qlite3_file *pMa
19780 73 74 65 72 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c  ster;    /* Mall
19790 6f 63 27 64 20 6d 61 73 74 65 72 2d 6a 6f 75 72  oc'd master-jour
197a0 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
197b0 74 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  tor */.  sqlite3
197c0 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b  _file *pJournal;
197d0 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 63     /* Malloc'd c
197e0 68 69 6c 64 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  hild-journal fil
197f0 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
19800 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a    char *zMasterJ
19810 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43  ournal = 0; /* C
19820 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73 74 65  ontents of maste
19830 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  r journal file *
19840 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74 65 72 4a  /.  i64 nMasterJ
19850 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a  ournal;       /*
19860 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65 72 20   Size of master 
19870 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
19880 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
19890 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ;           /* P
198a0 6f 69 6e 74 65 72 20 74 6f 20 6f 6e 65 20 6a 6f  ointer to one jo
198b0 75 72 6e 61 6c 20 77 69 74 68 69 6e 20 4d 4a 20  urnal within MJ 
198c0 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
198d0 7a 4d 61 73 74 65 72 50 74 72 3b 20 20 20 20 20  zMasterPtr;     
198e0 20 20 20 20 2f 2a 20 53 70 61 63 65 20 74 6f 20      /* Space to 
198f0 68 6f 6c 64 20 4d 4a 20 66 69 6c 65 6e 61 6d 65  hold MJ filename
19900 20 66 72 6f 6d 20 61 20 6a 6f 75 72 6e 61 6c 20   from a journal 
19910 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  file */.  int nM
19920 61 73 74 65 72 50 74 72 3b 20 20 20 20 20 20 20  asterPtr;       
19930 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66      /* Amount of
19940 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
19950 20 74 6f 20 7a 4d 61 73 74 65 72 50 74 72 5b 5d   to zMasterPtr[]
19960 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   */..  /* Alloca
19970 74 65 20 73 70 61 63 65 20 66 6f 72 20 62 6f 74  te space for bot
19980 68 20 74 68 65 20 70 4a 6f 75 72 6e 61 6c 20 61  h the pJournal a
19990 6e 64 20 70 4d 61 73 74 65 72 20 66 69 6c 65 20  nd pMaster file 
199a0 64 65 73 63 72 69 70 74 6f 72 73 2e 0a 20 20 2a  descriptors..  *
199b0 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
199c0 20 6f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72   open the master
199d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
199e0 72 20 72 65 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a  r reading..  */.
199f0 20 20 70 4d 61 73 74 65 72 20 3d 20 28 73 71 6c    pMaster = (sql
19a00 69 74 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69  ite3_file *)sqli
19a10 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 56  te3MallocZero(pV
19a20 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32  fs->szOsFile * 2
19a30 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20  );.  pJournal = 
19a40 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
19a50 28 28 28 75 38 20 2a 29 70 4d 61 73 74 65 72 29  (((u8 *)pMaster)
19a60 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c   + pVfs->szOsFil
19a70 65 29 3b 0a 20 20 69 66 28 20 21 70 4d 61 73 74  e);.  if( !pMast
19a80 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  er ){.    rc = S
19a90 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
19aa0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
19ab0 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d  onst int flags =
19ac0 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45   (SQLITE_OPEN_RE
19ad0 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50  ADONLY|SQLITE_OP
19ae0 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
19af0 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  L);.    rc = sql
19b00 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
19b10 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73 74 65   zMaster, pMaste
19b20 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20  r, flags, 0);.  
19b30 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
19b40 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
19b50 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 2f  master_out;..  /
19b60 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72  * Load the entir
19b70 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
19b80 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65   file into space
19b90 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20   obtained from. 
19ba0 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c   ** sqlite3_mall
19bb0 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64  oc() and pointed
19bc0 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f   to by zMasterJo
19bd0 75 72 6e 61 6c 2e 20 20 20 41 6c 73 6f 20 6f 62  urnal.   Also ob
19be0 74 61 69 6e 0a 20 20 2a 2a 20 73 75 66 66 69 63  tain.  ** suffic
19bf0 69 65 6e 74 20 73 70 61 63 65 20 28 69 6e 20 7a  ient space (in z
19c00 4d 61 73 74 65 72 50 74 72 29 20 74 6f 20 68 6f  MasterPtr) to ho
19c10 6c 64 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  ld the names of 
19c20 6d 61 73 74 65 72 0a 20 20 2a 2a 20 6a 6f 75 72  master.  ** jour
19c30 6e 61 6c 20 66 69 6c 65 73 20 65 78 74 72 61 63  nal files extrac
19c40 74 65 64 20 66 72 6f 6d 20 72 65 67 75 6c 61 72  ted from regular
19c50 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61   rollback-journa
19c60 6c 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ls..  */.  rc = 
19c70 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
19c80 65 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73  e(pMaster, &nMas
19c90 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69  terJournal);.  i
19ca0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
19cb0 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
19cc0 72 5f 6f 75 74 3b 0a 20 20 6e 4d 61 73 74 65 72  r_out;.  nMaster
19cd0 50 74 72 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61  Ptr = pVfs->mxPa
19ce0 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 7a 4d 61 73  thname+1;.  zMas
19cf0 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c  terJournal = sql
19d00 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74  ite3Malloc(nMast
19d10 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73  erJournal + nMas
19d20 74 65 72 50 74 72 20 2b 20 31 29 3b 0a 20 20 69  terPtr + 1);.  i
19d30 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  f( !zMasterJourn
19d40 61 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  al ){.    rc = S
19d50 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
19d60 3b 0a 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61  ;.    goto delma
19d70 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  ster_out;.  }.  
19d80 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 26 7a 4d  zMasterPtr = &zM
19d90 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61  asterJournal[nMa
19da0 73 74 65 72 4a 6f 75 72 6e 61 6c 2b 31 5d 3b 0a  sterJournal+1];.
19db0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
19dc0 52 65 61 64 28 70 4d 61 73 74 65 72 2c 20 7a 4d  Read(pMaster, zM
19dd0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 28 69  asterJournal, (i
19de0 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  nt)nMasterJourna
19df0 6c 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  l, 0);.  if( rc!
19e00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
19e10 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
19e20 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  .  zMasterJourna
19e30 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  l[nMasterJournal
19e40 5d 20 3d 20 30 3b 0a 0a 20 20 7a 4a 6f 75 72 6e  ] = 0;..  zJourn
19e50 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72  al = zMasterJour
19e60 6e 61 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28 7a  nal;.  while( (z
19e70 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a  Journal-zMasterJ
19e80 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a  ournal)<nMasterJ
19e90 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 69 6e  ournal ){.    in
19ea0 74 20 65 78 69 73 74 73 3b 0a 20 20 20 20 72 63  t exists;.    rc
19eb0 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
19ec0 73 73 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61  ss(pVfs, zJourna
19ed0 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  l, SQLITE_ACCESS
19ee0 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73 74 73  _EXISTS, &exists
19ef0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
19f00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19f10 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
19f20 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
19f30 69 66 28 20 65 78 69 73 74 73 20 29 7b 0a 20 20  if( exists ){.  
19f40 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
19f50 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74  e journals point
19f60 65 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73  ed to by the mas
19f70 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  ter journal exis
19f80 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20 4f 70 65  ts..      ** Ope
19f90 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b 20 69  n it and check i
19fa0 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 74  f it points at t
19fb0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
19fc0 6c 2e 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 73  l. If.      ** s
19fd0 6f 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75  o, return withou
19fe0 74 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6d  t deleting the m
19ff0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1a000 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  le..      */.   
1a010 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20     int c;.      
1a020 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c  int flags = (SQL
1a030 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
1a040 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  Y|SQLITE_OPEN_MA
1a050 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20  IN_JOURNAL);.   
1a060 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1a070 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4a 6f 75  sOpen(pVfs, zJou
1a080 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20  rnal, pJournal, 
1a090 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20  flags, 0);.     
1a0a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1a0b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
1a0c0 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
1a0d0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1a0e0 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72   rc = readMaster
1a0f0 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c  Journal(pJournal
1a100 2c 20 7a 4d 61 73 74 65 72 50 74 72 2c 20 6e 4d  , zMasterPtr, nM
1a110 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20  asterPtr);.     
1a120 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
1a130 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20  pJournal);.     
1a140 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1a150 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
1a160 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
1a170 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1a180 20 63 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b   c = zMasterPtr[
1a190 30 5d 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28  0]!=0 && strcmp(
1a1a0 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73  zMasterPtr, zMas
1a1b0 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 69  ter)==0;.      i
1a1c0 66 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20  f( c ){.        
1a1d0 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61 74  /* We have a mat
1a1e0 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74  ch. Do not delet
1a1f0 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
1a200 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  rnal file. */.  
1a210 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
1a220 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
1a230 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4a 6f 75  }.    }.    zJou
1a240 72 6e 61 6c 20 2b 3d 20 28 73 71 6c 69 74 65 33  rnal += (sqlite3
1a250 53 74 72 6c 65 6e 33 30 28 7a 4a 6f 75 72 6e 61  Strlen30(zJourna
1a260 6c 29 2b 31 29 3b 0a 20 20 7d 0a 20 0a 20 20 73  l)+1);.  }. .  s
1a270 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d  qlite3OsClose(pM
1a280 61 73 74 65 72 29 3b 0a 20 20 72 63 20 3d 20 73  aster);.  rc = s
1a290 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
1a2a0 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29  Vfs, zMaster, 0)
1a2b0 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  ;..delmaster_out
1a2c0 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  :.  sqlite3_free
1a2d0 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  (zMasterJournal)
1a2e0 3b 0a 20 20 69 66 28 20 70 4d 61 73 74 65 72 20  ;.  if( pMaster 
1a2f0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
1a300 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a  Close(pMaster);.
1a310 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73 4f      assert( !isO
1a320 70 65 6e 28 70 4a 6f 75 72 6e 61 6c 29 20 29 3b  pen(pJournal) );
1a330 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
1a340 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a  e(pMaster);.  }.
1a350 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1a360 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1a370 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
1a380 63 68 61 6e 67 65 20 74 68 65 20 61 63 74 75 61  change the actua
1a390 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  l size of the da
1a3a0 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20  tabase .** file 
1a3b0 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  in the file-syst
1a3c0 65 6d 2e 20 54 68 69 73 20 6f 6e 6c 79 20 68 61  em. This only ha
1a3d0 70 70 65 6e 73 20 77 68 65 6e 20 63 6f 6d 6d 69  ppens when commi
1a3e0 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74  tting a transact
1a3f0 69 6f 6e 2c 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69  ion,.** or rolli
1a400 6e 67 20 62 61 63 6b 20 61 20 74 72 61 6e 73 61  ng back a transa
1a410 63 74 69 6f 6e 20 28 69 6e 63 6c 75 64 69 6e 67  ction (including
1a420 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
1a430 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a  hot-journal)..**
1a440 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 69 6e 20  .** If the main 
1a450 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
1a460 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 74 68   not open, or th
1a470 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69  e pager is not i
1a480 6e 20 65 69 74 68 65 72 0a 2a 2a 20 44 42 4d 4f  n either.** DBMO
1a490 44 20 6f 72 20 4f 50 45 4e 20 73 74 61 74 65 2c  D or OPEN state,
1a4a0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1a4b0 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72  s a no-op. Other
1a4c0 77 69 73 65 2c 20 74 68 65 20 73 69 7a 65 20 0a  wise, the size .
1a4d0 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ** of the file i
1a4e0 73 20 63 68 61 6e 67 65 64 20 74 6f 20 6e 50 61  s changed to nPa
1a4f0 67 65 20 70 61 67 65 73 20 28 6e 50 61 67 65 2a  ge pages (nPage*
1a500 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1a510 20 62 79 74 65 73 29 2e 20 0a 2a 2a 20 49 66 20   bytes). .** If 
1a520 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
1a530 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6c 61   is currently la
1a540 72 67 65 72 20 74 68 61 6e 20 6e 50 61 67 65 20  rger than nPage 
1a550 70 61 67 65 73 2c 20 74 68 65 6e 20 75 73 65 20  pages, then use 
1a560 74 68 65 20 56 46 53 0a 2a 2a 20 78 54 72 75 6e  the VFS.** xTrun
1a570 63 61 74 65 28 29 20 6d 65 74 68 6f 64 20 74 6f  cate() method to
1a580 20 74 72 75 6e 63 61 74 65 20 69 74 2e 0a 2a 2a   truncate it..**
1a590 0a 2a 2a 20 4f 72 2c 20 69 74 20 6d 69 67 68 74  .** Or, it might
1a5a0 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61   be the case tha
1a5b0 74 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69  t the file on di
1a5c0 73 6b 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  sk is smaller th
1a5d0 61 6e 20 0a 2a 2a 20 6e 50 61 67 65 20 70 61 67  an .** nPage pag
1a5e0 65 73 2e 20 53 6f 6d 65 20 6f 70 65 72 61 74 69  es. Some operati
1a5f0 6e 67 20 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d  ng system implem
1a600 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20 67 65  entations can ge
1a610 74 20 63 6f 6e 66 75 73 65 64 20 69 66 20 0a 2a  t confused if .*
1a620 2a 20 79 6f 75 20 74 72 79 20 74 6f 20 74 72 75  * you try to tru
1a630 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74 6f 20  ncate a file to 
1a640 73 6f 6d 65 20 73 69 7a 65 20 74 68 61 74 20 69  some size that i
1a650 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 74  s larger than it
1a660 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 69   .** currently i
1a670 73 2c 20 73 6f 20 64 65 74 65 63 74 20 74 68 69  s, so detect thi
1a680 73 20 63 61 73 65 20 61 6e 64 20 77 72 69 74 65  s case and write
1a690 20 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62   a single zero b
1a6a0 79 74 65 20 74 6f 20 0a 2a 2a 20 74 68 65 20 65  yte to .** the e
1a6b0 6e 64 20 6f 66 20 74 68 65 20 6e 65 77 20 66 69  nd of the new fi
1a6c0 6c 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  le instead..**.*
1a6d0 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
1a6e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1a6f0 4b 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  K. If an IO erro
1a700 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6d  r occurs while m
1a710 6f 64 69 66 79 69 6e 67 0a 2a 2a 20 74 68 65 20  odifying.** the 
1a720 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 72  database file, r
1a730 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20  eturn the error 
1a740 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c  code to the call
1a750 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
1a760 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  t pager_truncate
1a770 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
1a780 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69  Pgno nPage){.  i
1a790 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1a7a0 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  K;.  assert( pPa
1a7b0 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
1a7c0 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73  ER_ERROR );.  as
1a7d0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
1a7e0 74 61 74 65 21 3d 50 41 47 45 52 5f 52 45 41 44  tate!=PAGER_READ
1a7f0 45 52 20 29 3b 0a 20 20 0a 20 20 69 66 28 20 69  ER );.  .  if( i
1a800 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
1a810 29 20 0a 20 20 20 26 26 20 28 70 50 61 67 65 72  ) .   && (pPager
1a820 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
1a830 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20  WRITER_DBMOD || 
1a840 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
1a850 50 41 47 45 52 5f 4f 50 45 4e 29 20 0a 20 20 29  PAGER_OPEN) .  )
1a860 7b 0a 20 20 20 20 69 36 34 20 63 75 72 72 65 6e  {.    i64 curren
1a870 74 53 69 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a  tSize, newSize;.
1a880 20 20 20 20 69 6e 74 20 73 7a 50 61 67 65 20 3d      int szPage =
1a890 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1a8a0 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e;.    assert( p
1a8b0 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58  Pager->eLock==EX
1a8c0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
1a8d0 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20      /* TODO: Is 
1a8e0 69 74 20 73 61 66 65 20 74 6f 20 75 73 65 20 50  it safe to use P
1a8f0 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 20  ager.dbFileSize 
1a900 68 65 72 65 3f 20 2a 2f 0a 20 20 20 20 72 63 20  here? */.    rc 
1a910 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
1a920 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ize(pPager->fd, 
1a930 26 63 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20  &currentSize);. 
1a940 20 20 20 6e 65 77 53 69 7a 65 20 3d 20 73 7a 50     newSize = szP
1a950 61 67 65 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a  age*(i64)nPage;.
1a960 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1a970 54 45 5f 4f 4b 20 26 26 20 63 75 72 72 65 6e 74  TE_OK && current
1a980 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65 20 29 7b  Size!=newSize ){
1a990 0a 20 20 20 20 20 20 69 66 28 20 63 75 72 72 65  .      if( curre
1a9a0 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29  ntSize>newSize )
1a9b0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
1a9c0 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
1a9d0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77  (pPager->fd, new
1a9e0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Size);.      }el
1a9f0 73 65 20 69 66 28 20 28 63 75 72 72 65 6e 74 53  se if( (currentS
1aa00 69 7a 65 2b 73 7a 50 61 67 65 29 3c 3d 6e 65 77  ize+szPage)<=new
1aa10 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
1aa20 63 68 61 72 20 2a 70 54 6d 70 20 3d 20 70 50 61  char *pTmp = pPa
1aa30 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
1aa40 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70          memset(p
1aa50 54 6d 70 2c 20 30 2c 20 73 7a 50 61 67 65 29 3b  Tmp, 0, szPage);
1aa60 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1aa70 65 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61  e( (newSize-szPa
1aa80 67 65 29 20 3d 3d 20 63 75 72 72 65 6e 74 53 69  ge) == currentSi
1aa90 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  ze );.        te
1aaa0 73 74 63 61 73 65 28 20 28 6e 65 77 53 69 7a 65  stcase( (newSize
1aab0 2d 73 7a 50 61 67 65 29 20 3e 20 20 63 75 72 72  -szPage) >  curr
1aac0 65 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  entSize );.     
1aad0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1aae0 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66  sWrite(pPager->f
1aaf0 64 2c 20 70 54 6d 70 2c 20 73 7a 50 61 67 65 2c  d, pTmp, szPage,
1ab00 20 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29   newSize-szPage)
1ab10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1ab20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1ab30 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  K ){.        pPa
1ab40 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
1ab50 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 7d  = nPage;.      }
1ab60 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1ab70 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1ab80 20 52 65 74 75 72 6e 20 61 20 73 61 6e 69 74 69   Return a saniti
1ab90 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  zed version of t
1aba0 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 6f  he sector-size o
1abb0 66 20 4f 53 20 66 69 6c 65 20 70 46 69 6c 65 2e  f OS file pFile.
1abc0 20 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76   The.** return v
1abd0 61 6c 75 65 20 69 73 20 67 75 61 72 61 6e 74 65  alue is guarante
1abe0 65 64 20 74 6f 20 6c 69 65 20 62 65 74 77 65 65  ed to lie betwee
1abf0 6e 20 33 32 20 61 6e 64 20 4d 41 58 5f 53 45 43  n 32 and MAX_SEC
1ac00 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2f 0a 69 6e 74  TOR_SIZE..*/.int
1ac10 20 73 71 6c 69 74 65 33 53 65 63 74 6f 72 53 69   sqlite3SectorSi
1ac20 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ze(sqlite3_file 
1ac30 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 69  *pFile){.  int i
1ac40 52 65 74 20 3d 20 73 71 6c 69 74 65 33 4f 73 53  Ret = sqlite3OsS
1ac50 65 63 74 6f 72 53 69 7a 65 28 70 46 69 6c 65 29  ectorSize(pFile)
1ac60 3b 0a 20 20 69 66 28 20 69 52 65 74 3c 33 32 20  ;.  if( iRet<32 
1ac70 29 7b 0a 20 20 20 20 69 52 65 74 20 3d 20 35 31  ){.    iRet = 51
1ac80 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69  2;.  }else if( i
1ac90 52 65 74 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53  Ret>MAX_SECTOR_S
1aca0 49 5a 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72  IZE ){.    asser
1acb0 74 28 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  t( MAX_SECTOR_SI
1acc0 5a 45 3e 3d 35 31 32 20 29 3b 0a 20 20 20 20 69  ZE>=512 );.    i
1acd0 52 65 74 20 3d 20 4d 41 58 5f 53 45 43 54 4f 52  Ret = MAX_SECTOR
1ace0 5f 53 49 5a 45 3b 0a 20 20 7d 0a 20 20 72 65 74  _SIZE;.  }.  ret
1acf0 75 72 6e 20 69 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn iRet;.}../*.
1ad00 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65  ** Set the value
1ad10 20 6f 66 20 74 68 65 20 50 61 67 65 72 2e 73 65   of the Pager.se
1ad20 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c  ctorSize variabl
1ad30 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a  e for the given.
1ad40 2a 2a 20 70 61 67 65 72 20 62 61 73 65 64 20 6f  ** pager based o
1ad50 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  n the value retu
1ad60 72 6e 65 64 20 62 79 20 74 68 65 20 78 53 65 63  rned by the xSec
1ad70 74 6f 72 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a  torSize method.*
1ad80 2a 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 64 61  * of the open da
1ad90 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
1ada0 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c   sector size wil
1adb0 6c 20 62 65 20 75 73 65 64 20 0a 2a 2a 20 74 6f  l be used .** to
1adc0 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73   determine the s
1add0 69 7a 65 20 61 6e 64 20 61 6c 69 67 6e 6d 65 6e  ize and alignmen
1ade0 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61  t of journal hea
1adf0 64 65 72 20 61 6e 64 20 0a 2a 2a 20 6d 61 73 74  der and .** mast
1ae00 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er journal point
1ae10 65 72 73 20 77 69 74 68 69 6e 20 63 72 65 61 74  ers within creat
1ae20 65 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  ed journal files
1ae30 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70  ..**.** For temp
1ae40 6f 72 61 72 79 20 66 69 6c 65 73 20 74 68 65 20  orary files the 
1ae50 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72  effective sector
1ae60 20 73 69 7a 65 20 69 73 20 61 6c 77 61 79 73 20   size is always 
1ae70 35 31 32 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a  512 bytes..**.**
1ae80 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6f 72 20   Otherwise, for 
1ae90 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72 79 20 66 69  non-temporary fi
1aea0 6c 65 73 2c 20 74 68 65 20 65 66 66 65 63 74 69  les, the effecti
1aeb0 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69  ve sector size i
1aec0 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72  s.** the value r
1aed0 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 78  eturned by the x
1aee0 53 65 63 74 6f 72 53 69 7a 65 28 29 20 6d 65 74  SectorSize() met
1aef0 68 6f 64 20 72 6f 75 6e 64 65 64 20 75 70 20 74  hod rounded up t
1af00 6f 20 33 32 20 69 66 0a 2a 2a 20 69 74 20 69 73  o 32 if.** it is
1af10 20 6c 65 73 73 20 74 68 61 6e 20 33 32 2c 20 6f   less than 32, o
1af20 72 20 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20 74  r rounded down t
1af30 6f 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  o MAX_SECTOR_SIZ
1af40 45 20 69 66 20 69 74 0a 2a 2a 20 69 73 20 67 72  E if it.** is gr
1af50 65 61 74 65 72 20 74 68 61 6e 20 4d 41 58 5f 53  eater than MAX_S
1af60 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2a 0a 2a  ECTOR_SIZE..**.*
1af70 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 68 61  * If the file ha
1af80 73 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43  s the SQLITE_IOC
1af90 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  AP_POWERSAFE_OVE
1afa0 52 57 52 49 54 45 20 70 72 6f 70 65 72 74 79 2c  RWRITE property,
1afb0 20 74 68 65 6e 20 73 65 74 0a 2a 2a 20 74 68 65   then set.** the
1afc0 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f   effective secto
1afd0 72 20 73 69 7a 65 20 74 6f 20 69 74 73 20 6d 69  r size to its mi
1afe0 6e 69 6d 75 6d 20 76 61 6c 75 65 20 28 35 31 32  nimum value (512
1aff0 29 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65 20  ).  The purpose 
1b000 6f 66 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 73 65  of.** pPager->se
1b010 63 74 6f 72 53 69 7a 65 20 69 73 20 74 6f 20 64  ctorSize is to d
1b020 65 66 69 6e 65 20 74 68 65 20 22 62 6c 61 73 74  efine the "blast
1b030 20 72 61 64 69 75 73 22 20 6f 66 20 62 79 74 65   radius" of byte
1b040 73 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20  s that.** might 
1b050 63 68 61 6e 67 65 20 69 66 20 61 20 63 72 61 73  change if a cras
1b060 68 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 77  h occurs while w
1b070 72 69 74 69 6e 67 20 74 6f 20 61 20 73 69 6e 67  riting to a sing
1b080 6c 65 20 62 79 74 65 20 69 6e 0a 2a 2a 20 74 68  le byte in.** th
1b090 61 74 20 72 61 6e 67 65 2e 20 20 42 75 74 20 77  at range.  But w
1b0a0 69 74 68 20 50 4f 57 45 52 53 41 46 45 5f 4f 56  ith POWERSAFE_OV
1b0b0 45 52 57 52 49 54 45 2c 20 74 68 65 20 62 6c 61  ERWRITE, the bla
1b0c0 73 74 20 72 61 64 69 75 73 20 69 73 20 7a 65 72  st radius is zer
1b0d0 6f 0a 2a 2a 20 28 74 68 61 74 20 69 73 20 77 68  o.** (that is wh
1b0e0 61 74 20 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  at POWERSAFE_OVE
1b0f0 52 57 52 49 54 45 20 6d 65 61 6e 73 29 2c 20 73  RWRITE means), s
1b100 6f 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68  o we minimize th
1b110 65 20 73 65 63 74 6f 72 0a 2a 2a 20 73 69 7a 65  e sector.** size
1b120 2e 20 20 46 6f 72 20 62 61 63 6b 77 61 72 64 73  .  For backwards
1b130 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 6f   compatibility o
1b140 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  f the rollback j
1b150 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d  ournal file form
1b160 61 74 2c 0a 2a 2a 20 77 65 20 63 61 6e 6e 6f 74  at,.** we cannot
1b170 20 72 65 64 75 63 65 20 74 68 65 20 65 66 66 65   reduce the effe
1b180 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a  ctive sector siz
1b190 65 20 62 65 6c 6f 77 20 35 31 32 2e 0a 2a 2f 0a  e below 512..*/.
1b1a0 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 53  static void setS
1b1b0 65 63 74 6f 72 53 69 7a 65 28 50 61 67 65 72 20  ectorSize(Pager 
1b1c0 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65  *pPager){.  asse
1b1d0 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
1b1e0 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72  r->fd) || pPager
1b1f0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20  ->tempFile );.. 
1b200 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d   if( pPager->tem
1b210 70 46 69 6c 65 0a 20 20 20 7c 7c 20 28 73 71 6c  pFile.   || (sql
1b220 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
1b230 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
1b240 65 72 2d 3e 66 64 29 20 26 20 0a 20 20 20 20 20  er->fd) & .     
1b250 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
1b260 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f  IOCAP_POWERSAFE_
1b270 4f 56 45 52 57 52 49 54 45 29 21 3d 30 0a 20 20  OVERWRITE)!=0.  
1b280 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f 72  ){.    /* Sector
1b290 20 73 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d 61   size doesn't ma
1b2a0 74 74 65 72 20 66 6f 72 20 74 65 6d 70 6f 72 61  tter for tempora
1b2b0 72 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c 20  ry files. Also, 
1b2c0 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
1b2d0 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62 65 65  may not have bee
1b2e0 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c 20 69 6e  n opened yet, in
1b2f0 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20   which case the 
1b300 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20  OsSectorSize(). 
1b310 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20     ** call will 
1b320 73 65 67 66 61 75 6c 74 2e 20 2a 2f 0a 20 20 20  segfault. */.   
1b330 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
1b340 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d 65 6c  ize = 512;.  }el
1b350 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
1b360 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c  sectorSize = sql
1b370 69 74 65 33 53 65 63 74 6f 72 53 69 7a 65 28 70  ite3SectorSize(p
1b380 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a  Pager->fd);.  }.
1b390 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63  }../*.** Playbac
1b3a0 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  k the journal an
1b3b0 64 20 74 68 75 73 20 72 65 73 74 6f 72 65 20 74  d thus restore t
1b3c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1b3d0 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65   to.** the state
1b3e0 20 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72   it was in befor
1b3f0 65 20 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b  e we started mak
1b400 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a  ing changes.  .*
1b410 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
1b420 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20   file format is 
1b430 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a  as follows: .**.
1b440 2a 2a 20 20 28 31 29 20 20 38 20 62 79 74 65 20  **  (1)  8 byte 
1b450 70 72 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20  prefix.  A copy 
1b460 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of aJournalMagic
1b470 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62  []..**  (2)  4 b
1b480 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
1b490 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
1b4a0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61  the number of va
1b4b0 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73  lid page records
1b4c0 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65  .**       in the
1b4d0 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68   journal.  If th
1b4e0 69 73 20 76 61 6c 75 65 20 69 73 20 30 78 66 66  is value is 0xff
1b4f0 66 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d  ffffff, then com
1b500 70 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20  pute the.**     
1b510 20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65    number of page
1b520 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68   records from th
1b530 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a  e journal size..
1b540 2a 2a 20 20 28 33 29 20 20 34 20 62 79 74 65 20  **  (3)  4 byte 
1b550 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
1b560 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
1b570 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f  initial value fo
1b580 72 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20  r the .**       
1b590 73 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e  sanity checksum.
1b5a0 0a 2a 2a 20 20 28 34 29 20 20 34 20 62 79 74 65  .**  (4)  4 byte
1b5b0 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
1b5c0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1b5d0 70 61 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74  pages to truncat
1b5e0 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64  e the.**       d
1b5f0 61 74 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e  atabase to durin
1b600 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  g a rollback..**
1b610 20 20 28 35 29 20 20 34 20 62 79 74 65 20 62 69    (5)  4 byte bi
1b620 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
1b630 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73 65   which is the se
1b640 63 74 6f 72 20 73 69 7a 65 2e 20 20 54 68 65 20  ctor size.  The 
1b650 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 20 20  header.**       
1b660 69 73 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74  is this many byt
1b670 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20  es in size..**  
1b680 28 36 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (6)  4 byte big-
1b690 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
1b6a0 68 69 63 68 20 69 73 20 74 68 65 20 70 61 67 65  hich is the page
1b6b0 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 37 29 20 20   size..**  (7)  
1b6c0 7a 65 72 6f 20 70 61 64 64 69 6e 67 20 6f 75 74  zero padding out
1b6d0 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63   to the next sec
1b6e0 74 6f 72 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 38  tor size..**  (8
1b6f0 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  )  Zero or more 
1b700 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c  pages instances,
1b710 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73   each as follows
1b720 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34  :.**        +  4
1b730 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65   byte page numbe
1b740 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  r..**        +  
1b750 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1b760 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a   bytes of data..
1b770 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62  **        +  4 b
1b780 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a  yte checksum.**.
1b790 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b  ** When we speak
1b7a0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1b7b0 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20  header, we mean 
1b7c0 74 68 65 20 66 69 72 73 74 20 37 20 69 74 65 6d  the first 7 item
1b7d0 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68  s above..** Each
1b7e0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f   entry in the jo
1b7f0 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74  urnal is an inst
1b800 61 6e 63 65 20 6f 66 20 74 68 65 20 38 74 68 20  ance of the 8th 
1b810 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  item..**.** Call
1b820 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20   the value from 
1b830 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65  the second bulle
1b840 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20  t "nRec".  nRec 
1b850 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
1b860 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65  .** valid page e
1b870 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f  ntries in the jo
1b880 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20  urnal.  In most 
1b890 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63  cases, you can c
1b8a0 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61  ompute the.** va
1b8b0 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d  lue of nRec from
1b8c0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1b8d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
1b8e0 42 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a  But if a power.*
1b8f0 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  * failure occurr
1b900 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  ed while the jou
1b910 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77  rnal was being w
1b920 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64  ritten, it could
1b930 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20   be the.** case 
1b940 74 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66  that the size of
1b950 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1b960 65 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65  e had already be
1b970 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75 74  en increased but
1b980 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e  .** the extra en
1b990 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65  tries had not ye
1b9a0 74 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79  t made it safely
1b9b0 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75   to disk.  In su
1b9c0 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68  ch a case,.** th
1b9d0 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  e value of nRec 
1b9e0 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68  computed from th
1b9f0 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c  e file size woul
1ba00 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20  d be too large. 
1ba10 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61   For.** that rea
1ba20 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75  son, we always u
1ba30 73 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  se the nRec valu
1ba40 65 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e  e in the header.
1ba50 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52  .**.** If the nR
1ba60 65 63 20 76 61 6c 75 65 20 69 73 20 30 78 66 66  ec value is 0xff
1ba70 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20  ffffff it means 
1ba80 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64  that nRec should
1ba90 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20   be computed.** 
1baa0 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69  from the file si
1bab0 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20  ze.  This value 
1bac0 69 73 20 75 73 65 64 20 77 68 65 6e 20 74 68 65  is used when the
1bad0 20 75 73 65 72 20 73 65 6c 65 63 74 73 20 74 68   user selects th
1bae0 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74  e.** no-sync opt
1baf0 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  ion for the jour
1bb00 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61  nal.  A power fa
1bb10 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64  ilure could lead
1bb20 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a   to corruption.*
1bb30 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  * in this case. 
1bb40 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20   But for things 
1bb50 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74  like temporary t
1bb60 61 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c  able (which will
1bb70 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77   be.** deleted w
1bb80 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73  hen the power is
1bb90 20 72 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f   restored) we do
1bba0 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a  n't care.  .**.*
1bbb0 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70  * If the file op
1bbc0 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72  ened as the jour
1bbd0 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal file is not 
1bbe0 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a  a well-formed.**
1bbf0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
1bc00 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20  en all pages up 
1bc10 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 72  to the first cor
1bc20 72 75 70 74 65 64 20 70 61 67 65 20 61 72 65 20  rupted page are 
1bc30 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28  rolled.** back (
1bc40 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74  or no pages if t
1bc50 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
1bc60 72 20 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e  r is corrupted).
1bc70 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
1bc80 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c  e.** is then del
1bc90 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f  eted and SQLITE_
1bca0 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73  OK returned, jus
1bcb0 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75  t as if no corru
1bcc0 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65  ption had.** bee
1bcd0 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a  n encountered..*
1bce0 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f  *.** If an I/O o
1bcf0 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72  r malloc() error
1bd00 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75   occurs, the jou
1bd10 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74  rnal-file is not
1bd20 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20   deleted.** and 
1bd30 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
1bd40 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
1bd50 20 54 68 65 20 69 73 48 6f 74 20 70 61 72 61 6d   The isHot param
1bd60 65 74 65 72 20 69 6e 64 69 63 61 74 65 73 20 74  eter indicates t
1bd70 68 61 74 20 77 65 20 61 72 65 20 74 72 79 69 6e  hat we are tryin
1bd80 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20  g to rollback a 
1bd90 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68 61 74 20  journal.** that 
1bda0 6d 69 67 68 74 20 62 65 20 61 20 68 6f 74 20 6a  might be a hot j
1bdb0 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c 20 69 74 20  ournal.  Or, it 
1bdc0 63 6f 75 6c 64 20 62 65 20 74 68 61 74 20 74 68  could be that th
1bdd0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 0a 2a 2a  e journal is .**
1bde0 20 70 72 65 73 65 72 76 65 64 20 62 65 63 61 75   preserved becau
1bdf0 73 65 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44  se of JOURNALMOD
1be00 45 5f 50 45 52 53 49 53 54 20 6f 72 20 4a 4f 55  E_PERSIST or JOU
1be10 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
1be20 45 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  E..** If the jou
1be30 72 6e 61 6c 20 72 65 61 6c 6c 79 20 69 73 20 68  rnal really is h
1be40 6f 74 2c 20 72 65 73 65 74 20 74 68 65 20 70 61  ot, reset the pa
1be50 67 65 72 20 63 61 63 68 65 20 70 72 69 6f 72 20  ger cache prior 
1be60 72 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b 20  rolling.** back 
1be70 61 6e 79 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66  any content.  If
1be80 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
1be90 6d 65 72 65 6c 79 20 70 65 72 73 69 73 74 65 6e  merely persisten
1bea0 74 2c 20 6e 6f 20 72 65 73 65 74 20 69 73 0a 2a  t, no reset is.*
1beb0 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61  * needed..*/.sta
1bec0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c  tic int pager_pl
1bed0 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  ayback(Pager *pP
1bee0 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29  ager, int isHot)
1bef0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
1bf00 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e  *pVfs = pPager->
1bf10 70 56 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b  pVfs;.  i64 szJ;
1bf20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf30 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
1bf40 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
1bf50 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e  bytes */.  u32 n
1bf60 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
1bf70 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1bf80 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20   Records in the 
1bf90 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
1bfa0 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   u;             
1bfb0 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65        /* Unsigne
1bfc0 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  d loop counter *
1bfd0 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20  /.  Pgno mxPg = 
1bfe0 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
1bff0 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67  Size of the orig
1c000 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67  inal file in pag
1c010 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  es */.  int rc; 
1c020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c030 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
1c040 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  of a subroutine 
1c050 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31  */.  int res = 1
1c060 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1c070 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   Value returned 
1c080 62 79 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65  by sqlite3OsAcce
1c090 73 73 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ss() */.  char *
1c0a0 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20  zMaster = 0;    
1c0b0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61     /* Name of ma
1c0c0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1c0d0 65 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e  e if any */.  in
1c0e0 74 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74  t needPagerReset
1c0f0 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74  ;      /* True t
1c100 6f 20 72 65 73 65 74 20 70 61 67 65 20 70 72 69  o reset page pri
1c110 6f 72 20 74 6f 20 66 69 72 73 74 20 70 61 67 65  or to first page
1c120 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69   rollback */.  i
1c130 6e 74 20 6e 50 6c 61 79 62 61 63 6b 20 3d 20 30  nt nPlayback = 0
1c140 3b 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c  ;       /* Total
1c150 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1c160 20 72 65 73 74 6f 72 65 64 20 66 72 6f 6d 20 6a   restored from j
1c170 6f 75 72 6e 61 6c 20 2a 2f 0a 0a 20 20 2f 2a 20  ournal */..  /* 
1c180 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
1c190 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20  any records are 
1c1a0 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
1c1b0 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a   Abort early if.
1c1c0 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
1c1d0 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a   is empty..  */.
1c1e0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
1c1f0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
1c200 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
1c210 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
1c220 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20  ->jfd, &szJ);.  
1c230 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1c240 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  K ){.    goto en
1c250 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  d_playback;.  }.
1c260 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d  .  /* Read the m
1c270 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
1c280 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  me from the jour
1c290 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72  nal, if it is pr
1c2a0 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61  esent..  ** If a
1c2b0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1c2c0 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65  file name is spe
1c2d0 63 69 66 69 65 64 2c 20 62 75 74 20 74 68 65 20  cified, but the 
1c2e0 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  file is not.  **
1c2f0 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b   present on disk
1c300 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
1c310 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e  al is not hot an
1c320 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  d does not need 
1c330 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65  to be.  ** playe
1c340 64 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a  d back..  **.  *
1c350 2a 20 54 4f 44 4f 3a 20 54 65 63 68 6e 69 63 61  * TODO: Technica
1c360 6c 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  lly the followin
1c370 67 20 69 73 20 61 6e 20 65 72 72 6f 72 20 62 65  g is an error be
1c380 63 61 75 73 65 20 69 74 20 61 73 73 75 6d 65 73  cause it assumes
1c390 20 74 68 61 74 0a 20 20 2a 2a 20 62 75 66 66 65   that.  ** buffe
1c3a0 72 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63  r Pager.pTmpSpac
1c3b0 65 20 69 73 20 28 6d 78 50 61 74 68 6e 61 6d 65  e is (mxPathname
1c3c0 2b 31 29 20 62 79 74 65 73 20 6f 72 20 6c 61 72  +1) bytes or lar
1c3d0 67 65 72 2e 20 69 2e 65 2e 20 74 68 61 74 0a 20  ger. i.e. that. 
1c3e0 20 2a 2a 20 28 70 50 61 67 65 72 2d 3e 70 61 67   ** (pPager->pag
1c3f0 65 53 69 7a 65 20 3e 3d 20 70 50 61 67 65 72 2d  eSize >= pPager-
1c400 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
1c410 65 2b 31 29 2e 20 55 73 69 6e 67 20 6f 73 5f 75  e+1). Using os_u
1c420 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20 6d 78 50 61  nix.c,.  ** mxPa
1c430 74 68 6e 61 6d 65 20 69 73 20 35 31 32 2c 20 77  thname is 512, w
1c440 68 69 63 68 20 69 73 20 74 68 65 20 73 61 6d 65  hich is the same
1c450 20 61 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20   as the minimum 
1c460 61 6c 6c 6f 77 61 62 6c 65 20 76 61 6c 75 65 0a  allowable value.
1c470 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 53 69 7a    ** for pageSiz
1c480 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65  e..  */.  zMaste
1c490 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  r = pPager->pTmp
1c4a0 53 70 61 63 65 3b 0a 20 20 72 63 20 3d 20 72 65  Space;.  rc = re
1c4b0 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
1c4c0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61  pPager->jfd, zMa
1c4d0 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56  ster, pPager->pV
1c4e0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
1c4f0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1c500 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65  ITE_OK && zMaste
1c510 72 5b 30 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d  r[0] ){.    rc =
1c520 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
1c530 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
1c540 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
1c550 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d  ISTS, &res);.  }
1c560 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a  .  zMaster = 0;.
1c570 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1c580 5f 4f 4b 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20  _OK || !res ){. 
1c590 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
1c5a0 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67  back;.  }.  pPag
1c5b0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
1c5c0 20 30 3b 0a 20 20 6e 65 65 64 50 61 67 65 72 52   0;.  needPagerR
1c5d0 65 73 65 74 20 3d 20 69 73 48 6f 74 3b 0a 0a 20  eset = isHot;.. 
1c5e0 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65   /* This loop te
1c5f0 72 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72 20  rminates either 
1c600 77 68 65 6e 20 61 20 72 65 61 64 4a 6f 75 72 6e  when a readJourn
1c610 61 6c 48 64 72 28 29 20 6f 72 20 0a 20 20 2a 2a  alHdr() or .  **
1c620 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
1c630 6f 6e 65 5f 70 61 67 65 28 29 20 63 61 6c 6c 20  one_page() call 
1c640 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44  returns SQLITE_D
1c650 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72  ONE or an IO err
1c660 6f 72 20 0a 20 20 2a 2a 20 6f 63 63 75 72 73 2e  or .  ** occurs.
1c670 20 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20   .  */.  while( 
1c680 31 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65 61 64  1 ){.    /* Read
1c690 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61   the next journa
1c6a0 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68  l header from th
1c6b0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
1c6c0 20 49 66 20 74 68 65 72 65 20 61 72 65 0a 20 20   If there are.  
1c6d0 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20    ** not enough 
1c6e0 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68  bytes left in th
1c6f0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
1c700 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65  or a complete he
1c710 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20  ader, or.    ** 
1c720 69 74 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c  it is corrupted,
1c730 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20   then a process 
1c740 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64  must have failed
1c750 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69   while writing i
1c760 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69  t..    ** This i
1c770 6e 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67  ndicates nothing
1c780 20 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62   more needs to b
1c790 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20  e rolled back.. 
1c7a0 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72     */.    rc = r
1c7b0 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eadJournalHdr(pP
1c7c0 61 67 65 72 2c 20 69 73 48 6f 74 2c 20 73 7a 4a  ager, isHot, szJ
1c7d0 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b  , &nRec, &mxPg);
1c7e0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1c7f0 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20  ITE_OK ){ .     
1c800 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c810 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  DONE ){.        
1c820 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1c830 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
1c840 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
1c850 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
1c860 66 20 6e 52 65 63 20 69 73 20 30 78 66 66 66 66  f nRec is 0xffff
1c870 66 66 66 66 2c 20 74 68 65 6e 20 74 68 69 73 20  ffff, then this 
1c880 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63 72 65 61  journal was crea
1c890 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
1c8a0 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20  .    ** working 
1c8b0 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e  in no-sync mode.
1c8c0 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
1c8d0 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65   the rest of the
1c8e0 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
1c8f0 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66  file consists of
1c900 20 70 61 67 65 73 2c 20 74 68 65 72 65 20 61 72   pages, there ar
1c910 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61  e no more journa
1c920 6c 20 68 65 61 64 65 72 73 2e 20 43 6f 6d 70 75  l headers. Compu
1c930 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61  te.    ** the va
1c940 6c 75 65 20 6f 66 20 6e 52 65 63 20 62 61 73 65  lue of nRec base
1c950 64 20 6f 6e 20 74 68 69 73 20 61 73 73 75 6d 70  d on this assump
1c960 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
1c970 20 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66   if( nRec==0xfff
1c980 66 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 61  fffff ){.      a
1c990 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
1c9a0 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e  ournalOff==JOURN
1c9b0 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
1c9c0 29 20 29 3b 0a 20 20 20 20 20 20 6e 52 65 63 20  ) );.      nRec 
1c9d0 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 4a  = (int)((szJ - J
1c9e0 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
1c9f0 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50  ager))/JOURNAL_P
1ca00 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20  G_SZ(pPager));. 
1ca10 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1ca20 6e 52 65 63 20 69 73 20 30 20 61 6e 64 20 74 68  nRec is 0 and th
1ca30 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f  is rollback is o
1ca40 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
1ca50 63 72 65 61 74 65 64 20 62 79 20 74 68 69 73 0a  created by this.
1ca60 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61      ** process a
1ca70 6e 64 20 69 66 20 74 68 69 73 20 69 73 20 74 68  nd if this is th
1ca80 65 20 66 69 6e 61 6c 20 68 65 61 64 65 72 20 69  e final header i
1ca90 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74  n the journal, t
1caa0 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20 20  hen it means.   
1cab0 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20 70 61   ** that this pa
1cac0 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  rt of the journa
1cad0 6c 20 77 61 73 20 62 65 69 6e 67 20 66 69 6c 6c  l was being fill
1cae0 65 64 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79  ed but has not y
1caf0 65 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73  et been.    ** s
1cb00 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 20  ynced to disk.  
1cb10 43 6f 6d 70 75 74 65 20 74 68 65 20 6e 75 6d 62  Compute the numb
1cb20 65 72 20 6f 66 20 70 61 67 65 73 20 62 61 73 65  er of pages base
1cb30 64 20 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e 69  d on the remaini
1cb40 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f  ng.    ** size o
1cb50 66 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20  f the file..    
1cb60 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 68  **.    ** The th
1cb70 69 72 64 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ird term of the 
1cb80 74 65 73 74 20 77 61 73 20 61 64 64 65 64 20 74  test was added t
1cb90 6f 20 66 69 78 20 74 69 63 6b 65 74 20 23 32 35  o fix ticket #25
1cba0 36 35 2e 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20  65..    ** When 
1cbb0 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68  rolling back a h
1cbc0 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e 52 65 63  ot journal, nRec
1cbd0 3d 3d 30 20 61 6c 77 61 79 73 20 6d 65 61 6e 73  ==0 always means
1cbe0 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 0a 20   that the next. 
1cbf0 20 20 20 2a 2a 20 63 68 75 6e 6b 20 6f 66 20 74     ** chunk of t
1cc00 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61  he journal conta
1cc10 69 6e 73 20 7a 65 72 6f 20 70 61 67 65 73 20 74  ins zero pages t
1cc20 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
1cc30 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a 20 77 68  .  But.    ** wh
1cc40 65 6e 20 64 6f 69 6e 67 20 61 20 52 4f 4c 4c 42  en doing a ROLLB
1cc50 41 43 4b 20 61 6e 64 20 74 68 65 20 6e 52 65 63  ACK and the nRec
1cc60 3d 3d 30 20 63 68 75 6e 6b 20 69 73 20 74 68 65  ==0 chunk is the
1cc70 20 6c 61 73 74 20 63 68 75 6e 6b 20 69 6e 0a 20   last chunk in. 
1cc80 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61     ** the journa
1cc90 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  l, it means that
1cca0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67   the journal mig
1ccb0 68 74 20 63 6f 6e 74 61 69 6e 20 61 64 64 69 74  ht contain addit
1ccc0 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20 70 61 67  ional.    ** pag
1ccd0 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  es that need to 
1cce0 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  be rolled back a
1ccf0 6e 64 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62  nd that the numb
1cd00 65 72 20 6f 66 20 70 61 67 65 73 20 0a 20 20 20  er of pages .   
1cd10 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 63 6f   ** should be co
1cd20 6d 70 75 74 65 64 20 62 61 73 65 64 20 6f 6e 20  mputed based on 
1cd30 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1cd40 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   size..    */.  
1cd50 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26    if( nRec==0 &&
1cd60 20 21 69 73 48 6f 74 20 26 26 0a 20 20 20 20 20   !isHot &&.     
1cd70 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
1cd80 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alHdr+JOURNAL_HD
1cd90 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50  R_SZ(pPager)==pP
1cda0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1cdb0 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d   ){.      nRec =
1cdc0 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 70 50   (int)((szJ - pP
1cdd0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1cde0 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ) / JOURNAL_PG_S
1cdf0 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  Z(pPager));.    
1ce00 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
1ce10 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 68  s is the first h
1ce20 65 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20  eader read from 
1ce30 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75  the journal, tru
1ce40 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a  ncate the.    **
1ce50 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
1ce60 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ack to its origi
1ce70 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  nal size..    */
1ce80 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
1ce90 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55  >journalOff==JOU
1cea0 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
1ceb0 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  er) ){.      rc 
1cec0 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  = pager_truncate
1ced0 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a  (pPager, mxPg);.
1cee0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1cef0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1cf00 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
1cf10 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  back;.      }.  
1cf20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
1cf30 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d  ze = mxPg;.    }
1cf40 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72  ..    /* Copy or
1cf50 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74  iginal pages out
1cf60 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1cf70 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  and back into th
1cf80 65 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  e .    ** databa
1cf90 73 65 20 66 69 6c 65 20 61 6e 64 2f 6f 72 20 70  se file and/or p
1cfa0 61 67 65 20 63 61 63 68 65 2e 0a 20 20 20 20 2a  age cache..    *
1cfb0 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30 3b 20 75  /.    for(u=0; u
1cfc0 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a 20 20 20  <nRec; u++){.   
1cfd0 20 20 20 69 66 28 20 6e 65 65 64 50 61 67 65 72     if( needPager
1cfe0 52 65 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20  Reset ){.       
1cff0 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
1d000 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 6e 65  ger);.        ne
1d010 65 64 50 61 67 65 72 52 65 73 65 74 20 3d 20 30  edPagerReset = 0
1d020 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1d030 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
1d040 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
1d050 67 65 72 2c 26 70 50 61 67 65 72 2d 3e 6a 6f 75  ger,&pPager->jou
1d060 72 6e 61 6c 4f 66 66 2c 30 2c 31 2c 30 29 3b 0a  rnalOff,0,1,0);.
1d070 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1d080 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1d090 20 20 20 6e 50 6c 61 79 62 61 63 6b 2b 2b 3b 0a     nPlayback++;.
1d0a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1d0b0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1d0c0 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
1d0d0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
1d0e0 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
1d0f0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1d100 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
1d110 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
1d120 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
1d130 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
1d140 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  f the journal ha
1d150 73 20 62 65 65 6e 20 74 72 75 6e 63 61 74 65 64  s been truncated
1d160 2c 20 73 69 6d 70 6c 79 20 73 74 6f 70 20 72 65  , simply stop re
1d170 61 64 69 6e 67 20 61 6e 64 0a 20 20 20 20 20 20  ading and.      
1d180 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e      ** processin
1d190 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 54  g the journal. T
1d1a0 68 69 73 20 6d 69 67 68 74 20 68 61 70 70 65 6e  his might happen
1d1b0 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   if the journal 
1d1c0 77 61 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  was.          **
1d1d0 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20   not completely 
1d1e0 77 72 69 74 74 65 6e 20 61 6e 64 20 73 79 6e 63  written and sync
1d1f0 65 64 20 70 72 69 6f 72 20 74 6f 20 61 20 63 72  ed prior to a cr
1d200 61 73 68 2e 20 20 49 6e 20 74 68 61 74 0a 20 20  ash.  In that.  
1d210 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 2c          ** case,
1d220 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 68   the database sh
1d230 6f 75 6c 64 20 68 61 76 65 20 6e 65 76 65 72 20  ould have never 
1d240 62 65 65 6e 20 77 72 69 74 74 65 6e 20 69 6e 20  been written in 
1d250 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
1d260 20 66 69 72 73 74 20 70 6c 61 63 65 20 73 6f 20   first place so 
1d270 69 74 20 69 73 20 4f 4b 20 74 6f 20 73 69 6d 70  it is OK to simp
1d280 6c 79 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 72  ly abandon the r
1d290 6f 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 20 20 20 20  ollback. */.    
1d2a0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1d2b0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
1d2c0 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
1d2d0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
1d2e0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
1d2f0 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20  f we are unable 
1d300 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 71 75 69  to rollback, qui
1d310 74 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  t and return the
1d320 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20   error.         
1d330 20 2a 2a 20 63 6f 64 65 2e 20 20 54 68 69 73 20   ** code.  This 
1d340 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 70  will cause the p
1d350 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68  ager to enter th
1d360 65 20 65 72 72 6f 72 20 73 74 61 74 65 0a 20 20  e error state.  
1d370 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 74 68          ** so th
1d380 61 74 20 6e 6f 20 66 75 72 74 68 65 72 20 68 61  at no further ha
1d390 72 6d 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 2e  rm will be done.
1d3a0 20 20 50 65 72 68 61 70 73 20 74 68 65 20 6e 65    Perhaps the ne
1d3b0 78 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  xt.          ** 
1d3c0 70 72 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65 20  process to come 
1d3d0 61 6c 6f 6e 67 20 77 69 6c 6c 20 62 65 20 61 62  along will be ab
1d3e0 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74  le to rollback t
1d3f0 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20  he database..   
1d400 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1d410 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
1d420 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  yback;.        }
1d430 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1d440 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45   }.  /*NOTREACHE
1d450 44 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 20  D*/.  assert( 0 
1d460 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b  );..end_playback
1d470 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67  :.  /* Following
1d480 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65   a rollback, the
1d490 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73   database file s
1d4a0 68 6f 75 6c 64 20 62 65 20 62 61 63 6b 20 69 6e  hould be back in
1d4b0 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20   its original.  
1d4c0 2a 2a 20 73 74 61 74 65 20 70 72 69 6f 72 20 74  ** state prior t
1d4d0 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
1d4e0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
1d4f0 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65 0a 20 20  so invoke the.  
1d500 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  ** SQLITE_FCNTL_
1d510 44 42 5f 55 4e 43 48 41 4e 47 45 44 20 66 69 6c  DB_UNCHANGED fil
1d520 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64  e-control method
1d530 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 0a   to disable the.
1d540 20 20 2a 2a 20 61 73 73 65 72 74 69 6f 6e 20 74    ** assertion t
1d550 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  hat the transact
1d560 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20  ion counter was 
1d570 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 23  modified..  */.#
1d580 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1d590 55 47 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  UG.  if( pPager-
1d5a0 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b  >fd->pMethods ){
1d5b0 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69  .    sqlite3OsFi
1d5c0 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50  leControlHint(pP
1d5d0 61 67 65 72 2d 3e 66 64 2c 53 51 4c 49 54 45 5f  ager->fd,SQLITE_
1d5e0 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47  FCNTL_DB_UNCHANG
1d5f0 45 44 2c 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  ED,0);.  }.#endi
1d600 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  f..  /* If this 
1d610 70 6c 61 79 62 61 63 6b 20 69 73 20 68 61 70 70  playback is happ
1d620 65 6e 69 6e 67 20 61 75 74 6f 6d 61 74 69 63 61  ening automatica
1d630 6c 6c 79 20 61 73 20 61 20 72 65 73 75 6c 74 20  lly as a result 
1d640 6f 66 20 61 6e 20 49 4f 20 6f 72 20 0a 20 20 2a  of an IO or .  *
1d650 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 74  * malloc error t
1d660 68 61 74 20 6f 63 63 75 72 72 65 64 20 61 66 74  hat occurred aft
1d670 65 72 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  er the change-co
1d680 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74 65  unter was update
1d690 64 20 62 75 74 20 0a 20 20 2a 2a 20 62 65 66 6f  d but .  ** befo
1d6a0 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
1d6b0 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74 65 64  on was committed
1d6c0 2c 20 74 68 65 6e 20 74 68 65 20 63 68 61 6e 67  , then the chang
1d6d0 65 2d 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20  e-counter .  ** 
1d6e0 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d 61 79  modification may
1d6f0 20 6a 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   just have been 
1d700 72 65 76 65 72 74 65 64 2e 20 49 66 20 74 68 69  reverted. If thi
1d710 73 20 68 61 70 70 65 6e 73 20 69 6e 20 65 78 63  s happens in exc
1d720 6c 75 73 69 76 65 20 0a 20 20 2a 2a 20 6d 6f 64  lusive .  ** mod
1d730 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71 75 65  e, then subseque
1d740 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  nt transactions 
1d750 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68 65  performed by the
1d760 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c   connection will
1d770 20 6e 6f 74 0a 20 20 2a 2a 20 75 70 64 61 74 65   not.  ** update
1d780 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
1d790 74 65 72 20 61 74 20 61 6c 6c 2e 20 54 68 69 73  ter at all. This
1d7a0 20 6d 61 79 20 6c 65 61 64 20 74 6f 20 63 61 63   may lead to cac
1d7b0 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 79  he inconsistency
1d7c0 0a 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 73 20 66  .  ** problems f
1d7d0 6f 72 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  or other process
1d7e0 65 73 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74  es at some point
1d7f0 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e 20   in the future. 
1d800 53 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a 20 69 6e  So, just.  ** in
1d810 20 63 61 73 65 20 74 68 69 73 20 68 61 73 20 68   case this has h
1d820 61 70 70 65 6e 65 64 2c 20 63 6c 65 61 72 20 74  appened, clear t
1d830 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  he changeCountDo
1d840 6e 65 20 66 6c 61 67 20 6e 6f 77 2e 0a 20 20 2a  ne flag now..  *
1d850 2f 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e  /.  pPager->chan
1d860 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50  geCountDone = pP
1d870 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
1d880 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1d890 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d 61 73  E_OK ){.    zMas
1d8a0 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  ter = pPager->pT
1d8b0 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 72 63 20  mpSpace;.    rc 
1d8c0 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
1d8d0 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  nal(pPager->jfd,
1d8e0 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72   zMaster, pPager
1d8f0 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ->pVfs->mxPathna
1d900 6d 65 2b 31 29 3b 0a 20 20 20 20 74 65 73 74 63  me+1);.    testc
1d910 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
1d920 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OK );.  }.  if( 
1d930 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  rc==SQLITE_OK.  
1d940 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74   && (pPager->eSt
1d950 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
1d960 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65  R_DBMOD || pPage
1d970 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
1d980 5f 4f 50 45 4e 29 0a 20 20 29 7b 0a 20 20 20 20  _OPEN).  ){.    
1d990 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1d9a0 72 53 79 6e 63 28 70 50 61 67 65 72 2c 20 30 29  rSync(pPager, 0)
1d9b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
1d9c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d9d0 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f   rc = pager_end_
1d9e0 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
1d9f0 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d  er, zMaster[0]!=
1da00 27 5c 30 27 2c 20 30 29 3b 0a 20 20 20 20 74 65  '\0', 0);.    te
1da10 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
1da20 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69  TE_OK );.  }.  i
1da30 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1da40 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26   && zMaster[0] &
1da50 26 20 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20  & res ){.    /* 
1da60 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20 6d  If there was a m
1da70 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e  aster journal an
1da80 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  d this routine w
1da90 69 6c 6c 20 72 65 74 75 72 6e 20 73 75 63 63 65  ill return succe
1daa0 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69  ss,.    ** see i
1dab0 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
1dac0 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d   to delete the m
1dad0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20  aster journal.. 
1dae0 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70     */.    rc = p
1daf0 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 70  ager_delmaster(p
1db00 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b  Pager, zMaster);
1db10 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
1db20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
1db30 20 20 7d 0a 20 20 69 66 28 20 69 73 48 6f 74 20    }.  if( isHot 
1db40 26 26 20 6e 50 6c 61 79 62 61 63 6b 20 29 7b 0a  && nPlayback ){.
1db50 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
1db60 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45  SQLITE_NOTICE_RE
1db70 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 2c 20  COVER_ROLLBACK, 
1db80 22 72 65 63 6f 76 65 72 65 64 20 25 64 20 70 61  "recovered %d pa
1db90 67 65 73 20 66 72 6f 6d 20 25 73 22 2c 0a 20 20  ges from %s",.  
1dba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 50                nP
1dbb0 6c 61 79 62 61 63 6b 2c 20 70 50 61 67 65 72 2d  layback, pPager-
1dbc0 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 0a  >zJournal);.  }.
1dbd0 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e  .  /* The Pager.
1dbe0 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61  sectorSize varia
1dbf0 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65 65  ble may have bee
1dc00 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c 65 20  n updated while 
1dc10 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63  rolling.  ** bac
1dc20 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61  k a journal crea
1dc30 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
1dc40 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e   with a differen
1dc50 74 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20  t sector size.  
1dc60 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20  ** value. Reset 
1dc70 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63  it to the correc
1dc80 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73  t value for this
1dc90 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20   process..  */. 
1dca0 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70   setSectorSize(p
1dcb0 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
1dcc0 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52   rc;.}.../*.** R
1dcd0 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ead the content 
1dce0 66 6f 72 20 70 61 67 65 20 70 50 67 20 6f 75 74  for page pPg out
1dcf0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1dd00 20 66 69 6c 65 20 61 6e 64 20 69 6e 74 6f 20 0a   file and into .
1dd10 2a 2a 20 70 50 67 2d 3e 70 44 61 74 61 2e 20 41  ** pPg->pData. A
1dd20 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 72 20   shared lock or 
1dd30 67 72 65 61 74 65 72 20 6d 75 73 74 20 62 65 20  greater must be 
1dd40 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1dd50 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 62 65 66  base.** file bef
1dd60 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ore this functio
1dd70 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  n is called..**.
1dd80 2a 2a 20 49 66 20 70 61 67 65 20 31 20 69 73 20  ** If page 1 is 
1dd90 72 65 61 64 2c 20 74 68 65 6e 20 74 68 65 20 76  read, then the v
1dda0 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62  alue of Pager.db
1ddb0 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 73 65  FileVers[] is se
1ddc0 74 20 74 6f 0a 2a 2a 20 74 68 65 20 76 61 6c 75  t to.** the valu
1ddd0 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
1dde0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
1ddf0 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72  *.** If an IO er
1de00 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  ror occurs, then
1de10 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 69 73   the IO error is
1de20 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
1de30 20 63 61 6c 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65   caller..** Othe
1de40 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
1de50 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
1de60 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
1de70 44 62 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  DbPage(PgHdr *pP
1de80 67 2c 20 75 33 32 20 69 46 72 61 6d 65 29 7b 0a  g, u32 iFrame){.
1de90 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1dea0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f  = pPg->pPager; /
1deb0 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61  * Pager object a
1dec0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
1ded0 61 67 65 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e  age pPg */.  Pgn
1dee0 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67  o pgno = pPg->pg
1def0 6e 6f 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67  no;       /* Pag
1df00 65 20 6e 75 6d 62 65 72 20 74 6f 20 72 65 61 64  e number to read
1df10 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
1df20 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
1df30 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1df40 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67 73 7a 20  e */.  int pgsz 
1df50 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
1df60 7a 65 3b 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ze; /* Number of
1df70 20 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a   bytes to read *
1df80 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
1df90 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
1dfa0 45 52 5f 52 45 41 44 45 52 20 26 26 20 21 4d 45  ER_READER && !ME
1dfb0 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MDB );.  assert(
1dfc0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1dfd0 66 64 29 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20  fd) );..#ifndef 
1dfe0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
1dff0 20 20 69 66 28 20 69 46 72 61 6d 65 20 29 7b 0a    if( iFrame ){.
1e000 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 70 75      /* Try to pu
1e010 6c 6c 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  ll the page from
1e020 20 74 68 65 20 77 72 69 74 65 2d 61 68 65 61 64   the write-ahead
1e030 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20   log. */.    rc 
1e040 3d 20 73 71 6c 69 74 65 33 57 61 6c 52 65 61 64  = sqlite3WalRead
1e050 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57  Frame(pPager->pW
1e060 61 6c 2c 20 69 46 72 61 6d 65 2c 20 70 67 73 7a  al, iFrame, pgsz
1e070 2c 20 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20  , pPg->pData);. 
1e080 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
1e090 7b 0a 20 20 20 20 69 36 34 20 69 4f 66 66 73 65  {.    i64 iOffse
1e0a0 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36  t = (pgno-1)*(i6
1e0b0 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
1e0c0 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ze;.    rc = sql
1e0d0 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
1e0e0 72 2d 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61 74  r->fd, pPg->pDat
1e0f0 61 2c 20 70 67 73 7a 2c 20 69 4f 66 66 73 65 74  a, pgsz, iOffset
1e100 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1e110 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
1e120 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
1e130 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1e140 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
1e150 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
1e160 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
1e170 2f 2a 20 49 66 20 74 68 65 20 72 65 61 64 20 69  /* If the read i
1e180 73 20 75 6e 73 75 63 63 65 73 73 66 75 6c 2c 20  s unsuccessful, 
1e190 73 65 74 20 74 68 65 20 64 62 46 69 6c 65 56 65  set the dbFileVe
1e1a0 72 73 5b 5d 20 74 6f 20 73 6f 6d 65 74 68 69 6e  rs[] to somethin
1e1b0 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  g.      ** that 
1e1c0 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 61 20  will never be a 
1e1d0 76 61 6c 69 64 20 66 69 6c 65 20 76 65 72 73 69  valid file versi
1e1e0 6f 6e 2e 20 20 64 62 46 69 6c 65 56 65 72 73 5b  on.  dbFileVers[
1e1f0 5d 20 69 73 20 61 20 63 6f 70 79 0a 20 20 20 20  ] is a copy.    
1e200 20 20 2a 2a 20 6f 66 20 62 79 74 65 73 20 32 34    ** of bytes 24
1e210 2e 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74 61  ..39 of the data
1e220 62 61 73 65 2e 20 20 42 79 74 65 73 20 32 38 2e  base.  Bytes 28.
1e230 2e 33 31 20 73 68 6f 75 6c 64 20 61 6c 77 61 79  .31 should alway
1e240 73 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 7a 65  s be.      ** ze
1e250 72 6f 20 6f 72 20 74 68 65 20 73 69 7a 65 20 6f  ro or the size o
1e260 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
1e270 6e 20 70 61 67 65 2e 20 42 79 74 65 73 20 33 32  n page. Bytes 32
1e280 2e 2e 33 35 20 61 6e 64 20 33 35 2e 2e 33 39 0a  ..35 and 35..39.
1e290 20 20 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20        ** should 
1e2a0 62 65 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20  be page numbers 
1e2b0 77 68 69 63 68 20 61 72 65 20 6e 65 76 65 72 20  which are never 
1e2c0 30 78 66 66 66 66 66 66 66 66 2e 20 20 53 6f 20  0xffffffff.  So 
1e2d0 66 69 6c 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a  filling.      **
1e2e0 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56   pPager->dbFileV
1e2f0 65 72 73 5b 5d 20 77 69 74 68 20 61 6c 6c 20 30  ers[] with all 0
1e300 78 66 66 20 62 79 74 65 73 20 73 68 6f 75 6c 64  xff bytes should
1e310 20 73 75 66 66 69 63 65 2e 0a 20 20 20 20 20 20   suffice..      
1e320 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20  **.      ** For 
1e330 61 6e 20 65 6e 63 72 79 70 74 65 64 20 64 61 74  an encrypted dat
1e340 61 62 61 73 65 2c 20 74 68 65 20 73 69 74 75 61  abase, the situa
1e350 74 69 6f 6e 20 69 73 20 6d 6f 72 65 20 63 6f 6d  tion is more com
1e360 70 6c 65 78 3a 20 20 62 79 74 65 73 0a 20 20 20  plex:  bytes.   
1e370 20 20 20 2a 2a 20 32 34 2e 2e 33 39 20 6f 66 20     ** 24..39 of 
1e380 74 68 65 20 64 61 74 61 62 61 73 65 20 61 72 65  the database are
1e390 20 77 68 69 74 65 20 6e 6f 69 73 65 2e 20 20 42   white noise.  B
1e3a0 75 74 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69  ut the probabili
1e3b0 74 79 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 77  ty of.      ** w
1e3c0 68 69 74 65 20 6e 6f 69 73 65 20 65 71 75 61 6c  hite noise equal
1e3d0 69 6e 67 20 31 36 20 62 79 74 65 73 20 6f 66 20  ing 16 bytes of 
1e3e0 30 78 66 66 20 69 73 20 76 61 6e 69 73 68 69 6e  0xff is vanishin
1e3f0 67 6c 79 20 73 6d 61 6c 6c 20 73 6f 0a 20 20 20  gly small so.   
1e400 20 20 20 2a 2a 20 77 65 20 73 68 6f 75 6c 64 20     ** we should 
1e410 73 74 69 6c 6c 20 62 65 20 6f 6b 2e 0a 20 20 20  still be ok..   
1e420 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d 73     */.      mems
1e430 65 74 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  et(pPager->dbFil
1e440 65 56 65 72 73 2c 20 30 78 66 66 2c 20 73 69 7a  eVers, 0xff, siz
1e450 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
1e460 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 65  leVers));.    }e
1e470 6c 73 65 7b 0a 20 20 20 20 20 20 75 38 20 2a 64  lse{.      u8 *d
1e480 62 46 69 6c 65 56 65 72 73 20 3d 20 26 28 28 75  bFileVers = &((u
1e490 38 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 5b 32  8*)pPg->pData)[2
1e4a0 34 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  4];.      memcpy
1e4b0 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
1e4c0 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73  Vers, dbFileVers
1e4d0 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
1e4e0 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
1e4f0 20 20 20 7d 0a 20 20 7d 0a 20 20 43 4f 44 45 43     }.  }.  CODEC
1e500 31 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  1(pPager, pPg->p
1e510 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72  Data, pgno, 3, r
1e520 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1e530 5f 42 4b 50 54 29 3b 0a 0a 20 20 50 41 47 45 52  _BKPT);..  PAGER
1e540 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
1e550 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74  ger_readdb_count
1e560 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28  );.  PAGER_INCR(
1e570 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a  pPager->nRead);.
1e580 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 49 4e    IOTRACE(("PGIN
1e590 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
1e5a0 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 50 41 47  r, pgno));.  PAG
1e5b0 45 52 54 52 41 43 45 28 28 22 46 45 54 43 48 20  ERTRACE(("FETCH 
1e5c0 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
1e5d0 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
1e5e0 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
1e5f0 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20  (pPager), pgno, 
1e600 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
1e610 50 67 29 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e  Pg)));..  return
1e620 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70   rc;.}../*.** Up
1e630 64 61 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f  date the value o
1e640 66 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  f the change-cou
1e650 6e 74 65 72 20 61 74 20 6f 66 66 73 65 74 73 20  nter at offsets 
1e660 32 34 20 61 6e 64 20 39 32 20 69 6e 0a 2a 2a 20  24 and 92 in.** 
1e670 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 74  the header and t
1e680 68 65 20 73 71 6c 69 74 65 20 76 65 72 73 69 6f  he sqlite versio
1e690 6e 20 6e 75 6d 62 65 72 20 61 74 20 6f 66 66 73  n number at offs
1e6a0 65 74 20 39 36 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  et 96..**.** Thi
1e6b0 73 20 69 73 20 61 6e 20 75 6e 63 6f 6e 64 69 74  s is an uncondit
1e6c0 69 6f 6e 61 6c 20 75 70 64 61 74 65 2e 20 20 53  ional update.  S
1e6d0 65 65 20 61 6c 73 6f 20 74 68 65 20 70 61 67 65  ee also the page
1e6e0 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
1e6f0 6e 74 65 72 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  nter().** routin
1e700 65 20 77 68 69 63 68 20 6f 6e 6c 79 20 75 70 64  e which only upd
1e710 61 74 65 73 20 74 68 65 20 63 68 61 6e 67 65 2d  ates the change-
1e720 63 6f 75 6e 74 65 72 20 69 66 20 74 68 65 20 75  counter if the u
1e730 70 64 61 74 65 20 69 73 20 61 63 74 75 61 6c 6c  pdate is actuall
1e740 79 0a 2a 2a 20 6e 65 65 64 65 64 2c 20 61 73 20  y.** needed, as 
1e750 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
1e760 65 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65  e pPager->change
1e770 43 6f 75 6e 74 44 6f 6e 65 20 73 74 61 74 65 20  CountDone state 
1e780 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  variable..*/.sta
1e790 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 77  tic void pager_w
1e7a0 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74  rite_changecount
1e7b0 65 72 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  er(PgHdr *pPg){.
1e7c0 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75    u32 change_cou
1e7d0 6e 74 65 72 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72  nter;..  /* Incr
1e7e0 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20  ement the value 
1e7f0 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20 77 72  just read and wr
1e800 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62  ite it back to b
1e810 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 63 68 61  yte 24. */.  cha
1e820 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71  nge_counter = sq
1e830 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 28 75  lite3Get4byte((u
1e840 38 2a 29 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  8*)pPg->pPager->
1e850 64 62 46 69 6c 65 56 65 72 73 29 2b 31 3b 0a 20  dbFileVers)+1;. 
1e860 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61   put32bits(((cha
1e870 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 32  r*)pPg->pData)+2
1e880 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  4, change_counte
1e890 72 29 3b 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 73  r);..  /* Also s
1e8a0 74 6f 72 65 20 74 68 65 20 53 51 4c 69 74 65 20  tore the SQLite 
1e8b0 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 69  version number i
1e8c0 6e 20 62 79 74 65 73 20 39 36 2e 2e 39 39 20 61  n bytes 96..99 a
1e8d0 6e 64 20 69 6e 0a 20 20 2a 2a 20 62 79 74 65 73  nd in.  ** bytes
1e8e0 20 39 32 2e 2e 39 35 20 73 74 6f 72 65 20 74 68   92..95 store th
1e8f0 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
1e900 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 76   for which the v
1e910 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 0a 20 20  ersion number.  
1e920 2a 2a 20 69 73 20 76 61 6c 69 64 2e 20 2a 2f 0a  ** is valid. */.
1e930 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68    put32bits(((ch
1e940 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b  ar*)pPg->pData)+
1e950 39 32 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  92, change_count
1e960 65 72 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73  er);.  put32bits
1e970 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44  (((char*)pPg->pD
1e980 61 74 61 29 2b 39 36 2c 20 53 51 4c 49 54 45 5f  ata)+96, SQLITE_
1e990 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 29 3b  VERSION_NUMBER);
1e9a0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
1e9b0 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a  TE_OMIT_WAL./*.*
1e9c0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1e9d0 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20  is invoked once 
1e9e0 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 74 68  for each page th
1e9f0 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  at has already b
1ea00 65 65 6e 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20  een .** written 
1ea10 69 6e 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c  into the log fil
1ea20 65 20 77 68 65 6e 20 61 20 57 41 4c 20 74 72 61  e when a WAL tra
1ea30 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
1ea40 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 50 61 72 61  ed back..** Para
1ea50 6d 65 74 65 72 20 69 50 67 20 69 73 20 74 68 65  meter iPg is the
1ea60 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
1ea70 73 61 69 64 20 70 61 67 65 2e 20 54 68 65 20 70  said page. The p
1ea80 43 74 78 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a  Ctx argument .**
1ea90 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 70   is actually a p
1eaa0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61  ointer to the Pa
1eab0 67 65 72 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ger structure..*
1eac0 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 69 50 67  *.** If page iPg
1ead0 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74   is present in t
1eae0 68 65 20 63 61 63 68 65 2c 20 61 6e 64 20 68 61  he cache, and ha
1eaf0 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  s no outstanding
1eb00 20 72 65 66 65 72 65 6e 63 65 73 2c 0a 2a 2a 20   references,.** 
1eb10 69 74 20 69 73 20 64 69 73 63 61 72 64 65 64 2e  it is discarded.
1eb20 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
1eb30 68 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20  here are one or 
1eb40 6d 6f 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67  more outstanding
1eb50 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2c 20  .** references, 
1eb60 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
1eb70 20 69 73 20 72 65 6c 6f 61 64 65 64 20 66 72 6f   is reloaded fro
1eb80 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
1eb90 49 66 20 74 68 65 0a 2a 2a 20 61 74 74 65 6d 70  If the.** attemp
1eba0 74 20 74 6f 20 72 65 6c 6f 61 64 20 63 6f 6e 74  t to reload cont
1ebb0 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ent from the dat
1ebc0 61 62 61 73 65 20 69 73 20 72 65 71 75 69 72 65  abase is require
1ebd0 64 20 61 6e 64 20 66 61 69 6c 73 2c 20 0a 2a 2a  d and fails, .**
1ebe0 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74   return an SQLit
1ebf0 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74  e error code. Ot
1ec00 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
1ec10 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
1ec20 74 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62  t pagerUndoCallb
1ec30 61 63 6b 28 76 6f 69 64 20 2a 70 43 74 78 2c 20  ack(void *pCtx, 
1ec40 50 67 6e 6f 20 69 50 67 29 7b 0a 20 20 69 6e 74  Pgno iPg){.  int
1ec50 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1ec60 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1ec70 20 3d 20 28 50 61 67 65 72 20 2a 29 70 43 74 78   = (Pager *)pCtx
1ec80 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  ;.  PgHdr *pPg;.
1ec90 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72  .  assert( pager
1eca0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
1ecb0 3b 0a 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65  ;.  pPg = sqlite
1ecc0 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61  3PagerLookup(pPa
1ecd0 67 65 72 2c 20 69 50 67 29 3b 0a 20 20 69 66 28  ger, iPg);.  if(
1ece0 20 70 50 67 20 29 7b 0a 20 20 20 20 69 66 28 20   pPg ){.    if( 
1ecf0 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67  sqlite3PcachePag
1ed00 65 52 65 66 63 6f 75 6e 74 28 70 50 67 29 3d 3d  eRefcount(pPg)==
1ed10 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 ){.      sqlit
1ed20 65 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67  e3PcacheDrop(pPg
1ed30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1ed40 20 20 20 20 75 33 32 20 69 46 72 61 6d 65 20 3d      u32 iFrame =
1ed50 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   0;.      rc = s
1ed60 71 6c 69 74 65 33 57 61 6c 46 69 6e 64 46 72 61  qlite3WalFindFra
1ed70 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  me(pPager->pWal,
1ed80 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 26 69 46 72   pPg->pgno, &iFr
1ed90 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
1eda0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1edb0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65  .        rc = re
1edc0 61 64 44 62 50 61 67 65 28 70 50 67 2c 20 69 46  adDbPage(pPg, iF
1edd0 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rame);.      }. 
1ede0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1edf0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1ee00 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
1ee10 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ter(pPg);.      
1ee20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  }.      sqlite3P
1ee30 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c  agerUnrefNotNull
1ee40 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pPg);.    }.  }
1ee50 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  ..  /* Normally,
1ee60 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   if a transactio
1ee70 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
1ee80 2c 20 61 6e 79 20 62 61 63 6b 75 70 20 70 72 6f  , any backup pro
1ee90 63 65 73 73 65 73 20 61 72 65 0a 20 20 2a 2a 20  cesses are.  ** 
1eea0 75 70 64 61 74 65 64 20 61 73 20 64 61 74 61 20  updated as data 
1eeb0 69 73 20 63 6f 70 69 65 64 20 6f 75 74 20 6f 66  is copied out of
1eec0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
1eed0 75 72 6e 61 6c 20 61 6e 64 20 69 6e 74 6f 20 74  urnal and into t
1eee0 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
1eef0 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 67 65  . This is not ge
1ef00 6e 65 72 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65  nerally possible
1ef10 20 77 69 74 68 20 61 20 57 41 4c 20 64 61 74 61   with a WAL data
1ef20 62 61 73 65 2c 20 61 73 0a 20 20 2a 2a 20 72 6f  base, as.  ** ro
1ef30 6c 6c 62 61 63 6b 20 69 6e 76 6f 6c 76 65 73 20  llback involves 
1ef40 73 69 6d 70 6c 79 20 74 72 75 6e 63 61 74 69 6e  simply truncatin
1ef50 67 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20  g the log file. 
1ef60 54 68 65 72 65 66 6f 72 65 2c 20 69 66 20 6f 6e  Therefore, if on
1ef70 65 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72 65 20 66  e.  ** or more f
1ef80 72 61 6d 65 73 20 68 61 76 65 20 61 6c 72 65 61  rames have alrea
1ef90 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  dy been written 
1efa0 74 6f 20 74 68 65 20 6c 6f 67 20 28 61 6e 64 20  to the log (and 
1efb0 74 68 65 72 65 66 6f 72 65 20 0a 20 20 2a 2a 20  therefore .  ** 
1efc0 61 6c 73 6f 20 63 6f 70 69 65 64 20 69 6e 74 6f  also copied into
1efd0 20 74 68 65 20 62 61 63 6b 75 70 20 64 61 74 61   the backup data
1efe0 62 61 73 65 73 29 20 61 73 20 70 61 72 74 20 6f  bases) as part o
1eff0 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  f this transacti
1f000 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65 20 62 61 63  on,.  ** the bac
1f010 6b 75 70 73 20 6d 75 73 74 20 62 65 20 72 65 73  kups must be res
1f020 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 73  tarted..  */.  s
1f030 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74  qlite3BackupRest
1f040 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63  art(pPager->pBac
1f050 6b 75 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  kup);..  return 
1f060 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
1f070 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1f080 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  lled to rollback
1f090 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f   a transaction o
1f0a0 6e 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65  n a WAL database
1f0b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1f0c0 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c  pagerRollbackWal
1f0d0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1f0e0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1f0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f100 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
1f110 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c  e */.  PgHdr *pL
1f120 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
1f130 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
1f140 66 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f  f dirty pages to
1f150 20 72 65 76 65 72 74 20 2a 2f 0a 0a 20 20 2f 2a   revert */..  /*
1f160 20 46 6f 72 20 61 6c 6c 20 70 61 67 65 73 20 69   For all pages i
1f170 6e 20 74 68 65 20 63 61 63 68 65 20 74 68 61 74  n the cache that
1f180 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 64   are currently d
1f190 69 72 74 79 20 6f 72 20 68 61 76 65 20 61 6c 72  irty or have alr
1f1a0 65 61 64 79 0a 20 20 2a 2a 20 62 65 65 6e 20 77  eady.  ** been w
1f1b0 72 69 74 74 65 6e 20 28 62 75 74 20 6e 6f 74 20  ritten (but not 
1f1c0 63 6f 6d 6d 69 74 74 65 64 29 20 74 6f 20 74 68  committed) to th
1f1d0 65 20 6c 6f 67 20 66 69 6c 65 2c 20 64 6f 20 6f  e log file, do o
1f1e0 6e 65 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20  ne of the .  ** 
1f1f0 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a  following:.  **.
1f200 20 20 2a 2a 20 20 20 2b 20 44 69 73 63 61 72 64    **   + Discard
1f210 20 74 68 65 20 63 61 63 68 65 64 20 70 61 67 65   the cached page
1f220 20 28 69 66 20 72 65 66 63 6f 75 6e 74 3d 3d 30   (if refcount==0
1f230 29 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 2b 20 52  ), or.  **   + R
1f240 65 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e 74 65  eload page conte
1f250 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  nt from the data
1f260 62 61 73 65 20 28 69 66 20 72 65 66 63 6f 75 6e  base (if refcoun
1f270 74 3e 30 29 2e 0a 20 20 2a 2f 0a 20 20 70 50 61  t>0)..  */.  pPa
1f280 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
1f290 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
1f2a0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1f2b0 57 61 6c 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e  WalUndo(pPager->
1f2c0 70 57 61 6c 2c 20 70 61 67 65 72 55 6e 64 6f 43  pWal, pagerUndoC
1f2d0 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a  allback, (void *
1f2e0 29 70 50 61 67 65 72 29 3b 0a 20 20 70 4c 69 73  )pPager);.  pLis
1f2f0 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  t = sqlite3Pcach
1f300 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65  eDirtyList(pPage
1f310 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 23 69  r->pPCache);..#i
1f320 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1f330 54 5f 43 4f 4e 43 55 52 52 45 4e 54 0a 20 20 2f  T_CONCURRENT.  /
1f340 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
1f350 43 4f 4e 43 55 52 52 45 4e 54 20 74 72 61 6e 73  CONCURRENT trans
1f360 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 70 61 67  action, then pag
1f370 65 20 31 20 6d 75 73 74 20 62 65 20 72 65 72 65  e 1 must be rere
1f380 61 64 20 66 72 6f 6d 20 0a 20 20 2a 2a 20 74 68  ad from .  ** th
1f390 65 20 64 62 20 66 69 6c 65 2c 20 65 76 65 6e 20  e db file, even 
1f3a0 69 66 20 69 74 20 69 73 20 6e 6f 74 20 64 69 72  if it is not dir
1f3b0 74 79 2e 20 54 68 69 73 20 69 73 20 62 65 63 61  ty. This is beca
1f3c0 75 73 65 20 74 68 65 20 62 2d 74 72 65 65 20 6c  use the b-tree l
1f3d0 61 79 65 72 20 0a 20 20 2a 2a 20 6d 61 79 20 68  ayer .  ** may h
1f3e0 61 76 65 20 61 6c 72 65 61 64 79 20 7a 65 72 6f  ave already zero
1f3f0 65 64 20 74 68 65 20 6e 46 72 65 65 20 61 6e 64  ed the nFree and
1f400 20 69 54 72 75 6e 6b 20 68 65 61 64 65 72 20 66   iTrunk header f
1f410 69 65 6c 64 73 2e 20 20 2a 2f 0a 20 20 69 66 28  ields.  */.  if(
1f420 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1f430 26 20 28 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  & (pList==0 || p
1f440 4c 69 73 74 2d 3e 70 67 6e 6f 21 3d 31 29 20 26  List->pgno!=1) &
1f450 26 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 52 65  & pPager->pAllRe
1f460 61 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  ad ){.    rc = p
1f470 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b  agerUndoCallback
1f480 28 28 76 6f 69 64 2a 29 70 50 61 67 65 72 2c 20  ((void*)pPager, 
1f490 31 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  1);.  }.#endif..
1f4a0 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 26    while( pList &
1f4b0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
1f4c0 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 4e  ){.    PgHdr *pN
1f4d0 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69  ext = pList->pDi
1f4e0 72 74 79 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  rty;.    rc = pa
1f4f0 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28  gerUndoCallback(
1f500 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20  (void *)pPager, 
1f510 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pList->pgno);.  
1f520 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b    pList = pNext;
1f530 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
1f540 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
1f550 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 77   function is a w
1f560 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71  rapper around sq
1f570 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28 29  lite3WalFrames()
1f580 2e 20 41 73 20 77 65 6c 6c 20 61 73 20 6c 6f 67  . As well as log
1f590 67 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  ging.** the cont
1f5a0 65 6e 74 73 20 6f 66 20 74 68 65 20 6c 69 73 74  ents of the list
1f5b0 20 6f 66 20 70 61 67 65 73 20 68 65 61 64 65 64   of pages headed
1f5c0 20 62 79 20 70 4c 69 73 74 20 28 63 6f 6e 6e 65   by pList (conne
1f5d0 63 74 65 64 20 62 79 20 70 44 69 72 74 79 29 2c  cted by pDirty),
1f5e0 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
1f5f0 6e 20 6e 6f 74 69 66 69 65 73 20 61 6e 79 20 61  n notifies any a
1f600 63 74 69 76 65 20 62 61 63 6b 75 70 20 70 72 6f  ctive backup pro
1f610 63 65 73 73 65 73 20 74 68 61 74 20 74 68 65 20  cesses that the 
1f620 70 61 67 65 73 20 68 61 76 65 0a 2a 2a 20 63 68  pages have.** ch
1f630 61 6e 67 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  anged. .**.** Th
1f640 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  e list of pages 
1f650 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68 69 73  passed into this
1f660 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6c 77 61   routine is alwa
1f670 79 73 20 73 6f 72 74 65 64 20 62 79 20 70 61 67  ys sorted by pag
1f680 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 48 65 6e  e number..** Hen
1f690 63 65 2c 20 69 66 20 70 61 67 65 20 31 20 61 70  ce, if page 1 ap
1f6a0 70 65 61 72 73 20 61 6e 79 77 68 65 72 65 20 6f  pears anywhere o
1f6b0 6e 20 74 68 65 20 6c 69 73 74 2c 20 69 74 20 77  n the list, it w
1f6c0 69 6c 6c 20 62 65 20 74 68 65 20 66 69 72 73 74  ill be the first
1f6d0 20 70 61 67 65 2e 0a 2a 2f 20 0a 73 74 61 74 69   page..*/ .stati
1f6e0 63 20 69 6e 74 20 70 61 67 65 72 57 61 6c 46 72  c int pagerWalFr
1f6f0 61 6d 65 73 28 0a 20 20 50 61 67 65 72 20 2a 70  ames(.  Pager *p
1f700 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
1f710 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
1f720 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67 48   object */.  PgH
1f730 64 72 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  dr *pList,      
1f740 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f750 4c 69 73 74 20 6f 66 20 66 72 61 6d 65 73 20 74  List of frames t
1f760 6f 20 6c 6f 67 20 2a 2f 0a 20 20 50 67 6e 6f 20  o log */.  Pgno 
1f770 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20  nTruncate,      
1f780 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
1f790 74 61 62 61 73 65 20 73 69 7a 65 20 61 66 74 65  tabase size afte
1f7a0 72 20 74 68 69 73 20 63 6f 6d 6d 69 74 20 2a 2f  r this commit */
1f7b0 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20  .  int isCommit 
1f7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7d0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
1f7e0 69 73 20 69 73 20 61 20 63 6f 6d 6d 69 74 20 2a  is is a commit *
1f7f0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
1f800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f810 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1f820 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   code */.  int n
1f830 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
1f840 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1f850 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
1f860 20 70 4c 69 73 74 20 2a 2f 0a 20 20 50 67 48 64   pList */.  PgHd
1f870 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  r *p;           
1f880 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1f890 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
1f8a0 70 61 67 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65  pages */..  asse
1f8b0 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c  rt( pPager->pWal
1f8c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c   );.  assert( pL
1f8d0 69 73 74 20 29 3b 0a 23 69 66 64 65 66 20 53 51  ist );.#ifdef SQ
1f8e0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
1f8f0 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
1f900 70 61 67 65 20 6c 69 73 74 20 69 73 20 69 6e 20  page list is in 
1f910 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  accending order 
1f920 2a 2f 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74  */.  for(p=pList
1f930 3b 20 70 20 26 26 20 70 2d 3e 70 44 69 72 74 79  ; p && p->pDirty
1f940 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a  ; p=p->pDirty){.
1f950 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
1f960 67 6e 6f 20 3c 20 70 2d 3e 70 44 69 72 74 79 2d  gno < p->pDirty-
1f970 3e 70 67 6e 6f 20 29 3b 0a 20 20 7d 0a 23 65 6e  >pgno );.  }.#en
1f980 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
1f990 4c 69 73 74 2d 3e 70 44 69 72 74 79 3d 3d 30 20  List->pDirty==0 
1f9a0 7c 7c 20 69 73 43 6f 6d 6d 69 74 20 29 3b 0a 20  || isCommit );. 
1f9b0 20 69 66 28 20 69 73 43 6f 6d 6d 69 74 20 29 7b   if( isCommit ){
1f9c0 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 57 41 4c  .    /* If a WAL
1f9d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1f9e0 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2c  being committed,
1f9f0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69   there is no poi
1fa00 6e 74 20 69 6e 20 77 72 69 74 69 6e 67 0a 20 20  nt in writing.  
1fa10 20 20 2a 2a 20 61 6e 79 20 70 61 67 65 73 20 77    ** any pages w
1fa20 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73  ith page numbers
1fa30 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6e 54   greater than nT
1fa40 72 75 6e 63 61 74 65 20 69 6e 74 6f 20 74 68 65  runcate into the
1fa50 20 57 41 4c 20 66 69 6c 65 2e 0a 20 20 20 20 2a   WAL file..    *
1fa60 2a 20 54 68 65 79 20 77 69 6c 6c 20 6e 65 76 65  * They will neve
1fa70 72 20 62 65 20 72 65 61 64 20 62 79 20 61 6e 79  r be read by any
1fa80 20 63 6c 69 65 6e 74 2e 20 53 6f 20 72 65 6d 6f   client. So remo
1fa90 76 65 20 74 68 65 6d 20 66 72 6f 6d 20 74 68 65  ve them from the
1faa0 20 70 44 69 72 74 79 0a 20 20 20 20 2a 2a 20 6c   pDirty.    ** l
1fab0 69 73 74 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20  ist here. */.   
1fac0 20 50 67 48 64 72 20 2a 2a 70 70 4e 65 78 74 20   PgHdr **ppNext 
1fad0 3d 20 26 70 4c 69 73 74 3b 0a 20 20 20 20 6e 4c  = &pList;.    nL
1fae0 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  ist = 0;.    for
1faf0 28 70 3d 70 4c 69 73 74 3b 20 28 2a 70 70 4e 65  (p=pList; (*ppNe
1fb00 78 74 20 3d 20 70 29 21 3d 30 3b 20 70 3d 70 2d  xt = p)!=0; p=p-
1fb10 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20 20  >pDirty){.      
1fb20 69 66 28 20 70 2d 3e 70 67 6e 6f 3c 3d 6e 54 72  if( p->pgno<=nTr
1fb30 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20 20 20  uncate ){.      
1fb40 20 20 70 70 4e 65 78 74 20 3d 20 26 70 2d 3e 70    ppNext = &p->p
1fb50 44 69 72 74 79 3b 0a 20 20 20 20 20 20 20 20 6e  Dirty;.        n
1fb60 4c 69 73 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  List++;.      }.
1fb70 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1fb80 28 20 70 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c  ( pList );.  }el
1fb90 73 65 7b 0a 20 20 20 20 6e 4c 69 73 74 20 3d 20  se{.    nList = 
1fba0 31 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  1;.  }.  pPager-
1fbb0 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41  >aStat[PAGER_STA
1fbc0 54 5f 57 52 49 54 45 5d 20 2b 3d 20 6e 4c 69 73  T_WRITE] += nLis
1fbd0 74 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 2d  t;..  if( pList-
1fbe0 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72  >pgno==1 ) pager
1fbf0 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75  _write_changecou
1fc00 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a 20 20 72  nter(pList);.  r
1fc10 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 72  c = sqlite3WalFr
1fc20 61 6d 65 73 28 70 50 61 67 65 72 2d 3e 70 57 61  ames(pPager->pWa
1fc30 6c 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65 72  l, .      pPager
1fc40 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 4c 69 73  ->pageSize, pLis
1fc50 74 2c 20 6e 54 72 75 6e 63 61 74 65 2c 20 69 73  t, nTruncate, is
1fc60 43 6f 6d 6d 69 74 2c 20 70 50 61 67 65 72 2d 3e  Commit, pPager->
1fc70 77 61 6c 53 79 6e 63 46 6c 61 67 73 0a 20 20 29  walSyncFlags.  )
1fc80 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1fc90 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
1fca0 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20  >pBackup ){.    
1fcb0 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20  for(p=pList; p; 
1fcc0 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20  p=p->pDirty){.  
1fcd0 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75      sqlite3Backu
1fce0 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e  pUpdate(pPager->
1fcf0 70 42 61 63 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f  pBackup, p->pgno
1fd00 2c 20 28 75 38 20 2a 29 70 2d 3e 70 44 61 74 61  , (u8 *)p->pData
1fd10 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69  );.    }.  }..#i
1fd20 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
1fd30 4b 5f 50 41 47 45 53 0a 20 20 70 4c 69 73 74 20  K_PAGES.  pList 
1fd40 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44  = sqlite3PcacheD
1fd50 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d  irtyList(pPager-
1fd60 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 66 6f 72  >pPCache);.  for
1fd70 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70  (p=pList; p; p=p
1fd80 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 70  ->pDirty){.    p
1fd90 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
1fda0 68 28 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  h(p);.  }.#endif
1fdb0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1fdc0 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20  ../*.** Begin a 
1fdd0 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
1fde0 20 6f 6e 20 74 68 65 20 57 41 4c 2e 0a 2a 2a 0a   on the WAL..**.
1fdf0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1fe00 75 73 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65  used to be calle
1fe10 64 20 22 70 61 67 65 72 4f 70 65 6e 53 6e 61 70  d "pagerOpenSnap
1fe20 73 68 6f 74 28 29 22 20 62 65 63 61 75 73 65 20  shot()" because 
1fe30 69 74 20 65 73 73 65 6e 74 69 61 6c 6c 79 0a 2a  it essentially.*
1fe40 2a 20 6d 61 6b 65 73 20 61 20 73 6e 61 70 73 68  * makes a snapsh
1fe50 6f 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ot of the databa
1fe60 73 65 20 61 74 20 74 68 65 20 63 75 72 72 65 6e  se at the curren
1fe70 74 20 70 6f 69 6e 74 20 69 6e 20 74 69 6d 65 20  t point in time 
1fe80 61 6e 64 20 70 72 65 73 65 72 76 65 73 0a 2a 2a  and preserves.**
1fe90 20 74 68 61 74 20 73 6e 61 70 73 68 6f 74 20 66   that snapshot f
1fea0 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 72 65  or use by the re
1feb0 61 64 65 72 20 69 6e 20 73 70 69 74 65 20 6f 66  ader in spite of
1fec0 20 63 6f 6e 63 75 72 72 65 6e 74 6c 79 20 63 68   concurrently ch
1fed0 61 6e 67 65 73 20 62 79 0a 2a 2a 20 6f 74 68 65  anges by.** othe
1fee0 72 20 77 72 69 74 65 72 73 20 6f 72 20 63 68 65  r writers or che
1fef0 63 6b 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73  ckpointers..*/.s
1ff00 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 42  tatic int pagerB
1ff10 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74  eginReadTransact
1ff20 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  ion(Pager *pPage
1ff30 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
1ff40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff50 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1ff60 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63 68  code */.  int ch
1ff70 61 6e 67 65 64 20 3d 20 30 3b 20 20 20 20 20 20  anged = 0;      
1ff80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1ff90 65 20 69 66 20 63 61 63 68 65 20 6d 75 73 74 20  e if cache must 
1ffa0 62 65 20 72 65 73 65 74 20 2a 2f 0a 0a 20 20 61  be reset */..  a
1ffb0 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57  ssert( pagerUseW
1ffc0 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
1ffd0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1ffe0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
1fff0 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  EN || pPager->eS
20000 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
20010 45 52 20 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69  ER );..  /* sqli
20020 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61  te3WalEndReadTra
20030 6e 73 61 63 74 69 6f 6e 28 29 20 77 61 73 20 6e  nsaction() was n
20040 6f 74 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68  ot called for th
20050 65 20 70 72 65 76 69 6f 75 73 0a 20 20 2a 2a 20  e previous.  ** 
20060 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 6c  transaction in l
20070 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c  ocking_mode=EXCL
20080 55 53 49 56 45 2e 20 20 53 6f 20 63 61 6c 6c 20  USIVE.  So call 
20090 69 74 20 6e 6f 77 2e 20 20 49 66 20 77 65 0a 20  it now.  If we. 
200a0 20 2a 2a 20 61 72 65 20 69 6e 20 6c 6f 63 6b 69   ** are in locki
200b0 6e 67 5f 6d 6f 64 65 3d 4e 4f 52 4d 41 4c 20 61  ng_mode=NORMAL a
200c0 6e 64 20 45 6e 64 52 65 61 64 28 29 20 77 61 73  nd EndRead() was
200d0 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c   previously call
200e0 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20 64 75 70  ed,.  ** the dup
200f0 6c 69 63 61 74 65 20 63 61 6c 6c 20 69 73 20 68  licate call is h
20100 61 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  armless..  */.  
20110 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61  sqlite3WalEndRea
20120 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  dTransaction(pPa
20130 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 72  ger->pWal);..  r
20140 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65  c = sqlite3WalBe
20150 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69  ginReadTransacti
20160 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  on(pPager->pWal,
20170 20 26 63 68 61 6e 67 65 64 29 3b 0a 20 20 69 66   &changed);.  if
20180 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
20190 7c 7c 20 63 68 61 6e 67 65 64 20 29 7b 0a 20 20  || changed ){.  
201a0 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
201b0 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 55  ager);.    if( U
201c0 53 45 46 45 54 43 48 28 70 50 61 67 65 72 29 20  SEFETCH(pPager) 
201d0 29 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74  ) sqlite3OsUnfet
201e0 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30  ch(pPager->fd, 0
201f0 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  , 0);.  }..  ret
20200 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
20210 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
20220 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
20230 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 74  as part of the t
20240 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 50  ransition from P
20250 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 74 6f 20  AGER_OPEN.** to 
20260 50 41 47 45 52 5f 52 45 41 44 45 52 20 73 74 61  PAGER_READER sta
20270 74 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  te to determine 
20280 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
20290 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a  database file.**
202a0 20 69 6e 20 70 61 67 65 73 20 28 61 73 73 75 6d   in pages (assum
202b0 69 6e 67 20 74 68 65 20 70 61 67 65 20 73 69 7a  ing the page siz
202c0 65 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72  e currently stor
202d0 65 64 20 69 6e 20 50 61 67 65 72 2e 70 61 67 65  ed in Pager.page
202e0 53 69 7a 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  Size)..**.** If 
202f0 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
20300 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
20310 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 73  turned and the s
20320 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
20330 61 73 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20  ase.** in pages 
20340 69 73 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 6e  is stored in *pn
20350 50 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  Page. Otherwise,
20360 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28   an error code (
20370 70 65 72 68 61 70 73 0a 2a 2a 20 53 51 4c 49 54  perhaps.** SQLIT
20380 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 29 20 69  E_IOERR_FSTAT) i
20390 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
203a0 70 6e 50 61 67 65 20 69 73 20 6c 65 66 74 20 75  pnPage is left u
203b0 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 73 74  nmodified..*/.st
203c0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 61  atic int pagerPa
203d0 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  gecount(Pager *p
203e0 50 61 67 65 72 2c 20 50 67 6e 6f 20 2a 70 6e 50  Pager, Pgno *pnP
203f0 61 67 65 29 7b 0a 20 20 50 67 6e 6f 20 6e 50 61  age){.  Pgno nPa
20400 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
20410 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
20420 20 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20 2a   to return via *
20430 70 6e 50 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20  pnPage */..  /* 
20440 51 75 65 72 79 20 74 68 65 20 57 41 4c 20 73 75  Query the WAL su
20450 62 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65  b-system for the
20460 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 2e 20   database size. 
20470 54 68 65 20 57 61 6c 44 62 73 69 7a 65 28 29 0a  The WalDbsize().
20480 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65    ** function re
20490 74 75 72 6e 73 20 7a 65 72 6f 20 69 66 20 74 68  turns zero if th
204a0 65 20 57 41 4c 20 69 73 20 6e 6f 74 20 6f 70 65  e WAL is not ope
204b0 6e 20 28 69 2e 65 2e 20 50 61 67 65 72 2e 70 57  n (i.e. Pager.pW
204c0 61 6c 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20  al==0), or.  ** 
204d0 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
204e0 73 69 7a 65 20 69 73 20 6e 6f 74 20 61 76 61 69  size is not avai
204f0 6c 61 62 6c 65 2e 20 54 68 65 20 64 61 74 61 62  lable. The datab
20500 61 73 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a  ase size is not.
20510 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66    ** available f
20520 72 6f 6d 20 74 68 65 20 57 41 4c 20 73 75 62 2d  rom the WAL sub-
20530 73 79 73 74 65 6d 20 69 66 20 74 68 65 20 6c 6f  system if the lo
20540 67 20 66 69 6c 65 20 69 73 20 65 6d 70 74 79 20  g file is empty 
20550 6f 72 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73  or.  ** contains
20560 20 6e 6f 20 76 61 6c 69 64 20 63 6f 6d 6d 69 74   no valid commit
20570 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ted transactions
20580 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
20590 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
205a0 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20  =PAGER_OPEN );. 
205b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
205c0 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c  >eLock>=SHARED_L
205d0 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
205e0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
205f0 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fd) );.  assert(
20600 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
20610 65 3d 3d 30 20 29 3b 0a 20 20 6e 50 61 67 65 20  e==0 );.  nPage 
20620 3d 20 73 71 6c 69 74 65 33 57 61 6c 44 62 73 69  = sqlite3WalDbsi
20630 7a 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29  ze(pPager->pWal)
20640 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e  ;..  /* If the n
20650 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
20660 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
20670 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  s not available 
20680 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 57 41  from the.  ** WA
20690 4c 20 73 75 62 2d 73 79 73 74 65 6d 2c 20 64 65  L sub-system, de
206a0 74 65 72 6d 69 6e 65 20 74 68 65 20 70 61 67 65  termine the page
206b0 20 63 6f 75 6e 74 65 20 62 61 73 65 64 20 6f 6e   counte based on
206c0 20 74 68 65 20 73 69 7a 65 20 6f 66 0a 20 20 2a   the size of.  *
206d0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
206e0 69 6c 65 2e 20 20 49 66 20 74 68 65 20 73 69 7a  ile.  If the siz
206f0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
20700 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 6e  e file is not an
20710 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 6d 75  .  ** integer mu
20720 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61  ltiple of the pa
20730 67 65 2d 73 69 7a 65 2c 20 72 6f 75 6e 64 20 75  ge-size, round u
20740 70 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20  p the result..  
20750 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d  */.  if( nPage==
20760 30 20 26 26 20 41 4c 57 41 59 53 28 69 73 4f 70  0 && ALWAYS(isOp
20770 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 29 20  en(pPager->fd)) 
20780 29 7b 0a 20 20 20 20 69 36 34 20 6e 20 3d 20 30  ){.    i64 n = 0
20790 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
207a0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
207b0 64 62 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  db file in bytes
207c0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   */.    int rc =
207d0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
207e0 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
207f0 6e 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  n);.    if( rc!=
20800 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20810 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
20820 20 20 7d 0a 20 20 20 20 6e 50 61 67 65 20 3d 20    }.    nPage = 
20830 28 50 67 6e 6f 29 28 28 6e 2b 70 50 61 67 65 72  (Pgno)((n+pPager
20840 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 20 2f 20  ->pageSize-1) / 
20850 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
20860 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
20870 74 68 65 20 63 75 72 72 65 6e 74 20 6e 75 6d 62  the current numb
20880 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
20890 68 65 20 66 69 6c 65 20 69 73 20 67 72 65 61 74  he file is great
208a0 65 72 20 74 68 61 6e 20 74 68 65 0a 20 20 2a 2a  er than the.  **
208b0 20 63 6f 6e 66 69 67 75 72 65 64 20 6d 61 78 69   configured maxi
208c0 6d 75 6d 20 70 61 67 65 72 20 6e 75 6d 62 65 72  mum pager number
208d0 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 61  , increase the a
208e0 6c 6c 6f 77 65 64 20 6c 69 6d 69 74 20 73 6f 0a  llowed limit so.
208f0 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 66 69    ** that the fi
20900 6c 65 20 63 61 6e 20 62 65 20 72 65 61 64 2e 0a  le can be read..
20910 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65    */.  if( nPage
20920 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20  >pPager->mxPgno 
20930 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  ){.    pPager->m
20940 78 50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e 50  xPgno = (Pgno)nP
20950 61 67 65 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6e 50  age;.  }..  *pnP
20960 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72  age = nPage;.  r
20970 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
20980 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
20990 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a  TE_OMIT_WAL./*.*
209a0 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 2a  * Check if the *
209b0 2d 77 61 6c 20 66 69 6c 65 20 74 68 61 74 20 63  -wal file that c
209c0 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68  orresponds to th
209d0 65 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65  e database opene
209e0 64 20 62 79 20 70 50 61 67 65 72 0a 2a 2a 20 65  d by pPager.** e
209f0 78 69 73 74 73 20 69 66 20 74 68 65 20 64 61 74  xists if the dat
20a00 61 62 61 73 65 20 69 73 20 6e 6f 74 20 65 6d 70  abase is not emp
20a10 79 2c 20 6f 72 20 76 65 72 69 66 79 20 74 68 61  y, or verify tha
20a20 74 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65  t the *-wal file
20a30 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 69   does.** not exi
20a40 73 74 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20  st (by deleting 
20a50 69 74 29 20 69 66 20 74 68 65 20 64 61 74 61 62  it) if the datab
20a60 61 73 65 20 66 69 6c 65 20 69 73 20 65 6d 70 74  ase file is empt
20a70 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  y..**.** If the 
20a80 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  database is not 
20a90 65 6d 70 74 79 20 61 6e 64 20 74 68 65 20 2a 2d  empty and the *-
20aa0 77 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c  wal file exists,
20ab0 20 6f 70 65 6e 20 74 68 65 20 70 61 67 65 72 0a   open the pager.
20ac0 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20  ** in WAL mode. 
20ad0 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
20ae0 20 69 73 20 65 6d 70 74 79 20 6f 72 20 69 66 20   is empty or if 
20af0 6e 6f 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78  no *-wal file ex
20b00 69 73 74 73 20 61 6e 64 0a 2a 2a 20 69 66 20 6e  ists and.** if n
20b10 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
20b20 6d 61 6b 65 20 73 75 72 65 20 50 61 67 65 72 2e  make sure Pager.
20b30 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 20 6e  journalMode is n
20b40 6f 74 20 73 65 74 20 74 6f 0a 2a 2a 20 50 41 47  ot set to.** PAG
20b50 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
20b60 41 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  AL..**.** Return
20b70 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 61 6e   SQLITE_OK or an
20b80 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a   error code..**.
20b90 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
20ba0 73 74 20 68 6f 6c 64 20 61 20 53 48 41 52 45 44  st hold a SHARED
20bb0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
20bc0 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 61  abase file to ca
20bd0 6c 6c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  ll this.** funct
20be0 69 6f 6e 2e 20 42 65 63 61 75 73 65 20 61 6e 20  ion. Because an 
20bf0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
20c00 6e 20 74 68 65 20 64 62 20 66 69 6c 65 20 69 73  n the db file is
20c10 20 72 65 71 75 69 72 65 64 20 74 6f 20 64 65 6c   required to del
20c20 65 74 65 20 0a 2a 2a 20 61 20 57 41 4c 20 6f 6e  ete .** a WAL on
20c30 20 61 20 6e 6f 6e 65 2d 65 6d 70 74 79 20 64 61   a none-empty da
20c40 74 61 62 61 73 65 2c 20 74 68 69 73 20 65 6e 73  tabase, this ens
20c50 75 72 65 73 20 74 68 65 72 65 20 69 73 20 6e 6f  ures there is no
20c60 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20   race condition 
20c70 0a 2a 2a 20 62 65 74 77 65 65 6e 20 74 68 65 20  .** between the 
20c80 78 41 63 63 65 73 73 28 29 20 62 65 6c 6f 77 20  xAccess() below 
20c90 61 6e 64 20 61 6e 20 78 44 65 6c 65 74 65 28 29  and an xDelete()
20ca0 20 62 65 69 6e 67 20 65 78 65 63 75 74 65 64 20   being executed 
20cb0 62 79 20 73 6f 6d 65 20 0a 2a 2a 20 6f 74 68 65  by some .** othe
20cc0 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  r connection..*/
20cd0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
20ce0 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e  rOpenWalIfPresen
20cf0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
20d00 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
20d10 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
20d20 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
20d30 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  ==PAGER_OPEN );.
20d40 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
20d50 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f  ->eLock>=SHARED_
20d60 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 21  LOCK );..  if( !
20d70 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
20d80 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 73 57 61   ){.    int isWa
20d90 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
20da0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
20db0 20 57 41 4c 20 66 69 6c 65 20 65 78 69 73 74 73   WAL file exists
20dc0 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61   */.    Pgno nPa
20dd0 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
20de0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
20df0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
20e00 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 63 20 3d 20  le */..    rc = 
20e10 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
20e20 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
20e30 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
20e40 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20  urn rc;.    if( 
20e50 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nPage==0 ){.    
20e60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
20e70 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70  Delete(pPager->p
20e80 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61  Vfs, pPager->zWa
20e90 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  l, 0);.      if(
20ea0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
20eb0 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 20 29  R_DELETE_NOENT )
20ec0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
20ed0 0a 20 20 20 20 20 20 69 73 57 61 6c 20 3d 20 30  .      isWal = 0
20ee0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
20ef0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
20f00 73 41 63 63 65 73 73 28 0a 20 20 20 20 20 20 20  sAccess(.       
20f10 20 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2c     pPager->pVfs,
20f20 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 53   pPager->zWal, S
20f30 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
20f40 53 54 53 2c 20 26 69 73 57 61 6c 0a 20 20 20 20  STS, &isWal.    
20f50 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69    );.    }.    i
20f60 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
20f70 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73   ){.      if( is
20f80 57 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 74  Wal ){.        t
20f90 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33  estcase( sqlite3
20fa0 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28  PcachePagecount(
20fb0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
20fc0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  ==0 );.        r
20fd0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
20fe0 4f 70 65 6e 57 61 6c 28 70 50 61 67 65 72 2c 20  OpenWal(pPager, 
20ff0 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  0);.      }else 
21000 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
21010 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
21020 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29  OURNALMODE_WAL )
21030 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
21040 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20  ->journalMode = 
21050 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
21060 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 20 20  E_DELETE;.      
21070 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
21080 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
21090 66 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63  f../*.** Playbac
210a0 6b 20 73 61 76 65 70 6f 69 6e 74 20 70 53 61 76  k savepoint pSav
210b0 65 70 6f 69 6e 74 2e 20 4f 72 2c 20 69 66 20 70  epoint. Or, if p
210c0 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c  Savepoint==NULL,
210d0 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 0a 2a   then playback.*
210e0 2a 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73  * the entire mas
210f0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
21100 2e 20 54 68 65 20 63 61 73 65 20 70 53 61 76 65  . The case pSave
21110 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75  point==NULL occu
21120 72 73 20 77 68 65 6e 20 0a 2a 2a 20 61 20 52 4f  rs when .** a RO
21130 4c 4c 42 41 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e  LLBACK TO comman
21140 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20  d is invoked on 
21150 61 20 53 41 56 45 50 4f 49 4e 54 20 74 68 61 74  a SAVEPOINT that
21160 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f   is a transactio
21170 6e 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e  n .** savepoint.
21180 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 53 61 76  .**.** When pSav
21190 65 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 4e 55  epoint is not NU
211a0 4c 4c 20 28 6d 65 61 6e 69 6e 67 20 61 20 6e 6f  LL (meaning a no
211b0 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61  n-transaction sa
211c0 76 65 70 6f 69 6e 74 20 69 73 20 0a 2a 2a 20 62  vepoint is .** b
211d0 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
211e0 29 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c  ), then the roll
211f0 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66  back consists of
21200 20 75 70 20 74 6f 20 74 68 72 65 65 20 73 74 61   up to three sta
21210 67 65 73 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d 65  ges,.** performe
21220 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 73  d in the order s
21230 70 65 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20  pecified:.**.** 
21240 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 70 6c    * Pages are pl
21250 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74  ayed back from t
21260 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
21270 73 74 61 72 74 69 6e 67 20 61 74 20 62 79 74 65  starting at byte
21280 0a 2a 2a 20 20 20 20 20 6f 66 66 73 65 74 20 50  .**     offset P
21290 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f  agerSavepoint.iO
212a0 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e  ffset and contin
212b0 75 69 6e 67 20 74 6f 20 0a 2a 2a 20 20 20 20 20  uing to .**     
212c0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
212d0 48 64 72 4f 66 66 73 65 74 2c 20 6f 72 20 74 6f  HdrOffset, or to
212e0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
212f0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  main journal.** 
21300 20 20 20 20 66 69 6c 65 20 69 66 20 50 61 67 65      file if Page
21310 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
21320 66 66 73 65 74 20 69 73 20 7a 65 72 6f 2e 0a 2a  ffset is zero..*
21330 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 50 61 67 65  *.**   * If Page
21340 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
21350 66 66 73 65 74 20 69 73 20 6e 6f 74 20 7a 65 72  ffset is not zer
21360 6f 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61 72  o, then pages ar
21370 65 20 70 6c 61 79 65 64 0a 2a 2a 20 20 20 20 20  e played.**     
21380 62 61 63 6b 20 73 74 61 72 74 69 6e 67 20 66 72  back starting fr
21390 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  om the journal h
213a0 65 61 64 65 72 20 69 6d 6d 65 64 69 61 74 65 6c  eader immediatel
213b0 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20  y following .** 
213c0 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
213d0 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 74 6f  nt.iHdrOffset to
213e0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
213f0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  main journal fil
21400 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67  e..**.**   * Pag
21410 65 73 20 61 72 65 20 74 68 65 6e 20 70 6c 61 79  es are then play
21420 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  ed back from the
21430 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   sub-journal fil
21440 65 2c 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 20  e, starting.**  
21450 20 20 20 77 69 74 68 20 74 68 65 20 50 61 67 65     with the Page
21460 72 53 61 76 65 70 6f 69 6e 74 2e 69 53 75 62 52  rSavepoint.iSubR
21470 65 63 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e  ec and continuin
21480 67 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 0a  g to the end of.
21490 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e  **     the journ
214a0 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  al file..**.** T
214b0 68 72 6f 75 67 68 6f 75 74 20 74 68 65 20 72 6f  hroughout the ro
214c0 6c 6c 62 61 63 6b 20 70 72 6f 63 65 73 73 2c 20  llback process, 
214d0 65 61 63 68 20 74 69 6d 65 20 61 20 70 61 67 65  each time a page
214e0 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c   is rolled back,
214f0 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f   the.** correspo
21500 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73 65 74  nding bit is set
21510 20 69 6e 20 61 20 62 69 74 76 65 63 20 73 74 72   in a bitvec str
21520 75 63 74 75 72 65 20 28 76 61 72 69 61 62 6c 65  ucture (variable
21530 20 70 44 6f 6e 65 20 69 6e 20 74 68 65 0a 2a 2a   pDone in the.**
21540 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
21550 62 65 6c 6f 77 29 2e 20 54 68 69 73 20 69 73 20  below). This is 
21560 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74  used to ensure t
21570 68 61 74 20 61 20 70 61 67 65 20 69 73 20 6f 6e  hat a page is on
21580 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63  ly.** rolled bac
21590 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  k the first time
215a0 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72   it is encounter
215b0 65 64 20 69 6e 20 65 69 74 68 65 72 20 6a 6f 75  ed in either jou
215c0 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  rnal..**.** If p
215d0 53 61 76 65 70 6f 69 6e 74 20 69 73 20 4e 55 4c  Savepoint is NUL
215e0 4c 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61 72  L, then pages ar
215f0 65 20 6f 6e 6c 79 20 70 6c 61 79 65 64 20 62 61  e only played ba
21600 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ck from the main
21610 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
21620 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  . There is no ne
21630 65 64 20 66 6f 72 20 61 20 62 69 74 76 65 63 20  ed for a bitvec 
21640 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
21650 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61  .** In either ca
21660 73 65 2c 20 62 65 66 6f 72 65 20 70 6c 61 79 62  se, before playb
21670 61 63 6b 20 63 6f 6d 6d 65 6e 63 65 73 20 74 68  ack commences th
21680 65 20 50 61 67 65 72 2e 64 62 53 69 7a 65 20 76  e Pager.dbSize v
21690 61 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20 72 65  ariable.** is re
216a0 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
216b0 20 74 68 61 74 20 69 74 20 68 65 6c 64 20 61 74   that it held at
216c0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
216d0 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20  e savepoint .** 
216e0 28 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  (or transaction)
216f0 2e 20 4e 6f 20 70 61 67 65 20 77 69 74 68 20 61  . No page with a
21700 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 67 72 65   page-number gre
21710 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 20 76  ater than this v
21720 61 6c 75 65 0a 2a 2a 20 69 73 20 70 6c 61 79 65  alue.** is playe
21730 64 20 62 61 63 6b 2e 20 49 66 20 6f 6e 65 20 69  d back. If one i
21740 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74  s encountered it
21750 20 69 73 20 73 69 6d 70 6c 79 20 73 6b 69 70 70   is simply skipp
21760 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
21770 74 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53  t pagerPlaybackS
21780 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a  avepoint(Pager *
21790 70 50 61 67 65 72 2c 20 50 61 67 65 72 53 61 76  pPager, PagerSav
217a0 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69  epoint *pSavepoi
217b0 6e 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  nt){.  i64 szJ; 
217c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
217d0 2f 2a 20 45 66 66 65 63 74 69 76 65 20 73 69 7a  /* Effective siz
217e0 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  e of the main jo
217f0 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69  urnal */.  i64 i
21800 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20  HdrOff;         
21810 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66 69      /* End of fi
21820 72 73 74 20 73 65 67 6d 65 6e 74 20 6f 66 20 6d  rst segment of m
21830 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  ain-journal reco
21840 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  rds */.  int rc 
21850 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
21860 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
21870 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44   */.  Bitvec *pD
21880 6f 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  one = 0;       /
21890 2a 20 42 69 74 76 65 63 20 74 6f 20 65 6e 73 75  * Bitvec to ensu
218a0 72 65 20 70 61 67 65 73 20 70 6c 61 79 65 64 20  re pages played 
218b0 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a  back only once *
218c0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
218d0 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
218e0 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73  ER_ERROR );.  as
218f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
21900 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
21910 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 0a 20 20  ER_LOCKED );..  
21920 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 62 69  /* Allocate a bi
21930 74 76 65 63 20 74 6f 20 75 73 65 20 74 6f 20 73  tvec to use to s
21940 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66 20  tore the set of 
21950 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63  pages rolled bac
21960 6b 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65  k */.  if( pSave
21970 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 70 44 6f  point ){.    pDo
21980 6e 65 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  ne = sqlite3Bitv
21990 65 63 43 72 65 61 74 65 28 70 53 61 76 65 70 6f  ecCreate(pSavepo
219a0 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20 20  int->nOrig);.   
219b0 20 69 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a 20   if( !pDone ){. 
219c0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
219d0 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
219e0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53     }.  }..  /* S
219f0 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  et the database 
21a00 73 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68 65  size back to the
21a10 20 76 61 6c 75 65 20 69 74 20 77 61 73 20 62 65   value it was be
21a20 66 6f 72 65 20 74 68 65 20 73 61 76 65 70 6f 69  fore the savepoi
21a30 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72  nt .  ** being r
21a40 65 76 65 72 74 65 64 20 77 61 73 20 6f 70 65 6e  everted was open
21a50 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65  ed..  */.  pPage
21a60 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53 61 76  r->dbSize = pSav
21a70 65 70 6f 69 6e 74 20 3f 20 70 53 61 76 65 70 6f  epoint ? pSavepo
21a80 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50 61  int->nOrig : pPa
21a90 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b  ger->dbOrigSize;
21aa0 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  .  pPager->chang
21ab0 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61  eCountDone = pPa
21ac0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a  ger->tempFile;..
21ad0 20 20 69 66 28 20 21 70 53 61 76 65 70 6f 69 6e    if( !pSavepoin
21ae0 74 20 26 26 20 70 61 67 65 72 55 73 65 57 61 6c  t && pagerUseWal
21af0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
21b00 72 65 74 75 72 6e 20 70 61 67 65 72 52 6f 6c 6c  return pagerRoll
21b10 62 61 63 6b 57 61 6c 28 70 50 61 67 65 72 29 3b  backWal(pPager);
21b20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 73 65 20 70  .  }..  /* Use p
21b30 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
21b40 66 20 61 73 20 74 68 65 20 65 66 66 65 63 74 69  f as the effecti
21b50 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d  ve size of the m
21b60 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a  ain rollback.  *
21b70 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20  * journal.  The 
21b80 61 63 74 75 61 6c 20 66 69 6c 65 20 6d 69 67 68  actual file migh
21b90 74 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e  t be larger than
21ba0 20 74 68 69 73 20 69 6e 0a 20 20 2a 2a 20 50 41   this in.  ** PA
21bb0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
21bc0 54 52 55 4e 43 41 54 45 20 6f 72 20 50 41 47 45  TRUNCATE or PAGE
21bd0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
21be0 52 53 49 53 54 2e 20 20 42 75 74 20 61 6e 79 74  RSIST.  But anyt
21bf0 68 69 6e 67 0a 20 20 2a 2a 20 70 61 73 74 20 70  hing.  ** past p
21c00 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
21c10 66 20 69 73 20 6f 66 66 2d 6c 69 6d 69 74 73 20  f is off-limits 
21c20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a  to us..  */.  sz
21c30 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J = pPager->jour
21c40 6e 61 6c 4f 66 66 3b 0a 20 20 61 73 73 65 72 74  nalOff;.  assert
21c50 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
21c60 61 67 65 72 29 3d 3d 30 20 7c 7c 20 73 7a 4a 3d  ager)==0 || szJ=
21c70 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69  =0 );..  /* Begi
21c80 6e 20 62 79 20 72 6f 6c 6c 69 6e 67 20 62 61 63  n by rolling bac
21c90 6b 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74  k records from t
21ca0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
21cb0 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a  starting at.  **
21cc0 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
21cd0 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74  iOffset and cont
21ce0 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 6e 65  inuing to the ne
21cf0 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  xt journal heade
21d00 72 2e 0a 20 20 2a 2a 20 54 68 65 72 65 20 6d 69  r..  ** There mi
21d10 67 68 74 20 62 65 20 72 65 63 6f 72 64 73 20 69  ght be records i
21d20 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  n the main journ
21d30 61 6c 20 74 68 61 74 20 68 61 76 65 20 61 20 70  al that have a p
21d40 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  age number.  ** 
21d50 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
21d60 20 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73   current databas
21d70 65 20 73 69 7a 65 20 28 70 50 61 67 65 72 2d 3e  e size (pPager->
21d80 64 62 53 69 7a 65 29 20 62 75 74 20 74 68 6f 73  dbSize) but thos
21d90 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73  e.  ** will be s
21da0 6b 69 70 70 65 64 20 61 75 74 6f 6d 61 74 69 63  kipped automatic
21db0 61 6c 6c 79 2e 20 20 50 61 67 65 73 20 61 72 65  ally.  Pages are
21dc0 20 61 64 64 65 64 20 74 6f 20 70 44 6f 6e 65 20   added to pDone 
21dd0 61 73 20 74 68 65 79 0a 20 20 2a 2a 20 61 72 65  as they.  ** are
21de0 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20   played back..  
21df0 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f  */.  if( pSavepo
21e00 69 6e 74 20 26 26 20 21 70 61 67 65 72 55 73 65  int && !pagerUse
21e10 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
21e20 20 20 20 69 48 64 72 4f 66 66 20 3d 20 70 53 61     iHdrOff = pSa
21e30 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66  vepoint->iHdrOff
21e40 73 65 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74  set ? pSavepoint
21e50 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3a 20 73  ->iHdrOffset : s
21e60 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  zJ;.    pPager->
21e70 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 53 61  journalOff = pSa
21e80 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66 73 65 74  vepoint->iOffset
21e90 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d  ;.    while( rc=
21ea0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
21eb0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
21ec0 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20 20 20 20  <iHdrOff ){.    
21ed0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
21ee0 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
21ef0 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e  Pager, &pPager->
21f00 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e  journalOff, pDon
21f10 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  e, 1, 1);.    }.
21f20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
21f30 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
21f40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
21f50 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
21f60 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f   0;.  }..  /* Co
21f70 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e 67 20 62  ntinue rolling b
21f80 61 63 6b 20 72 65 63 6f 72 64 73 20 6f 75 74 20  ack records out 
21f90 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
21fa0 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a  nal starting at.
21fb0 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6a    ** the first j
21fc0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65  ournal header se
21fd0 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e  en and continuin
21fe0 67 20 75 6e 74 69 6c 20 74 68 65 20 65 66 66 65  g until the effe
21ff0 63 74 69 76 65 20 65 6e 64 0a 20 20 2a 2a 20 6f  ctive end.  ** o
22000 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
22010 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e 74 69 6e  al file.  Contin
22020 75 65 20 74 6f 20 73 6b 69 70 20 6f 75 74 2d 6f  ue to skip out-o
22030 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61 6e  f-range pages an
22040 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e 75 65 20  d.  ** continue 
22050 61 64 64 69 6e 67 20 70 61 67 65 73 20 72 6f 6c  adding pages rol
22060 6c 65 64 20 62 61 63 6b 20 74 6f 20 70 44 6f 6e  led back to pDon
22070 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28  e..  */.  while(
22080 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
22090 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
220a0 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20 20 20 20  lOff<szJ ){.    
220b0 75 33 32 20 69 69 3b 20 20 20 20 20 20 20 20 20  u32 ii;         
220c0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
220d0 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 4a  er */.    u32 nJ
220e0 52 65 63 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  Rec = 0;     /* 
220f0 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61  Number of Journa
22100 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20  l Records */.   
22110 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20   u32 dummy;.    
22120 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c  rc = readJournal
22130 48 64 72 28 70 50 61 67 65 72 2c 20 30 2c 20 73  Hdr(pPager, 0, s
22140 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d  zJ, &nJRec, &dum
22150 6d 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  my);.    assert(
22160 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
22170 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20   );..    /*.    
22180 2a 2a 20 54 68 65 20 22 70 50 61 67 65 72 2d 3e  ** The "pPager->
22190 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e  journalHdr+JOURN
221a0 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
221b0 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  )==pPager->journ
221c0 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a 20 74 65  alOff".    ** te
221d0 73 74 20 69 73 20 72 65 6c 61 74 65 64 20 74 6f  st is related to
221e0 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 20 20   ticket #2565.  
221f0 53 65 65 20 74 68 65 20 64 69 73 63 75 73 73 69  See the discussi
22200 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a  on in the.    **
22210 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
22220 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61  ) function for a
22230 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
22240 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ation..    */.  
22250 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 0a    if( nJRec==0 .
22260 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e       && pPager->
22270 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e  journalHdr+JOURN
22280 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
22290 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  )==pPager->journ
222a0 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a 20 20 20  alOff.    ){.   
222b0 20 20 20 6e 4a 52 65 63 20 3d 20 28 75 33 32 29     nJRec = (u32)
222c0 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e  ((szJ - pPager->
222d0 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52  journalOff)/JOUR
222e0 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
222f0 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ));.    }.    fo
22300 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  r(ii=0; rc==SQLI
22310 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65  TE_OK && ii<nJRe
22320 63 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  c && pPager->jou
22330 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b  rnalOff<szJ; ii+
22340 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  +){.      rc = p
22350 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
22360 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26  e_page(pPager, &
22370 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
22380 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29  ff, pDone, 1, 1)
22390 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
223a0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
223b0 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73  ONE );.  }.  ass
223c0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
223d0 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f  OK || pPager->jo
223e0 75 72 6e 61 6c 4f 66 66 3e 3d 73 7a 4a 20 29 3b  urnalOff>=szJ );
223f0 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20  ..  /* Finally, 
22400 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65 73 20   rollback pages 
22410 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
22420 72 6e 61 6c 2e 20 20 50 61 67 65 20 74 68 61 74  rnal.  Page that
22430 20 77 65 72 65 0a 20 20 2a 2a 20 70 72 65 76 69   were.  ** previ
22440 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63  ously rolled bac
22450 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69  k out of the mai
22460 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61  n journal (and a
22470 72 65 20 68 65 6e 63 65 20 69 6e 20 70 44 6f 6e  re hence in pDon
22480 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20  e).  ** will be 
22490 73 6b 69 70 70 65 64 2e 20 20 4f 75 74 2d 6f 66  skipped.  Out-of
224a0 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61 72 65  -range pages are
224b0 20 61 6c 73 6f 20 73 6b 69 70 70 65 64 2e 0a 20   also skipped.. 
224c0 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70   */.  if( pSavep
224d0 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75 33 32 20  oint ){.    u32 
224e0 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ii;            /
224f0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
22500 2f 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74  /.    i64 offset
22510 20 3d 20 28 69 36 34 29 70 53 61 76 65 70 6f 69   = (i64)pSavepoi
22520 6e 74 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b 70  nt->iSubRec*(4+p
22530 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
22540 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65 72  ;..    if( pager
22550 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
22560 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
22570 69 74 65 33 57 61 6c 53 61 76 65 70 6f 69 6e 74  ite3WalSavepoint
22580 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61  Undo(pPager->pWa
22590 6c 2c 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 61  l, pSavepoint->a
225a0 57 61 6c 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a  WalData);.    }.
225b0 20 20 20 20 66 6f 72 28 69 69 3d 70 53 61 76 65      for(ii=pSave
225c0 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20  point->iSubRec; 
225d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
225e0 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62   ii<pPager->nSub
225f0 52 65 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  Rec; ii++){.    
22600 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
22610 3d 3d 28 69 36 34 29 69 69 2a 28 34 2b 70 50 61  ==(i64)ii*(4+pPa
22620 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29  ger->pageSize) )
22630 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ;.      rc = pag
22640 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
22650 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 6f 66  page(pPager, &of
22660 66 73 65 74 2c 20 70 44 6f 6e 65 2c 20 30 2c 20  fset, pDone, 0, 
22670 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  1);.    }.    as
22680 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
22690 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20 20  _DONE );.  }..  
226a0 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
226b0 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20 69  troy(pDone);.  i
226c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
226d0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
226e0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a  journalOff = szJ
226f0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
22700 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  rc;.}../*.** Cha
22710 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  nge the maximum 
22720 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d  number of in-mem
22730 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61  ory pages that a
22740 72 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 62 65  re allowed.** be
22750 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20  fore attempting 
22760 74 6f 20 72 65 63 79 63 6c 65 20 63 6c 65 61 6e  to recycle clean
22770 20 61 6e 64 20 75 6e 75 73 65 64 20 70 61 67 65   and unused page
22780 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
22790 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73  e3PagerSetCaches
227a0 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
227b0 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  r, int mxPage){.
227c0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53    sqlite3PcacheS
227d0 65 74 43 61 63 68 65 73 69 7a 65 28 70 50 61 67  etCachesize(pPag
227e0 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50  er->pPCache, mxP
227f0 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  age);.}../*.** C
22800 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75  hange the maximu
22810 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  m number of in-m
22820 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74  emory pages that
22830 20 61 72 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   are allowed.** 
22840 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
22850 67 20 74 6f 20 73 70 69 6c 6c 20 70 61 67 65 73  g to spill pages
22860 20 74 6f 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a   to journal..*/.
22870 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
22880 53 65 74 53 70 69 6c 6c 73 69 7a 65 28 50 61 67  SetSpillsize(Pag
22890 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
228a0 6d 78 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72  mxPage){.  retur
228b0 6e 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53  n sqlite3PcacheS
228c0 65 74 53 70 69 6c 6c 73 69 7a 65 28 70 50 61 67  etSpillsize(pPag
228d0 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50  er->pPCache, mxP
228e0 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  age);.}../*.** I
228f0 6e 76 6f 6b 65 20 53 51 4c 49 54 45 5f 46 43 4e  nvoke SQLITE_FCN
22900 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 20 62 61 73  TL_MMAP_SIZE bas
22910 65 64 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ed on the curren
22920 74 20 76 61 6c 75 65 20 6f 66 20 73 7a 4d 6d 61  t value of szMma
22930 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
22940 64 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69 6d  d pagerFixMaplim
22950 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  it(Pager *pPager
22960 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  ){.#if SQLITE_MA
22970 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
22980 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
22990 20 3d 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a 20   = pPager->fd;. 
229a0 20 69 66 28 20 69 73 4f 70 65 6e 28 66 64 29 20   if( isOpen(fd) 
229b0 26 26 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d  && fd->pMethods-
229c0 3e 69 56 65 72 73 69 6f 6e 3e 3d 33 20 29 7b 0a  >iVersion>=3 ){.
229d0 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
229e0 34 20 73 7a 3b 0a 20 20 20 20 73 7a 20 3d 20 70  4 sz;.    sz = p
229f0 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 3b 0a 20  Pager->szMmap;. 
22a00 20 20 20 70 50 61 67 65 72 2d 3e 62 55 73 65 46     pPager->bUseF
22a10 65 74 63 68 20 3d 20 28 73 7a 3e 30 29 3b 0a 20  etch = (sz>0);. 
22a20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65     sqlite3OsFile
22a30 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67  ControlHint(pPag
22a40 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46  er->fd, SQLITE_F
22a50 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20  CNTL_MMAP_SIZE, 
22a60 26 73 7a 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  &sz);.  }.#endif
22a70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
22a80 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a   the maximum siz
22a90 65 20 6f 66 20 61 6e 79 20 6d 65 6d 6f 72 79 20  e of any memory 
22aa0 6d 61 70 70 69 6e 67 20 6d 61 64 65 20 6f 66 20  mapping made of 
22ab0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
22ac0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
22ad0 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69  e3PagerSetMmapLi
22ae0 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  mit(Pager *pPage
22af0 72 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  r, sqlite3_int64
22b00 20 73 7a 4d 6d 61 70 29 7b 0a 20 20 70 50 61 67   szMmap){.  pPag
22b10 65 72 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73 7a 4d  er->szMmap = szM
22b20 6d 61 70 3b 0a 20 20 70 61 67 65 72 46 69 78 4d  map;.  pagerFixM
22b30 61 70 6c 69 6d 69 74 28 70 50 61 67 65 72 29 3b  aplimit(pPager);
22b40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
22b50 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73  s much memory as
22b60 20 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 20 74   possible from t
22b70 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 76 6f 69  he pager..*/.voi
22b80 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68  d sqlite3PagerSh
22b90 72 69 6e 6b 28 50 61 67 65 72 20 2a 70 50 61 67  rink(Pager *pPag
22ba0 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63  er){.  sqlite3Pc
22bb0 61 63 68 65 53 68 72 69 6e 6b 28 70 50 61 67 65  acheShrink(pPage
22bc0 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a  r->pPCache);.}..
22bd0 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 73 65 74  /*.** Adjust set
22be0 74 69 6e 67 73 20 6f 66 20 74 68 65 20 70 61 67  tings of the pag
22bf0 65 72 20 74 6f 20 74 68 6f 73 65 20 73 70 65 63  er to those spec
22c00 69 66 69 65 64 20 69 6e 20 74 68 65 20 70 67 46  ified in the pgF
22c10 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 2e 0a  lags parameter..
22c20 2a 2a 0a 2a 2a 20 54 68 65 20 22 6c 65 76 65 6c  **.** The "level
22c30 22 20 69 6e 20 70 67 46 6c 61 67 73 20 26 20 50  " in pgFlags & P
22c40 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  AGER_SYNCHRONOUS
22c50 5f 4d 41 53 4b 20 73 65 74 73 20 74 68 65 20 72  _MASK sets the r
22c60 6f 62 75 73 74 6e 65 73 73 0a 2a 2a 20 6f 66 20  obustness.** of 
22c70 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
22c80 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53  damage due to OS
22c90 20 63 72 61 73 68 65 73 20 6f 72 20 70 6f 77 65   crashes or powe
22ca0 72 20 66 61 69 6c 75 72 65 73 20 62 79 0a 2a 2a  r failures by.**
22cb0 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75   changing the nu
22cc0 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73  mber of syncs()s
22cd0 20 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74 68   when writing th
22ce0 65 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54  e journals..** T
22cf0 68 65 72 65 20 61 72 65 20 66 6f 75 72 20 6c 65  here are four le
22d00 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f  vels:.**.**    O
22d10 46 46 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  FF       sqlite3
22d20 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65  OsSync() is neve
22d30 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20  r called.  This 
22d40 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a  is the default.*
22d50 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  *              f
22d60 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64  or temporary and
22d70 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73   transient files
22d80 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41  ..**.**    NORMA
22d90 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c  L    The journal
22da0 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20   is synced once 
22db0 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65  before writes be
22dc0 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20  gin on the.**   
22dd0 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
22de0 61 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f  ase.  This is no
22df0 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20  rmally adequate 
22e00 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a  protection, but.
22e10 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
22e20 69 74 20 69 73 20 74 68 65 6f 72 65 74 69 63 61  it is theoretica
22e30 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68  lly possible, th
22e40 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65  ough very unlike
22e50 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ly,.**          
22e60 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70      that an inop
22e70 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69  ertune power fai
22e80 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65  lure could leave
22e90 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
22ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 20               in 
22eb0 61 20 73 74 61 74 65 20 77 68 69 63 68 20 77 6f  a state which wo
22ec0 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67 65  uld cause damage
22ed0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
22ee0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
22ef0 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c   when it is roll
22f00 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20  ed back..**.**  
22f10 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20    FULL      The 
22f20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
22f30 64 20 74 77 69 63 65 20 62 65 66 6f 72 65 20 77  d twice before w
22f40 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74  rites begin on t
22f50 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
22f60 20 20 20 64 61 74 61 62 61 73 65 20 28 77 69 74     database (wit
22f70 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61  h some additiona
22f80 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20  l information - 
22f90 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a  the nRec field.*
22fa0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  *              o
22fb0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
22fc0 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69  ader - being wri
22fd0 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20  tten in between 
22fe0 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20  the two.**      
22ff0 20 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20          syncs). 
23000 20 49 66 20 77 65 20 61 73 73 75 6d 65 20 74 68   If we assume th
23010 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20  at writing a.** 
23020 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 6e               sin
23030 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20  gle disk sector 
23040 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20  is atomic, then 
23050 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64  this mode provid
23060 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  es.**           
23070 20 20 20 61 73 73 75 72 61 6e 63 65 20 74 68 61     assurance tha
23080 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69  t the journal wi
23090 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70  ll not be corrup
230a0 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20  ted to the.**   
230b0 20 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74             point
230c0 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61   of causing dama
230d0 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
230e0 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  se during rollba
230f0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 58 54  ck..**.**    EXT
23100 52 41 20 20 20 20 20 54 68 69 73 20 69 73 20 6c  RA     This is l
23110 69 6b 65 20 46 55 4c 4c 20 65 78 63 65 70 74 20  ike FULL except 
23120 74 68 61 74 20 69 73 20 61 6c 73 6f 20 73 79 6e  that is also syn
23130 63 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  cs the directory
23140 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
23150 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
23160 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
23170 6e 61 6c 20 61 66 74 65 72 20 74 68 65 20 72 6f  nal after the ro
23180 6c 6c 62 61 63 6b 0a 2a 2a 20 20 20 20 20 20 20  llback.**       
23190 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 69         journal i
231a0 73 20 75 6e 6c 69 6e 6b 65 64 2e 0a 2a 2a 0a 2a  s unlinked..**.*
231b0 2a 20 54 68 65 20 61 62 6f 76 65 20 69 73 20 66  * The above is f
231c0 6f 72 20 61 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f  or a rollback-jo
231d0 75 72 6e 61 6c 20 6d 6f 64 65 2e 20 20 46 6f 72  urnal mode.  For
231e0 20 57 41 4c 20 6d 6f 64 65 2c 20 4f 46 46 20 63   WAL mode, OFF c
231f0 6f 6e 74 69 6e 75 65 73 0a 2a 2a 20 74 6f 20 6d  ontinues.** to m
23200 65 61 6e 20 74 68 61 74 20 6e 6f 20 73 79 6e 63  ean that no sync
23210 73 20 65 76 65 72 20 6f 63 63 75 72 2e 20 20 4e  s ever occur.  N
23220 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74 68 61 74  ORMAL means that
23230 20 74 68 65 20 57 41 4c 20 69 73 20 73 79 6e 63   the WAL is sync
23240 65 64 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 74  ed.** prior to t
23250 68 65 20 73 74 61 72 74 20 6f 66 20 63 68 65 63  he start of chec
23260 6b 70 6f 69 6e 74 20 61 6e 64 20 74 68 61 74 20  kpoint and that 
23270 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
23280 65 20 69 73 20 73 79 6e 63 65 64 0a 2a 2a 20 61  e is synced.** a
23290 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
232a0 20 6f 66 20 74 68 65 20 63 68 65 63 6b 70 6f 69   of the checkpoi
232b0 6e 74 20 69 66 20 74 68 65 20 65 6e 74 69 72 65  nt if the entire
232c0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
232d0 57 41 4c 0a 2a 2a 20 77 61 73 20 77 72 69 74 74  WAL.** was writt
232e0 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  en back into the
232f0 20 64 61 74 61 62 61 73 65 2e 20 20 42 75 74 20   database.  But 
23300 6e 6f 20 73 79 6e 63 20 6f 70 65 72 61 74 69 6f  no sync operatio
23310 6e 73 20 6f 63 63 75 72 20 66 6f 72 0a 2a 2a 20  ns occur for.** 
23320 61 6e 20 6f 72 64 69 6e 61 72 79 20 63 6f 6d 6d  an ordinary comm
23330 69 74 20 69 6e 20 4e 4f 52 4d 41 4c 20 6d 6f 64  it in NORMAL mod
23340 65 20 77 69 74 68 20 57 41 4c 2e 20 20 46 55 4c  e with WAL.  FUL
23350 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  L means that the
23360 20 57 41 4c 0a 2a 2a 20 66 69 6c 65 20 69 73 20   WAL.** file is 
23370 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67  synced following
23380 20 65 61 63 68 20 63 6f 6d 6d 69 74 20 6f 70 65   each commit ope
23390 72 61 74 69 6f 6e 2c 20 69 6e 20 61 64 64 69 74  ration, in addit
233a0 69 6f 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 73 79  ion to the.** sy
233b0 6e 63 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ncs associated w
233c0 69 74 68 20 4e 4f 52 4d 41 4c 2e 20 20 54 68 65  ith NORMAL.  The
233d0 72 65 20 69 73 20 6e 6f 20 64 69 66 66 65 72 65  re is no differe
233e0 6e 63 65 20 62 65 74 77 65 65 6e 20 46 55 4c 4c  nce between FULL
233f0 0a 2a 2a 20 61 6e 64 20 45 58 54 52 41 20 66 6f  .** and EXTRA fo
23400 72 20 57 41 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a  r WAL mode..**.*
23410 2a 20 44 6f 20 6e 6f 74 20 63 6f 6e 66 75 73 65  * Do not confuse
23420 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c   synchronous=FUL
23430 4c 20 77 69 74 68 20 53 51 4c 49 54 45 5f 53 59  L with SQLITE_SY
23440 4e 43 5f 46 55 4c 4c 2e 20 20 54 68 65 0a 2a 2a  NC_FULL.  The.**
23450 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c   SQLITE_SYNC_FUL
23460 4c 20 6d 61 63 72 6f 20 6d 65 61 6e 73 20 74 6f  L macro means to
23470 20 75 73 65 20 74 68 65 20 4d 61 63 4f 53 58 2d   use the MacOSX-
23480 73 74 79 6c 65 20 66 75 6c 6c 2d 66 73 79 6e 63  style full-fsync
23490 0a 2a 2a 20 75 73 69 6e 67 20 66 63 6e 74 6c 28  .** using fcntl(
234a0 46 5f 46 55 4c 4c 46 53 59 4e 43 29 2e 20 20 53  F_FULLFSYNC).  S
234b0 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
234c0 4c 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20 61 6e  L means to do an
234d0 0a 2a 2a 20 6f 72 64 69 6e 61 72 79 20 66 73 79  .** ordinary fsy
234e0 6e 63 28 29 20 63 61 6c 6c 2e 20 20 54 68 65 72  nc() call.  Ther
234f0 65 20 69 73 20 6e 6f 20 64 69 66 66 65 72 65 6e  e is no differen
23500 63 65 20 62 65 74 77 65 65 6e 20 53 51 4c 49 54  ce between SQLIT
23510 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 2a 2a 20 61  E_SYNC_FULL.** a
23520 6e 64 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  nd SQLITE_SYNC_N
23530 4f 52 4d 41 4c 20 6f 6e 20 70 6c 61 74 66 6f 72  ORMAL on platfor
23540 6d 73 20 6f 74 68 65 72 20 74 68 61 6e 20 4d 61  ms other than Ma
23550 63 4f 53 58 2e 20 20 42 75 74 20 74 68 65 0a 2a  cOSX.  But the.*
23560 2a 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55  * synchronous=FU
23570 4c 4c 20 76 65 72 73 75 73 20 73 79 6e 63 68 72  LL versus synchr
23580 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 20 73 65 74  onous=NORMAL set
23590 74 69 6e 67 20 64 65 74 65 72 6d 69 6e 65 73 20  ting determines 
235a0 77 68 65 6e 0a 2a 2a 20 74 68 65 20 78 53 79 6e  when.** the xSyn
235b0 63 20 70 72 69 6d 69 74 69 76 65 20 69 73 20 63  c primitive is c
235c0 61 6c 6c 65 64 20 61 6e 64 20 69 73 20 72 65 6c  alled and is rel
235d0 65 76 61 6e 74 20 74 6f 20 61 6c 6c 20 70 6c 61  evant to all pla
235e0 74 66 6f 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 4e 75  tforms..**.** Nu
235f0 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61 73 73  meric values ass
23600 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
23610 73 65 20 73 74 61 74 65 73 20 61 72 65 20 4f 46  se states are OF
23620 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a  F==1, NORMAL=2,.
23630 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a  ** and FULL=3..*
23640 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
23650 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
23660 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  MAS.void sqlite3
23670 50 61 67 65 72 53 65 74 46 6c 61 67 73 28 0a 20  PagerSetFlags(. 
23680 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
23690 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
236a0 67 65 72 20 74 6f 20 73 65 74 20 73 61 66 65 74  ger to set safet
236b0 79 20 6c 65 76 65 6c 20 66 6f 72 20 2a 2f 0a 20  y level for */. 
236c0 20 75 6e 73 69 67 6e 65 64 20 70 67 46 6c 61 67   unsigned pgFlag
236d0 73 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75  s      /* Variou
236e0 73 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20  s flags */.){.  
236f0 75 6e 73 69 67 6e 65 64 20 6c 65 76 65 6c 20 3d  unsigned level =
23700 20 70 67 46 6c 61 67 73 20 26 20 50 41 47 45 52   pgFlags & PAGER
23710 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41 53  _SYNCHRONOUS_MAS
23720 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  K;.  if( pPager-
23730 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
23740 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
23750 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 1;.    pPager-
23760 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 30 3b 0a 20  >fullSync = 0;. 
23770 20 20 20 70 50 61 67 65 72 2d 3e 65 78 74 72 61     pPager->extra
23780 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Sync = 0;.  }els
23790 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  e{.    pPager->n
237a0 6f 53 79 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d  oSync =  level==
237b0 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55  PAGER_SYNCHRONOU
237c0 53 5f 4f 46 46 20 3f 31 3a 30 3b 0a 20 20 20 20  S_OFF ?1:0;.    
237d0 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
237e0 20 3d 20 6c 65 76 65 6c 3e 3d 50 41 47 45 52 5f   = level>=PAGER_
237f0 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 46 55 4c 4c  SYNCHRONOUS_FULL
23800 20 3f 31 3a 30 3b 0a 20 20 20 20 70 50 61 67 65   ?1:0;.    pPage
23810 72 2d 3e 65 78 74 72 61 53 79 6e 63 20 3d 20 6c  r->extraSync = l
23820 65 76 65 6c 3d 3d 50 41 47 45 52 5f 53 59 4e 43  evel==PAGER_SYNC
23830 48 52 4f 4e 4f 55 53 5f 45 58 54 52 41 20 3f 31  HRONOUS_EXTRA ?1
23840 3a 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  :0;.  }.  if( pP
23850 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
23860 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63      pPager->sync
23870 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 70  Flags = 0;.    p
23880 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46  Pager->ckptSyncF
23890 6c 61 67 73 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  lags = 0;.  }els
238a0 65 20 69 66 28 20 70 67 46 6c 61 67 73 20 26 20  e if( pgFlags & 
238b0 50 41 47 45 52 5f 46 55 4c 4c 46 53 59 4e 43 20  PAGER_FULLFSYNC 
238c0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
238d0 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
238e0 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 20  E_SYNC_FULL;.   
238f0 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e   pPager->ckptSyn
23900 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
23910 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c  SYNC_FULL;.  }el
23920 73 65 20 69 66 28 20 70 67 46 6c 61 67 73 20 26  se if( pgFlags &
23930 20 50 41 47 45 52 5f 43 4b 50 54 5f 46 55 4c 4c   PAGER_CKPT_FULL
23940 46 53 59 4e 43 20 29 7b 0a 20 20 20 20 70 50 61  FSYNC ){.    pPa
23950 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d  ger->syncFlags =
23960 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
23970 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  MAL;.    pPager-
23980 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d  >ckptSyncFlags =
23990 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c   SQLITE_SYNC_FUL
239a0 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  L;.  }else{.    
239b0 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
239c0 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s = SQLITE_SYNC_
239d0 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67  NORMAL;.    pPag
239e0 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67  er->ckptSyncFlag
239f0 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s = SQLITE_SYNC_
23a00 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 70 50  NORMAL;.  }.  pP
23a10 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61  ager->walSyncFla
23a20 67 73 20 3d 20 70 50 61 67 65 72 2d 3e 73 79 6e  gs = pPager->syn
23a30 63 46 6c 61 67 73 3b 0a 20 20 69 66 28 20 70 50  cFlags;.  if( pP
23a40 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29  ager->fullSync )
23a50 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 77 61  {.    pPager->wa
23a60 6c 53 79 6e 63 46 6c 61 67 73 20 7c 3d 20 57 41  lSyncFlags |= WA
23a70 4c 5f 53 59 4e 43 5f 54 52 41 4e 53 41 43 54 49  L_SYNC_TRANSACTI
23a80 4f 4e 53 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ONS;.  }.  if( p
23a90 67 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f 43  gFlags & PAGER_C
23aa0 41 43 48 45 53 50 49 4c 4c 20 29 7b 0a 20 20 20  ACHESPILL ){.   
23ab0 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
23ac0 69 6c 6c 20 26 3d 20 7e 53 50 49 4c 4c 46 4c 41  ill &= ~SPILLFLA
23ad0 47 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73 65 7b 0a  G_OFF;.  }else{.
23ae0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
23af0 74 53 70 69 6c 6c 20 7c 3d 20 53 50 49 4c 4c 46  tSpill |= SPILLF
23b00 4c 41 47 5f 4f 46 46 3b 0a 20 20 7d 0a 7d 0a 23  LAG_OFF;.  }.}.#
23b10 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
23b20 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61   following globa
23b30 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e  l variable is in
23b40 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76  cremented whenev
23b50 65 72 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a  er the library.*
23b60 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70  * attempts to op
23b70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  en a temporary f
23b80 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72  ile.  This infor
23b90 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66  mation is used f
23ba0 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e  or.** testing an
23bb0 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e  d analysis only.
23bc0 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c    .*/.#ifdef SQL
23bd0 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
23be0 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  ite3_opentemp_co
23bf0 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  unt = 0;.#endif.
23c00 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65  ./*.** Open a te
23c10 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a  mporary file..**
23c20 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 66 69  .** Write the fi
23c30 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e  le descriptor in
23c40 74 6f 20 2a 70 46 69 6c 65 2e 20 52 65 74 75 72  to *pFile. Retur
23c50 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
23c60 75 63 63 65 73 73 20 0a 2a 2a 20 6f 72 20 73 6f  uccess .** or so
23c70 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63  me other error c
23c80 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e 20  ode if we fail. 
23c90 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f  The OS will auto
23ca0 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 64 65  matically .** de
23cb0 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61  lete the tempora
23cc0 72 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20  ry file when it 
23cd0 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a  is closed..**.**
23ce0 20 54 68 65 20 66 6c 61 67 73 20 70 61 73 73 65   The flags passe
23cf0 64 20 74 6f 20 74 68 65 20 56 46 53 20 6c 61 79  d to the VFS lay
23d00 65 72 20 78 4f 70 65 6e 28 29 20 63 61 6c 6c 20  er xOpen() call 
23d10 61 72 65 20 74 68 6f 73 65 20 73 70 65 63 69 66  are those specif
23d20 69 65 64 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65  ied.** by parame
23d30 74 65 72 20 76 66 73 46 6c 61 67 73 20 4f 52 65  ter vfsFlags ORe
23d40 64 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f  d with the follo
23d50 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
23d60 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
23d70 57 52 49 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c  WRITE.**     SQL
23d80 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a  ITE_OPEN_CREATE.
23d90 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50  **     SQLITE_OP
23da0 45 4e 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  EN_EXCLUSIVE.** 
23db0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
23dc0 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f  DELETEONCLOSE.*/
23dd0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
23de0 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20 50 61 67  rOpentemp(.  Pag
23df0 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
23e00 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
23e10 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69  object */.  sqli
23e20 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
23e30 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66    /* Write the f
23e40 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 68  ile descriptor h
23e50 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73  ere */.  int vfs
23e60 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 2f  Flags          /
23e70 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74  * Flags passed t
23e80 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 56 46  hrough to the VF
23e90 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  S */.){.  int rc
23ea0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23eb0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
23ec0 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
23ed0 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f  _TEST.  sqlite3_
23ee0 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b  opentemp_count++
23ef0 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74  ;  /* Used for t
23f00 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
23f10 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64  sis only */.#end
23f20 69 66 0a 0a 20 20 76 66 73 46 6c 61 67 73 20 7c  if..  vfsFlags |
23f30 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  =  SQLITE_OPEN_R
23f40 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54  EADWRITE | SQLIT
23f50 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a  E_OPEN_CREATE |.
23f60 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
23f70 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
23f80 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
23f90 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20  DELETEONCLOSE;. 
23fa0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
23fb0 70 65 6e 28 70 50 61 67 65 72 2d 3e 70 56 66 73  pen(pPager->pVfs
23fc0 2c 20 30 2c 20 70 46 69 6c 65 2c 20 76 66 73 46  , 0, pFile, vfsF
23fd0 6c 61 67 73 2c 20 30 29 3b 0a 20 20 61 73 73 65  lags, 0);.  asse
23fe0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
23ff0 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 46 69 6c  K || isOpen(pFil
24000 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e) );.  return r
24010 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  c;.}../*.** Set 
24020 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
24030 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
24040 20 54 68 65 20 70 61 67 65 72 20 69 6e 76 6f 6b   The pager invok
24050 65 73 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64  es the busy-hand
24060 6c 65 72 20 69 66 20 73 71 6c 69 74 65 33 4f 73  ler if sqlite3Os
24070 4c 6f 63 6b 28 29 20 72 65 74 75 72 6e 73 20 0a  Lock() returns .
24080 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77  ** SQLITE_BUSY w
24090 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70  hen trying to up
240a0 67 72 61 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f  grade from no-lo
240b0 63 6b 20 74 6f 20 61 20 53 48 41 52 45 44 20 6c  ck to a SHARED l
240c0 6f 63 6b 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e 20  ock,.** or when 
240d0 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64  trying to upgrad
240e0 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45  e from a RESERVE
240f0 44 20 6c 6f 63 6b 20 74 6f 20 61 6e 20 45 58 43  D lock to an EXC
24100 4c 55 53 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e  LUSIVE .** lock.
24110 20 49 74 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 69   It does *not* i
24120 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68  nvoke the busy h
24130 61 6e 64 6c 65 72 20 77 68 65 6e 20 75 70 67 72  andler when upgr
24140 61 64 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53 48  ading from.** SH
24150 41 52 45 44 20 74 6f 20 52 45 53 45 52 56 45 44  ARED to RESERVED
24160 2c 20 6f 72 20 77 68 65 6e 20 75 70 67 72 61 64  , or when upgrad
24170 69 6e 67 20 66 72 6f 6d 20 53 48 41 52 45 44 20  ing from SHARED 
24180 74 6f 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  to EXCLUSIVE.** 
24190 28 77 68 69 63 68 20 6f 63 63 75 72 73 20 64 75  (which occurs du
241a0 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ring hot-journal
241b0 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 53 75 6d 6d   rollback). Summ
241c0 61 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61  ary:.**.**   Tra
241d0 6e 73 69 74 69 6f 6e 20 20 20 20 20 20 20 20 20  nsition         
241e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
241f0 20 49 6e 76 6f 6b 65 73 20 78 42 75 73 79 48 61   Invokes xBusyHa
24200 6e 64 6c 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d  ndler.**   -----
24210 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24220 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24230 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24240 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b  ---.**   NO_LOCK
24250 20 20 20 20 20 20 20 2d 3e 20 53 48 41 52 45 44         -> SHARED
24260 5f 4c 4f 43 4b 20 20 20 20 20 20 7c 20 59 65 73  _LOCK      | Yes
24270 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43  .**   SHARED_LOC
24280 4b 20 20 20 2d 3e 20 52 45 53 45 52 56 45 44 5f  K   -> RESERVED_
24290 4c 4f 43 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20  LOCK    | No.** 
242a0 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20    SHARED_LOCK   
242b0 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  -> EXCLUSIVE_LOC
242c0 4b 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45  K   | No.**   RE
242d0 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45  SERVED_LOCK -> E
242e0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20  XCLUSIVE_LOCK   
242f0 7c 20 59 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74  | Yes.**.** If t
24300 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  he busy-handler 
24310 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73  callback returns
24320 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c   non-zero, the l
24330 6f 63 6b 20 69 73 20 0a 2a 2a 20 72 65 74 72 69  ock is .** retri
24340 65 64 2e 20 49 66 20 69 74 20 72 65 74 75 72 6e  ed. If it return
24350 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  s zero, then the
24360 20 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72   SQLITE_BUSY err
24370 6f 72 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  or is.** returne
24380 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20  d to the caller 
24390 6f 66 20 74 68 65 20 70 61 67 65 72 20 41 50 49  of the pager API
243a0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f   function..*/.vo
243b0 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
243c0 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 0a 20  etBusyhandler(. 
243d0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
243e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
243f0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f        /* Pager o
24400 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 28  bject */.  int (
24410 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76  *xBusyHandler)(v
24420 6f 69 64 20 2a 29 2c 20 20 20 20 20 20 20 20 20  oid *),         
24430 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
24440 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74  sy-handler funct
24450 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ion */.  void *p
24460 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 20  BusyHandlerArg  
24470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24480 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73   Argument to pas
24490 73 20 74 6f 20 78 42 75 73 79 48 61 6e 64 6c 65  s to xBusyHandle
244a0 72 20 2a 2f 0a 29 7b 0a 20 20 70 50 61 67 65 72  r */.){.  pPager
244b0 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d  ->xBusyHandler =
244c0 20 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20   xBusyHandler;. 
244d0 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
244e0 6e 64 6c 65 72 41 72 67 20 3d 20 70 42 75 73 79  ndlerArg = pBusy
244f0 48 61 6e 64 6c 65 72 41 72 67 3b 0a 0a 20 20 69  HandlerArg;..  i
24500 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
24510 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 76 6f 69  ->fd) ){.    voi
24520 64 20 2a 2a 61 70 20 3d 20 28 76 6f 69 64 20 2a  d **ap = (void *
24530 2a 29 26 70 50 61 67 65 72 2d 3e 78 42 75 73 79  *)&pPager->xBusy
24540 48 61 6e 64 6c 65 72 3b 0a 20 20 20 20 61 73 73  Handler;.    ass
24550 65 72 74 28 20 28 28 69 6e 74 28 2a 29 28 76 6f  ert( ((int(*)(vo
24560 69 64 20 2a 29 29 28 61 70 5b 30 5d 29 29 3d 3d  id *))(ap[0]))==
24570 78 42 75 73 79 48 61 6e 64 6c 65 72 20 29 3b 0a  xBusyHandler );.
24580 20 20 20 20 61 73 73 65 72 74 28 20 61 70 5b 31      assert( ap[1
24590 5d 3d 3d 70 42 75 73 79 48 61 6e 64 6c 65 72 41  ]==pBusyHandlerA
245a0 72 67 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  rg );.    sqlite
245b0 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69  3OsFileControlHi
245c0 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  nt(pPager->fd, S
245d0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 42 55 53 59  QLITE_FCNTL_BUSY
245e0 48 41 4e 44 4c 45 52 2c 20 28 76 6f 69 64 20 2a  HANDLER, (void *
245f0 29 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  )ap);.  }.}../*.
24600 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70 61  ** Change the pa
24610 67 65 20 73 69 7a 65 20 75 73 65 64 20 62 79 20  ge size used by 
24620 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74  the Pager object
24630 2e 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 73  . The new page s
24640 69 7a 65 20 0a 2a 2a 20 69 73 20 70 61 73 73 65  ize .** is passe
24650 64 20 69 6e 20 2a 70 50 61 67 65 53 69 7a 65 2e  d in *pPageSize.
24660 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
24670 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 65 72  ger is in the er
24680 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20 74  ror state when t
24690 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
246a0 63 61 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20 69 73  called, it.** is
246b0 20 61 20 6e 6f 2d 6f 70 2e 20 54 68 65 20 76 61   a no-op. The va
246c0 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
246d0 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20  the error state 
246e0 65 72 72 6f 72 20 63 6f 64 65 20 28 69 2e 65 2e  error code (i.e.
246f0 20 0a 2a 2a 20 6f 6e 65 20 6f 66 20 53 51 4c 49   .** one of SQLI
24700 54 45 5f 49 4f 45 52 52 2c 20 61 6e 20 53 51 4c  TE_IOERR, an SQL
24710 49 54 45 5f 49 4f 45 52 52 5f 78 78 78 20 73 75  ITE_IOERR_xxx su
24720 62 2d 63 6f 64 65 20 6f 72 20 53 51 4c 49 54 45  b-code or SQLITE
24730 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74  _FULL)..**.** Ot
24740 68 65 72 77 69 73 65 2c 20 69 66 20 61 6c 6c 20  herwise, if all 
24750 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
24760 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a   are true:.**.**
24770 20 20 20 2a 20 74 68 65 20 6e 65 77 20 70 61 67     * the new pag
24780 65 20 73 69 7a 65 20 28 76 61 6c 75 65 20 6f 66  e size (value of
24790 20 2a 70 50 61 67 65 53 69 7a 65 29 20 69 73 20   *pPageSize) is 
247a0 76 61 6c 69 64 20 28 61 20 70 6f 77 65 72 20 0a  valid (a power .
247b0 2a 2a 20 20 20 20 20 6f 66 20 74 77 6f 20 62 65  **     of two be
247c0 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 53 51  tween 512 and SQ
247d0 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
247e0 5a 45 2c 20 69 6e 63 6c 75 73 69 76 65 29 2c 20  ZE, inclusive), 
247f0 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68  and.**.**   * th
24800 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74  ere are no outst
24810 61 6e 64 69 6e 67 20 70 61 67 65 20 72 65 66 65  anding page refe
24820 72 65 6e 63 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a  rences, and.**.*
24830 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61 62 61  *   * the databa
24840 73 65 20 69 73 20 65 69 74 68 65 72 20 6e 6f 74  se is either not
24850 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
24860 74 61 62 61 73 65 20 6f 72 20 69 74 20 69 73 0a  tabase or it is.
24870 2a 2a 20 20 20 20 20 61 6e 20 69 6e 2d 6d 65 6d  **     an in-mem
24880 6f 72 79 20 64 61 74 61 62 61 73 65 20 74 68 61  ory database tha
24890 74 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73  t currently cons
248a0 69 73 74 73 20 6f 66 20 7a 65 72 6f 20 70 61 67  ists of zero pag
248b0 65 73 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74  es..**.** then t
248c0 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20  he pager object 
248d0 70 61 67 65 20 73 69 7a 65 20 69 73 20 73 65 74  page size is set
248e0 20 74 6f 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a   to *pPageSize..
248f0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
24900 65 20 73 69 7a 65 20 69 73 20 63 68 61 6e 67 65  e size is change
24910 64 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  d, then this fun
24920 63 74 69 6f 6e 20 75 73 65 73 20 73 71 6c 69 74  ction uses sqlit
24930 65 33 50 61 67 65 72 4d 61 6c 6c 6f 63 28 29 20  e3PagerMalloc() 
24940 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  .** to obtain a 
24950 6e 65 77 20 50 61 67 65 72 2e 70 54 6d 70 53 70  new Pager.pTmpSp
24960 61 63 65 20 62 75 66 66 65 72 2e 20 49 66 20 74  ace buffer. If t
24970 68 69 73 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61  his allocation a
24980 74 74 65 6d 70 74 20 0a 2a 2a 20 66 61 69 6c 73  ttempt .** fails
24990 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  , SQLITE_NOMEM i
249a0 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  s returned and t
249b0 68 65 20 70 61 67 65 20 73 69 7a 65 20 72 65 6d  he page size rem
249c0 61 69 6e 73 20 75 6e 63 68 61 6e 67 65 64 2e 20  ains unchanged. 
249d0 0a 2a 2a 20 49 6e 20 61 6c 6c 20 6f 74 68 65 72  .** In all other
249e0 20 63 61 73 65 73 2c 20 53 51 4c 49 54 45 5f 4f   cases, SQLITE_O
249f0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
24a00 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
24a10 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 63 68 61   size is not cha
24a20 6e 67 65 64 2c 20 65 69 74 68 65 72 20 62 65 63  nged, either bec
24a30 61 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 65 20  ause one of the 
24a40 65 6e 75 6d 65 72 61 74 65 64 0a 2a 2a 20 63 6f  enumerated.** co
24a50 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 69  nditions above i
24a60 73 20 6e 6f 74 20 74 72 75 65 2c 20 74 68 65 20  s not true, the 
24a70 70 61 67 65 72 20 77 61 73 20 69 6e 20 65 72 72  pager was in err
24a80 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20 74 68  or state when th
24a90 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77  is.** function w
24aa0 61 73 20 63 61 6c 6c 65 64 2c 20 6f 72 20 62 65  as called, or be
24ab0 63 61 75 73 65 20 74 68 65 20 6d 65 6d 6f 72 79  cause the memory
24ac0 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65   allocation atte
24ad0 6d 70 74 20 66 61 69 6c 65 64 2c 20 0a 2a 2a 20  mpt failed, .** 
24ae0 74 68 65 6e 20 2a 70 50 61 67 65 53 69 7a 65 20  then *pPageSize 
24af0 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 6c  is set to the ol
24b00 64 2c 20 72 65 74 61 69 6e 65 64 20 70 61 67 65  d, retained page
24b10 20 73 69 7a 65 20 62 65 66 6f 72 65 20 72 65 74   size before ret
24b20 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73  urning..*/.int s
24b30 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
24b40 67 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50  gesize(Pager *pP
24b50 61 67 65 72 2c 20 75 33 32 20 2a 70 50 61 67 65  ager, u32 *pPage
24b60 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72  Size, int nReser
24b70 76 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ve){.  int rc = 
24b80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
24b90 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   It is not possi
24ba0 62 6c 65 20 74 6f 20 64 6f 20 61 20 66 75 6c 6c  ble to do a full
24bb0 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
24bc0 61 74 65 28 29 20 68 65 72 65 2c 20 61 73 20 74  ate() here, as t
24bd0 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  his.  ** functio
24be0 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  n may be called 
24bf0 66 72 6f 6d 20 77 69 74 68 69 6e 20 50 61 67 65  from within Page
24c00 72 4f 70 65 6e 28 29 2c 20 62 65 66 6f 72 65 20  rOpen(), before 
24c10 74 68 65 20 73 74 61 74 65 0a 20 20 2a 2a 20 6f  the state.  ** o
24c20 66 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  f the Pager obje
24c30 63 74 20 69 73 20 69 6e 74 65 72 6e 61 6c 6c 79  ct is internally
24c40 20 63 6f 6e 73 69 73 74 65 6e 74 2e 0a 20 20 2a   consistent..  *
24c50 2a 0a 20 20 2a 2a 20 41 74 20 6f 6e 65 20 70 6f  *.  ** At one po
24c60 69 6e 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f  int this functio
24c70 6e 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72  n returned an er
24c80 72 6f 72 20 69 66 20 74 68 65 20 70 61 67 65 72  ror if the pager
24c90 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20 50 41   was in .  ** PA
24ca0 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e  GER_ERROR state.
24cb0 20 42 75 74 20 73 69 6e 63 65 20 50 41 47 45 52   But since PAGER
24cc0 5f 45 52 52 4f 52 20 73 74 61 74 65 20 67 75 61  _ERROR state gua
24cd0 72 61 6e 74 65 65 73 20 74 68 61 74 0a 20 20 2a  rantees that.  *
24ce0 2a 20 74 68 65 72 65 20 69 73 20 61 74 20 6c 65  * there is at le
24cf0 61 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64  ast one outstand
24d00 69 6e 67 20 70 61 67 65 20 72 65 66 65 72 65 6e  ing page referen
24d10 63 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ce, this functio
24d20 6e 0a 20 20 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f  n.  ** is a no-o
24d30 70 20 66 6f 72 20 74 68 61 74 20 63 61 73 65 20  p for that case 
24d40 61 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a 0a 20 20  anyhow..  */..  
24d50 75 33 32 20 70 61 67 65 53 69 7a 65 20 3d 20 2a  u32 pageSize = *
24d60 70 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73  pPageSize;.  ass
24d70 65 72 74 28 20 70 61 67 65 53 69 7a 65 3d 3d 30  ert( pageSize==0
24d80 20 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e 3d 35   || (pageSize>=5
24d90 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d  12 && pageSize<=
24da0 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
24db0 53 49 5a 45 29 20 29 3b 0a 20 20 69 66 28 20 28  SIZE) );.  if( (
24dc0 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30  pPager->memDb==0
24dd0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69   || pPager->dbSi
24de0 7a 65 3d 3d 30 29 0a 20 20 20 26 26 20 73 71 6c  ze==0).   && sql
24df0 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
24e00 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
24e10 68 65 29 3d 3d 30 20 0a 20 20 20 26 26 20 70 61  he)==0 .   && pa
24e20 67 65 53 69 7a 65 20 26 26 20 70 61 67 65 53 69  geSize && pageSi
24e30 7a 65 21 3d 28 75 33 32 29 70 50 61 67 65 72 2d  ze!=(u32)pPager-
24e40 3e 70 61 67 65 53 69 7a 65 20 0a 20 20 29 7b 0a  >pageSize .  ){.
24e50 20 20 20 20 63 68 61 72 20 2a 70 4e 65 77 20 3d      char *pNew =
24e60 20 4e 55 4c 4c 3b 20 20 20 20 20 20 20 20 20 20   NULL;          
24e70 20 20 20 2f 2a 20 4e 65 77 20 74 65 6d 70 20 73     /* New temp s
24e80 70 61 63 65 20 2a 2f 0a 20 20 20 20 69 36 34 20  pace */.    i64 
24e90 6e 42 79 74 65 20 3d 20 30 3b 0a 0a 20 20 20 20  nByte = 0;..    
24ea0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  if( pPager->eSta
24eb0 74 65 3e 50 41 47 45 52 5f 4f 50 45 4e 20 26 26  te>PAGER_OPEN &&
24ec0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
24ed0 66 64 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  fd) ){.      rc 
24ee0 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
24ef0 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ize(pPager->fd, 
24f00 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20  &nByte);.    }. 
24f10 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
24f20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 4e  E_OK ){.      pN
24f30 65 77 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  ew = (char *)sql
24f40 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70  ite3PageMalloc(p
24f50 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
24f60 69 66 28 20 21 70 4e 65 77 20 29 20 72 63 20 3d  if( !pNew ) rc =
24f70 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
24f80 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  PT;.    }..    i
24f90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
24fa0 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
24fb0 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
24fc0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
24fd0 33 50 63 61 63 68 65 53 65 74 50 61 67 65 53 69  3PcacheSetPageSi
24fe0 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ze(pPager->pPCac
24ff0 68 65 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20  he, pageSize);. 
25000 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
25010 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
25020 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46      sqlite3PageF
25030 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70  ree(pPager->pTmp
25040 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 70 50  Space);.      pP
25050 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20  ager->pTmpSpace 
25060 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 70 50  = pNew;.      pP
25070 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 28  ager->dbSize = (
25080 50 67 6e 6f 29 28 28 6e 42 79 74 65 2b 70 61 67  Pgno)((nByte+pag
25090 65 53 69 7a 65 2d 31 29 2f 70 61 67 65 53 69 7a  eSize-1)/pageSiz
250a0 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  e);.      pPager
250b0 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67  ->pageSize = pag
250c0 65 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73 65  eSize;.    }else
250d0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
250e0 61 67 65 46 72 65 65 28 70 4e 65 77 29 3b 0a 20  ageFree(pNew);. 
250f0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 61     }.  }..  *pPa
25100 67 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  geSize = pPager-
25110 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 69 66 28  >pageSize;.  if(
25120 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
25130 7b 0a 20 20 20 20 69 66 28 20 6e 52 65 73 65 72  {.    if( nReser
25140 76 65 3c 30 20 29 20 6e 52 65 73 65 72 76 65 20  ve<0 ) nReserve 
25150 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72  = pPager->nReser
25160 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ve;.    assert( 
25170 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e  nReserve>=0 && n
25180 52 65 73 65 72 76 65 3c 31 30 30 30 20 29 3b 0a  Reserve<1000 );.
25190 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73      pPager->nRes
251a0 65 72 76 65 20 3d 20 28 69 31 36 29 6e 52 65 73  erve = (i16)nRes
251b0 65 72 76 65 3b 0a 20 20 20 20 70 61 67 65 72 52  erve;.    pagerR
251c0 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72  eportSize(pPager
251d0 29 3b 0a 20 20 20 20 70 61 67 65 72 46 69 78 4d  );.    pagerFixM
251e0 61 70 6c 69 6d 69 74 28 70 50 61 67 65 72 29 3b  aplimit(pPager);
251f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
25200 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
25210 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
25220 68 65 20 22 74 65 6d 70 6f 72 61 72 79 20 70 61  he "temporary pa
25230 67 65 22 20 62 75 66 66 65 72 20 68 65 6c 64 20  ge" buffer held 
25240 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79  internally.** by
25250 20 74 68 65 20 70 61 67 65 72 2e 20 20 54 68 69   the pager.  Thi
25260 73 20 69 73 20 61 20 62 75 66 66 65 72 20 74 68  s is a buffer th
25270 61 74 20 69 73 20 62 69 67 20 65 6e 6f 75 67 68  at is big enough
25280 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20   to hold the.** 
25290 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f  entire content o
252a0 66 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67  f a database pag
252b0 65 2e 20 20 54 68 69 73 20 62 75 66 66 65 72 20  e.  This buffer 
252c0 69 73 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c  is used internal
252d0 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f 6c  ly.** during rol
252e0 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20 62  lback and will b
252f0 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 68  e overwritten wh
25300 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63  enever a rollbac
25310 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42 75  k.** occurs.  Bu
25320 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73 20  t other modules 
25330 61 72 65 20 66 72 65 65 20 74 6f 20 75 73 65 20  are free to use 
25340 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20  it too, as long 
25350 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63  as.** no rollbac
25360 6b 73 20 61 72 65 20 68 61 70 70 65 6e 69 6e 67  ks are happening
25370 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
25380 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65  e3PagerTempSpace
25390 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
253a0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
253b0 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a  ->pTmpSpace;.}..
253c0 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
253d0 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d   set the maximum
253e0 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63   database page c
253f0 6f 75 6e 74 20 69 66 20 6d 78 50 61 67 65 20 69  ount if mxPage i
25400 73 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20  s positive. .** 
25410 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20  Make no changes 
25420 69 66 20 6d 78 50 61 67 65 20 69 73 20 7a 65 72  if mxPage is zer
25430 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 20 20  o or negative.  
25440 41 6e 64 20 6e 65 76 65 72 20 72 65 64 75 63 65  And never reduce
25450 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20   the.** maximum 
25460 70 61 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77  page count below
25470 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
25480 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
25490 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c  e..**.** Regardl
254a0 65 73 73 20 6f 66 20 6d 78 50 61 67 65 2c 20 72  ess of mxPage, r
254b0 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
254c0 74 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  t maximum page c
254d0 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ount..*/.int sql
254e0 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65  ite3PagerMaxPage
254f0 43 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61  Count(Pager *pPa
25500 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29  ger, int mxPage)
25510 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 30  {.  if( mxPage>0
25520 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
25530 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b  mxPgno = mxPage;
25540 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
25550 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
25560 41 47 45 52 5f 4f 50 45 4e 20 29 3b 20 20 20 20  AGER_OPEN );    
25570 20 20 2f 2a 20 43 61 6c 6c 65 64 20 6f 6e 6c 79    /* Called only
25580 20 62 79 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20   by OP_MaxPgcnt 
25590 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
255a0 67 65 72 2d 3e 6d 78 50 67 6e 6f 3e 3d 70 50 61  ger->mxPgno>=pPa
255b0 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 20 20  ger->dbSize );  
255c0 2f 2a 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20 65  /* OP_MaxPgcnt e
255d0 6e 66 6f 72 63 65 73 20 74 68 69 73 20 2a 2f 0a  nforces this */.
255e0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
255f0 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a  >mxPgno;.}../*.*
25600 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
25610 73 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20  set of routines 
25620 61 72 65 20 75 73 65 64 20 74 6f 20 64 69 73 61  are used to disa
25630 62 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65  ble the simulate
25640 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d  d.** I/O error m
25650 65 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65  echanism.  These
25660 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73   routines are us
25670 65 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75  ed to avoid simu
25680 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20  lated.** errors 
25690 69 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65 20  in places where 
256a0 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61  we do not care a
256b0 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a  bout errors..**.
256c0 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49  ** Unless -DSQLI
256d0 54 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65  TE_TEST=1 is use
256e0 64 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65  d, these routine
256f0 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73  s are all no-ops
25700 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65  .** and generate
25710 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66   no code..*/.#if
25720 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
25730 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
25740 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
25750 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20  ing;.extern int 
25760 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
25770 5f 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74  _hit;.static int
25780 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64   saved_cnt;.void
25790 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
257a0 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69  ed_io_errors(voi
257b0 64 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20  d){.  saved_cnt 
257c0 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72  = sqlite3_io_err
257d0 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71  or_pending;.  sq
257e0 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
257f0 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76  ending = -1;.}.v
25800 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c  oid enable_simul
25810 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76  ated_io_errors(v
25820 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  oid){.  sqlite3_
25830 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
25840 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a   = saved_cnt;.}.
25850 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64  #else.# define d
25860 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
25870 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64  _io_errors().# d
25880 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d  efine enable_sim
25890 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
258a0 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  ().#endif../*.**
258b0 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20   Read the first 
258c0 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65  N bytes from the
258d0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
258e0 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f  e file into memo
258f0 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74  ry.** that pDest
25900 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a   points to. .**.
25910 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
25920 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20  was opened on a 
25930 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 20 28  transient file (
25940 7a 46 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c 20  zFilename==""), 
25950 6f 72 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e 20  or.** opened on 
25960 61 20 66 69 6c 65 20 6c 65 73 73 20 74 68 61 6e  a file less than
25970 20 4e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65   N bytes in size
25980 2c 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66  , the output buf
25990 66 65 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65 64  fer is.** zeroed
259a0 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
259b0 65 74 75 72 6e 65 64 2e 20 54 68 65 20 72 61 74  eturned. The rat
259c0 69 6f 6e 61 6c 65 20 66 6f 72 20 74 68 69 73 20  ionale for this 
259d0 69 73 20 74 68 61 74 20 74 68 69 73 20 0a 2a 2a  is that this .**
259e0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
259f0 64 20 74 6f 20 72 65 61 64 20 64 61 74 61 62 61  d to read databa
25a00 73 65 20 68 65 61 64 65 72 73 2c 20 61 6e 64 20  se headers, and 
25a10 61 20 6e 65 77 20 74 72 61 6e 73 69 65 6e 74 20  a new transient 
25a20 6f 72 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65 64  or.** zero sized
25a30 20 64 61 74 61 62 61 73 65 20 68 61 73 20 61 20   database has a 
25a40 68 65 61 64 65 72 20 74 68 61 6e 20 63 6f 6e 73  header than cons
25a50 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66  ists entirely of
25a60 20 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49   zeroes..**.** I
25a70 66 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 20 61  f any IO error a
25a80 70 61 72 74 20 66 72 6f 6d 20 53 51 4c 49 54 45  part from SQLITE
25a90 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
25aa0 44 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  D is encountered
25ab0 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 63  ,.** the error c
25ac0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
25ad0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6e  to the caller an
25ae0 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  d the contents o
25af0 66 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20  f the.** output 
25b00 62 75 66 66 65 72 20 75 6e 64 65 66 69 6e 65 64  buffer undefined
25b10 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
25b20 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61  PagerReadFilehea
25b30 64 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  der(Pager *pPage
25b40 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e  r, int N, unsign
25b50 65 64 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b  ed char *pDest){
25b60 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
25b70 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28  TE_OK;.  memset(
25b80 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20  pDest, 0, N);.  
25b90 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
25ba0 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50  Pager->fd) || pP
25bb0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
25bc0 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75  ;..  /* This rou
25bd0 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tine is only cal
25be0 6c 65 64 20 62 79 20 62 74 72 65 65 20 69 6d 6d  led by btree imm
25bf0 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 63  ediately after c
25c00 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65  reating.  ** the
25c10 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 20   Pager object.  
25c20 54 68 65 72 65 20 68 61 73 20 6e 6f 74 20 62 65  There has not be
25c30 65 6e 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74  en an opportunit
25c40 79 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 0a  y to transition.
25c50 20 20 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f 64 65    ** to WAL mode
25c60 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   yet..  */.  ass
25c70 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
25c80 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  l(pPager) );..  
25c90 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
25ca0 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 49 4f  r->fd) ){.    IO
25cb0 54 52 41 43 45 28 28 22 44 42 48 44 52 20 25 70  TRACE(("DBHDR %p
25cc0 20 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72   0 %d\n", pPager
25cd0 2c 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73  , N)).    rc = s
25ce0 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
25cf0 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20  ger->fd, pDest, 
25d00 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  N, 0);.    if( r
25d10 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
25d20 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
25d30 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
25d40 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
25d50 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
25d60 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
25d70 6e 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61  n may only be ca
25d80 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 65 61 64  lled when a read
25d90 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
25da0 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 70  open on.** the p
25db0 61 67 65 72 2e 20 49 74 20 72 65 74 75 72 6e 73  ager. It returns
25dc0 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
25dd0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
25de0 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  e database..**.*
25df0 2a 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68  * However, if th
25e00 65 20 66 69 6c 65 20 69 73 20 62 65 74 77 65 65  e file is betwee
25e10 6e 20 31 20 61 6e 64 20 3c 70 61 67 65 2d 73 69  n 1 and <page-si
25e20 7a 65 3e 20 62 79 74 65 73 20 69 6e 20 73 69 7a  ze> bytes in siz
25e30 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73  e, then .** this
25e40 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
25e50 20 31 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2f   1 page file..*/
25e60 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
25e70 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65  erPagecount(Page
25e80 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a  r *pPager, int *
25e90 70 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72  pnPage){.  asser
25ea0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
25eb0 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e>=PAGER_READER 
25ec0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
25ed0 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
25ee0 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48  ER_WRITER_FINISH
25ef0 45 44 20 29 3b 0a 20 20 2a 70 6e 50 61 67 65 20  ED );.  *pnPage 
25f00 3d 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 64  = (int)pPager->d
25f10 62 53 69 7a 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  bSize;.}.../*.**
25f20 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61   Try to obtain a
25f30 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c 6f   lock of type lo
25f40 63 6b 74 79 70 65 20 6f 6e 20 74 68 65 20 64 61  cktype on the da
25f50 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a  tabase file. If.
25f60 2a 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f 72 20  ** a similar or 
25f70 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20  greater lock is 
25f80 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 74 68  already held, th
25f90 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
25fa0 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75 72   no-op.** (retur
25fb0 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ning SQLITE_OK i
25fc0 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a  mmediately)..**.
25fd0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74  ** Otherwise, at
25fe0 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20  tempt to obtain 
25ff0 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 73  the lock using s
26000 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e 20  qlite3OsLock(). 
26010 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20 62  Invoke .** the b
26020 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20  usy callback if 
26030 74 68 65 20 6c 6f 63 6b 20 69 73 20 63 75 72 72  the lock is curr
26040 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61  ently not availa
26050 62 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a 20  ble. Repeat .** 
26060 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20 63  until the busy c
26070 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20  allback returns 
26080 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74  false or until t
26090 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a  he attempt to .*
260a0 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63  * obtain the loc
260b0 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a  k succeeds..**.*
260c0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
260d0 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e  OK on success an
260e0 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
260f0 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74  if we cannot obt
26100 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e  ain.** the lock.
26110 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20   If the lock is 
26120 6f 62 74 61 69 6e 65 64 20 73 75 63 63 65 73 73  obtained success
26130 66 75 6c 6c 79 2c 20 73 65 74 20 74 68 65 20 50  fully, set the P
26140 61 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20 76  ager.state .** v
26150 61 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 74  ariable to lockt
26160 79 70 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ype before retur
26170 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
26180 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  int pager_wait_o
26190 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  n_lock(Pager *pP
261a0 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79  ager, int lockty
261b0 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  pe){.  int rc;  
261c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
261d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
261e0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
261f0 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
26200 68 69 73 20 69 73 20 65 69 74 68 65 72 20 61 20  his is either a 
26210 6e 6f 2d 6f 70 20 28 62 65 63 61 75 73 65 20 74  no-op (because t
26220 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
26230 6b 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72 65 61  k is .  ** alrea
26240 64 79 20 68 65 6c 64 29 2c 20 6f 72 20 6f 6e 65  dy held), or one
26250 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69 74 69   of the transiti
26260 6f 6e 73 20 74 68 61 74 20 74 68 65 20 62 75 73  ons that the bus
26270 79 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d  y-handler.  ** m
26280 61 79 20 62 65 20 69 6e 76 6f 6b 65 64 20 64 75  ay be invoked du
26290 72 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e 67 20  ring, according 
262a0 74 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61  to the comment a
262b0 62 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65  bove.  ** sqlite
262c0 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e  3PagerSetBusyhan
262d0 64 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61  dler()..  */.  a
262e0 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e  ssert( (pPager->
262f0 65 4c 6f 63 6b 3e 3d 6c 6f 63 6b 74 79 70 65 29  eLock>=locktype)
26300 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67  .       || (pPag
26310 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f  er->eLock==NO_LO
26320 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d  CK && locktype==
26330 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20  SHARED_LOCK).   
26340 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
26350 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
26360 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65  LOCK && locktype
26370 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
26380 29 0a 20 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20  ).  );..  do {. 
26390 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63     rc = pagerLoc
263a0 6b 44 62 28 70 50 61 67 65 72 2c 20 6c 6f 63 6b  kDb(pPager, lock
263b0 74 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28  type);.  }while(
263c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
263d0 20 26 26 20 70 50 61 67 65 72 2d 3e 78 42 75 73   && pPager->xBus
263e0 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d  yHandler(pPager-
263f0 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  >pBusyHandlerArg
26400 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ) );.  return rc
26410 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74  ;.}../*.** Funct
26420 69 6f 6e 20 61 73 73 65 72 74 54 72 75 6e 63 61  ion assertTrunca
26430 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61  teConstraint(pPa
26440 67 65 72 29 20 63 68 65 63 6b 73 20 74 68 61 74  ger) checks that
26450 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20   one of the .** 
26460 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75  following is tru
26470 65 20 66 6f 72 20 61 6c 6c 20 64 69 72 74 79 20  e for all dirty 
26480 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20  pages currently 
26490 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63 68  in the page-cach
264a0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 54 68  e:.**.**   a) Th
264b0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
264c0 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
264d0 75 61 6c 20 74 6f 20 74 68 65 20 73 69 7a 65 20  ual to the size 
264e0 6f 66 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20  of the .**      
264f0 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65  current database
26500 20 69 6d 61 67 65 2c 20 69 6e 20 70 61 67 65 73   image, in pages
26510 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20  , OR.**.**   b) 
26520 69 66 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  if the page cont
26530 65 6e 74 20 77 65 72 65 20 77 72 69 74 74 65 6e  ent were written
26540 20 61 74 20 74 68 69 73 20 74 69 6d 65 2c 20 69   at this time, i
26550 74 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20  t would not.**  
26560 20 20 20 20 62 65 20 6e 65 63 65 73 73 61 72 79      be necessary
26570 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 63 75   to write the cu
26580 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 20 6f 75  rrent content ou
26590 74 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  t to the sub-jou
265a0 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 28 61 73  rnal.**      (as
265b0 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 66   determined by f
265c0 75 6e 63 74 69 6f 6e 20 73 75 62 6a 52 65 71 75  unction subjRequ
265d0 69 72 65 73 50 61 67 65 28 29 29 2e 0a 2a 2a 0a  iresPage())..**.
265e0 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 64 69 74  ** If the condit
265f0 69 6f 6e 20 61 73 73 65 72 74 65 64 20 62 79 20  ion asserted by 
26600 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 65  this function we
26610 72 65 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64  re not true, and
26620 20 74 68 65 0a 2a 2a 20 64 69 72 74 79 20 70 61   the.** dirty pa
26630 67 65 20 77 65 72 65 20 74 6f 20 62 65 20 64 69  ge were to be di
26640 73 63 61 72 64 65 64 20 66 72 6f 6d 20 74 68 65  scarded from the
26650 20 63 61 63 68 65 20 76 69 61 20 74 68 65 20 70   cache via the p
26660 61 67 65 72 53 74 72 65 73 73 28 29 0a 2a 2a 20  agerStress().** 
26670 72 6f 75 74 69 6e 65 2c 20 70 61 67 65 72 53 74  routine, pagerSt
26680 72 65 73 73 28 29 20 77 6f 75 6c 64 20 6e 6f 74  ress() would not
26690 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65   write the curre
266a0 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  nt page content 
266b0 74 6f 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  to.** the databa
266c0 73 65 20 66 69 6c 65 2e 20 49 66 20 61 20 73 61  se file. If a sa
266d0 76 65 70 6f 69 6e 74 20 74 72 61 6e 73 61 63 74  vepoint transact
266e0 69 6f 6e 20 77 65 72 65 20 72 6f 6c 6c 65 64 20  ion were rolled 
266f0 62 61 63 6b 20 61 66 74 65 72 0a 2a 2a 20 74 68  back after.** th
26700 69 73 20 68 61 70 70 65 6e 65 64 2c 20 74 68 65  is happened, the
26710 20 63 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f   correct behavio
26720 72 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 72 65  r would be to re
26730 73 74 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e  store the curren
26740 74 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20  t.** content of 
26750 74 68 65 20 70 61 67 65 2e 20 48 6f 77 65 76 65  the page. Howeve
26760 72 2c 20 73 69 6e 63 65 20 74 68 69 73 20 63 6f  r, since this co
26770 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 70 72 65  ntent is not pre
26780 73 65 6e 74 20 69 6e 20 65 69 74 68 65 72 0a 2a  sent in either.*
26790 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
267a0 69 6c 65 20 6f 72 20 74 68 65 20 70 6f 72 74 69  ile or the porti
267b0 6f 6e 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61  on of the rollba
267c0 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 0a  ck journal and .
267d0 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 72  ** sub-journal r
267e0 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 63  olled back the c
267f0 6f 6e 74 65 6e 74 20 63 6f 75 6c 64 20 6e 6f 74  ontent could not
26800 20 62 65 20 72 65 73 74 6f 72 65 64 20 61 6e 64   be restored and
26810 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
26820 20 69 6d 61 67 65 20 77 6f 75 6c 64 20 62 65 63   image would bec
26830 6f 6d 65 20 63 6f 72 72 75 70 74 2e 20 49 74 20  ome corrupt. It 
26840 69 73 20 74 68 65 72 65 66 6f 72 65 20 66 6f 72  is therefore for
26850 74 75 6e 61 74 65 20 74 68 61 74 20 0a 2a 2a 20  tunate that .** 
26860 74 68 69 73 20 63 69 72 63 75 6d 73 74 61 6e 63  this circumstanc
26870 65 20 63 61 6e 6e 6f 74 20 61 72 69 73 65 2e 0a  e cannot arise..
26880 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
26890 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 73 74 61  QLITE_DEBUG).sta
268a0 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 54  tic void assertT
268b0 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
268c0 74 43 62 28 50 67 48 64 72 20 2a 70 50 67 29 7b  tCb(PgHdr *pPg){
268d0 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
268e0 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54  flags&PGHDR_DIRT
268f0 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  Y );.  assert( !
26900 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
26910 28 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67  (pPg) || pPg->pg
26920 6e 6f 3c 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d  no<=pPg->pPager-
26930 3e 64 62 53 69 7a 65 20 29 3b 0a 7d 0a 73 74 61  >dbSize );.}.sta
26940 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 54  tic void assertT
26950 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
26960 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
26970 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
26980 65 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50  eIterateDirty(pP
26990 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 61  ager->pPCache, a
269a0 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
269b0 73 74 72 61 69 6e 74 43 62 29 3b 0a 7d 0a 23 65  straintCb);.}.#e
269c0 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 61 73 73  lse.# define ass
269d0 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74  ertTruncateConst
269e0 72 61 69 6e 74 28 70 50 61 67 65 72 29 0a 23 65  raint(pPager).#e
269f0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e  ndif../*.** Trun
26a00 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  cate the in-memo
26a10 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ry database file
26a20 20 69 6d 61 67 65 20 74 6f 20 6e 50 61 67 65 20   image to nPage 
26a30 70 61 67 65 73 2e 20 54 68 69 73 20 0a 2a 2a 20  pages. This .** 
26a40 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
26a50 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66  t actually modif
26a60 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  y the database f
26a70 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 49 74 20  ile on disk. It 
26a80 0a 2a 2a 20 6a 75 73 74 20 73 65 74 73 20 74 68  .** just sets th
26a90 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65  e internal state
26aa0 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 6f 62   of the pager ob
26ab0 6a 65 63 74 20 73 6f 20 74 68 61 74 20 74 68 65  ject so that the
26ac0 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6f 6e 20   .** truncation 
26ad0 77 69 6c 6c 20 62 65 20 64 6f 6e 65 20 77 68 65  will be done whe
26ae0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  n the current tr
26af0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
26b00 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  mitted..**.** Th
26b10 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
26b20 6e 6c 79 20 63 61 6c 6c 65 64 20 72 69 67 68 74  nly called right
26b30 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69   before committi
26b40 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ng a transaction
26b50 2e 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 66  ..** Once this f
26b60 75 6e 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  unction has been
26b70 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 74 72 61   called, the tra
26b80 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 65 69  nsaction must ei
26b90 74 68 65 72 20 62 65 0a 2a 2a 20 72 6f 6c 6c 65  ther be.** rolle
26ba0 64 20 62 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74  d back or commit
26bb0 74 65 64 2e 20 49 74 20 69 73 20 6e 6f 74 20 73  ted. It is not s
26bc0 61 66 65 20 74 6f 20 63 61 6c 6c 20 74 68 69 73  afe to call this
26bd0 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a   function and.**
26be0 20 74 68 65 6e 20 63 6f 6e 74 69 6e 75 65 20 77   then continue w
26bf0 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
26c00 74 61 62 61 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20  tabase..*/.void 
26c10 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
26c20 63 61 74 65 49 6d 61 67 65 28 50 61 67 65 72 20  cateImage(Pager 
26c30 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50  *pPager, Pgno nP
26c40 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  age){.  assert( 
26c50 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d  pPager->dbSize>=
26c60 6e 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  nPage );.  asser
26c70 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
26c80 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
26c90 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20 70 50  CACHEMOD );.  pP
26ca0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
26cb0 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 41 74 20 6f  Page;..  /* At o
26cc0 6e 65 20 70 6f 69 6e 74 20 74 68 65 20 63 6f 64  ne point the cod
26cd0 65 20 68 65 72 65 20 63 61 6c 6c 65 64 20 61 73  e here called as
26ce0 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
26cf0 74 72 61 69 6e 74 28 29 20 74 6f 0a 20 20 2a 2a  traint() to.  **
26d00 20 65 6e 73 75 72 65 20 74 68 61 74 20 61 6c 6c   ensure that all
26d10 20 70 61 67 65 73 20 62 65 69 6e 67 20 74 72 75   pages being tru
26d20 6e 63 61 74 65 64 20 61 77 61 79 20 62 79 20 74  ncated away by t
26d30 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 61 72  his operation ar
26d40 65 2c 0a 20 20 2a 2a 20 69 66 20 6f 6e 65 20 6f  e,.  ** if one o
26d50 72 20 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e 74  r more savepoint
26d60 73 20 61 72 65 20 6f 70 65 6e 2c 20 70 72 65 73  s are open, pres
26d70 65 6e 74 20 69 6e 20 74 68 65 20 73 61 76 65 70  ent in the savep
26d80 6f 69 6e 74 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e  oint .  ** journ
26d90 61 6c 20 73 6f 20 74 68 61 74 20 74 68 65 79 20  al so that they 
26da0 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20  can be restored 
26db0 69 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  if the savepoint
26dc0 20 69 73 20 72 6f 6c 6c 65 64 0a 20 20 2a 2a 20   is rolled.  ** 
26dd0 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 6e 6f  back. This is no
26de0 20 6c 6f 6e 67 65 72 20 6e 65 63 65 73 73 61 72   longer necessar
26df0 79 20 61 73 20 74 68 69 73 20 66 75 6e 63 74 69  y as this functi
26e00 6f 6e 20 69 73 20 6e 6f 77 20 6f 6e 6c 79 0a 20  on is now only. 
26e10 20 2a 2a 20 63 61 6c 6c 65 64 20 72 69 67 68 74   ** called right
26e20 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69   before committi
26e30 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ng a transaction
26e40 2e 20 53 6f 20 61 6c 74 68 6f 75 67 68 20 74 68  . So although th
26e50 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 20 6f 62  e .  ** Pager ob
26e60 6a 65 63 74 20 6d 61 79 20 73 74 69 6c 6c 20 68  ject may still h
26e70 61 76 65 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  ave open savepoi
26e80 6e 74 73 20 28 50 61 67 65 72 2e 6e 53 61 76 65  nts (Pager.nSave
26e90 70 6f 69 6e 74 21 3d 30 29 2c 20 0a 20 20 2a 2a  point!=0), .  **
26ea0 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 62 65 20   they cannot be 
26eb0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 53 6f 20  rolled back. So 
26ec0 74 68 65 20 61 73 73 65 72 74 54 72 75 6e 63 61  the assertTrunca
26ed0 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 29 20 63  teConstraint() c
26ee0 61 6c 6c 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 6c  all.  ** is no l
26ef0 6f 6e 67 65 72 20 63 6f 72 72 65 63 74 2e 20 2a  onger correct. *
26f00 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  /.}.../*.** This
26f10 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
26f20 6c 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d  led before attem
26f30 70 74 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72  pting a hot-jour
26f40 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 74  nal rollback. It
26f50 0a 2a 2a 20 73 79 6e 63 73 20 74 68 65 20 6a 6f  .** syncs the jo
26f60 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 64 69  urnal file to di
26f70 73 6b 2c 20 74 68 65 6e 20 73 65 74 73 20 70 50  sk, then sets pP
26f80 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
26f90 20 74 6f 20 74 68 65 0a 2a 2a 20 73 69 7a 65 20   to the.** size 
26fa0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
26fb0 69 6c 65 20 73 6f 20 74 68 61 74 20 74 68 65 20  ile so that the 
26fc0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
26fd0 20 72 6f 75 74 69 6e 65 20 6b 6e 6f 77 73 0a 2a   routine knows.*
26fe0 2a 20 74 68 61 74 20 74 68 65 20 65 6e 74 69 72  * that the entir
26ff0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
27000 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a  as been synced..
27010 2a 2a 0a 2a 2a 20 53 79 6e 63 69 6e 67 20 61 20  **.** Syncing a 
27020 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 64  hot-journal to d
27030 69 73 6b 20 62 65 66 6f 72 65 20 61 74 74 65 6d  isk before attem
27040 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74  pting to roll it
27050 20 62 61 63 6b 20 65 6e 73 75 72 65 73 20 0a 2a   back ensures .*
27060 2a 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65  * that if a powe
27070 72 2d 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  r-failure occurs
27080 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c   during the roll
27090 62 61 63 6b 2c 20 74 68 65 20 70 72 6f 63 65 73  back, the proces
270a0 73 20 74 68 61 74 0a 2a 2a 20 61 74 74 65 6d 70  s that.** attemp
270b0 74 73 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c  ts rollback foll
270c0 6f 77 69 6e 67 20 73 79 73 74 65 6d 20 72 65 63  owing system rec
270d0 6f 76 65 72 79 20 73 65 65 73 20 74 68 65 20 73  overy sees the s
270e0 61 6d 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63  ame journal.** c
270f0 6f 6e 74 65 6e 74 20 61 73 20 74 68 69 73 20 70  ontent as this p
27100 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  rocess..**.** If
27110 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73   everything goes
27120 20 61 73 20 70 6c 61 6e 6e 65 64 2c 20 53 51 4c   as planned, SQL
27130 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
27140 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 0a  ed. Otherwise, .
27150 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  ** an SQLite err
27160 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
27170 69 63 20 69 6e 74 20 70 61 67 65 72 53 79 6e 63  ic int pagerSync
27180 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  HotJournal(Pager
27190 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
271a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
271b0 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
271c0 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63  noSync ){.    rc
271d0 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
271e0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51  (pPager->jfd, SQ
271f0 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
27200 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
27210 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
27220 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
27230 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
27240 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 6a  >jfd, &pPager->j
27250 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 0a  ournalHdr);.  }.
27260 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
27270 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20 72  /*.** Obtain a r
27280 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 6d 65  eference to a me
27290 6d 6f 72 79 20 6d 61 70 70 65 64 20 70 61 67 65  mory mapped page
272a0 20 6f 62 6a 65 63 74 20 66 6f 72 20 70 61 67 65   object for page
272b0 20 6e 75 6d 62 65 72 20 70 67 6e 6f 2e 20 0a 2a   number pgno. .*
272c0 2a 20 54 68 65 20 6e 65 77 20 6f 62 6a 65 63 74  * The new object
272d0 20 77 69 6c 6c 20 75 73 65 20 74 68 65 20 70 6f   will use the po
272e0 69 6e 74 65 72 20 70 44 61 74 61 2c 20 6f 62 74  inter pData, obt
272f0 61 69 6e 65 64 20 66 72 6f 6d 20 78 46 65 74 63  ained from xFetc
27300 68 28 29 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65  h()..** If succe
27310 73 73 66 75 6c 2c 20 73 65 74 20 2a 70 70 50 61  ssful, set *ppPa
27320 67 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  ge to point to t
27330 68 65 20 6e 65 77 20 70 61 67 65 20 72 65 66 65  he new page refe
27340 72 65 6e 63 65 0a 2a 2a 20 61 6e 64 20 72 65 74  rence.** and ret
27350 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f  urn SQLITE_OK. O
27360 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
27370 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
27380 20 63 6f 64 65 20 61 6e 64 20 73 65 74 0a 2a 2a   code and set.**
27390 20 2a 70 70 50 61 67 65 20 74 6f 20 7a 65 72 6f   *ppPage to zero
273a0 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 72 65 66  ..**.** Page ref
273b0 65 72 65 6e 63 65 73 20 6f 62 74 61 69 6e 65 64  erences obtained
273c0 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   by calling this
273d0 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
273e0 20 62 65 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20   be released.** 
273f0 62 79 20 63 61 6c 6c 69 6e 67 20 70 61 67 65 72  by calling pager
27400 52 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28 29  ReleaseMapPage()
27410 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
27420 70 61 67 65 72 41 63 71 75 69 72 65 4d 61 70 50  pagerAcquireMapP
27430 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50  age(.  Pager *pP
27440 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ager,           
27450 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
27460 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67 6e 6f  object */.  Pgno
27470 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
27480 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
27490 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  age number */.  
274a0 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 20 20 20  void *pData,    
274b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
274c0 2f 2a 20 78 46 65 74 63 68 28 29 27 64 20 64 61  /* xFetch()'d da
274d0 74 61 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ta for this page
274e0 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 2a 70 70   */.  PgHdr **pp
274f0 50 61 67 65 20 20 20 20 20 20 20 20 20 20 20 20  Page            
27500 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 63        /* OUT: Ac
27510 71 75 69 72 65 64 20 70 61 67 65 20 6f 62 6a 65  quired page obje
27520 63 74 20 2a 2f 0a 29 7b 0a 20 20 50 67 48 64 72  ct */.){.  PgHdr
27530 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
27540 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
27550 6d 6f 72 79 20 6d 61 70 70 65 64 20 70 61 67 65  mory mapped page
27560 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
27570 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70  .  if( pPager->p
27580 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 29 7b 0a  MmapFreelist ){.
27590 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 20      *ppPage = p 
275a0 3d 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46  = pPager->pMmapF
275b0 72 65 65 6c 69 73 74 3b 0a 20 20 20 20 70 50 61  reelist;.    pPa
275c0 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69  ger->pMmapFreeli
275d0 73 74 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a  st = p->pDirty;.
275e0 20 20 20 20 70 2d 3e 70 44 69 72 74 79 20 3d 20      p->pDirty = 
275f0 30 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 2d  0;.    memset(p-
27600 3e 70 45 78 74 72 61 2c 20 30 2c 20 70 50 61 67  >pExtra, 0, pPag
27610 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 7d  er->nExtra);.  }
27620 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67  else{.    *ppPag
27630 65 20 3d 20 70 20 3d 20 28 50 67 48 64 72 20 2a  e = p = (PgHdr *
27640 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
27650 72 6f 28 73 69 7a 65 6f 66 28 50 67 48 64 72 29  ro(sizeof(PgHdr)
27660 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72   + pPager->nExtr
27670 61 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30  a);.    if( p==0
27680 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
27690 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65  3OsUnfetch(pPage
276a0 72 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 67 6e  r->fd, (i64)(pgn
276b0 6f 2d 31 29 20 2a 20 70 50 61 67 65 72 2d 3e 70  o-1) * pPager->p
276c0 61 67 65 53 69 7a 65 2c 20 70 44 61 74 61 29 3b  ageSize, pData);
276d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
276e0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
276f0 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 45  .    }.    p->pE
27700 78 74 72 61 20 3d 20 28 76 6f 69 64 20 2a 29 26  xtra = (void *)&
27710 70 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 66 6c 61  p[1];.    p->fla
27720 67 73 20 3d 20 50 47 48 44 52 5f 4d 4d 41 50 3b  gs = PGHDR_MMAP;
27730 0a 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31  .    p->nRef = 1
27740 3b 0a 20 20 20 20 70 2d 3e 70 50 61 67 65 72 20  ;.    p->pPager 
27750 3d 20 70 50 61 67 65 72 3b 0a 20 20 7d 0a 0a 20  = pPager;.  }.. 
27760 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 78 74   assert( p->pExt
27770 72 61 3d 3d 28 76 6f 69 64 20 2a 29 26 70 5b 31  ra==(void *)&p[1
27780 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ] );.  assert( p
27790 2d 3e 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20  ->pPage==0 );.  
277a0 61 73 73 65 72 74 28 20 70 2d 3e 66 6c 61 67 73  assert( p->flags
277b0 3d 3d 50 47 48 44 52 5f 4d 4d 41 50 20 29 3b 0a  ==PGHDR_MMAP );.
277c0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 61    assert( p->pPa
277d0 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20  ger==pPager );. 
277e0 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66   assert( p->nRef
277f0 3d 3d 31 20 29 3b 0a 0a 20 20 70 2d 3e 70 67 6e  ==1 );..  p->pgn
27800 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 2d 3e 70  o = pgno;.  p->p
27810 44 61 74 61 20 3d 20 70 44 61 74 61 3b 0a 20 20  Data = pData;.  
27820 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74  pPager->nMmapOut
27830 2b 2b 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  ++;..  return SQ
27840 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
27850 2a 20 52 65 6c 65 61 73 65 20 61 20 72 65 66 65  * Release a refe
27860 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 70 50  rence to page pP
27870 67 2e 20 70 50 67 20 6d 75 73 74 20 68 61 76 65  g. pPg must have
27880 20 62 65 65 6e 20 72 65 74 75 72 6e 65 64 20 62   been returned b
27890 79 20 61 6e 20 0a 2a 2a 20 65 61 72 6c 69 65 72  y an .** earlier
278a0 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 41 63   call to pagerAc
278b0 71 75 69 72 65 4d 61 70 50 61 67 65 28 29 2e 0a  quireMapPage()..
278c0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
278d0 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50 61  agerReleaseMapPa
278e0 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
278f0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
27900 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
27910 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75   pPager->nMmapOu
27920 74 2d 2d 3b 0a 20 20 70 50 67 2d 3e 70 44 69 72  t--;.  pPg->pDir
27930 74 79 20 3d 20 70 50 61 67 65 72 2d 3e 70 4d 6d  ty = pPager->pMm
27940 61 70 46 72 65 65 6c 69 73 74 3b 0a 20 20 70 50  apFreelist;.  pP
27950 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c  ager->pMmapFreel
27960 69 73 74 20 3d 20 70 50 67 3b 0a 0a 20 20 61 73  ist = pPg;..  as
27970 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66 64  sert( pPager->fd
27980 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69 56 65 72  ->pMethods->iVer
27990 73 69 6f 6e 3e 3d 33 20 29 3b 0a 20 20 73 71 6c  sion>=3 );.  sql
279a0 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50  ite3OsUnfetch(pP
279b0 61 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29 28  ager->fd, (i64)(
279c0 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 2a 70 50 61  pPg->pgno-1)*pPa
279d0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70  ger->pageSize, p
279e0 50 67 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 0a 2f  Pg->pData);.}../
279f0 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 50 67  *.** Free all Pg
27a00 48 64 72 20 6f 62 6a 65 63 74 73 20 73 74 6f 72  Hdr objects stor
27a10 65 64 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e  ed in the Pager.
27a20 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 6c 69  pMmapFreelist li
27a30 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  st..*/.static vo
27a40 69 64 20 70 61 67 65 72 46 72 65 65 4d 61 70 48  id pagerFreeMapH
27a50 64 72 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  drs(Pager *pPage
27a60 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a  r){.  PgHdr *p;.
27a70 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 3b 0a    PgHdr *pNext;.
27a80 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e    for(p=pPager->
27a90 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 20 70  pMmapFreelist; p
27aa0 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  ; p=pNext){.    
27ab0 70 4e 65 78 74 20 3d 20 70 2d 3e 70 44 69 72 74  pNext = p->pDirt
27ac0 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  y;.    sqlite3_f
27ad0 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  ree(p);.  }.}...
27ae0 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74  /*.** Shutdown t
27af0 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20  he page cache.  
27b00 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  Free all memory 
27b10 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69  and close all fi
27b20 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  les..**.** If a 
27b30 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
27b40 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e  in progress when
27b50 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
27b60 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a   called, that.**
27b70 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
27b80 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c  rolled back.  Al
27b90 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  l outstanding pa
27ba0 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61  ges are invalida
27bb0 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72  ted.** and their
27bc0 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64   memory is freed
27bd0 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  .  Any attempt t
27be0 6f 20 75 73 65 20 61 20 70 61 67 65 20 61 73 73  o use a page ass
27bf0 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20  ociated.** with 
27c00 74 68 69 73 20 70 61 67 65 20 63 61 63 68 65 20  this page cache 
27c10 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
27c20 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c  ion returns will
27c30 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c   likely.** resul
27c40 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e  t in a coredump.
27c50 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
27c60 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63  tion always succ
27c70 65 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73  eeds. If a trans
27c80 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
27c90 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69   an attempt.** i
27ca0 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69  s made to roll i
27cb0 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72  t back. If an er
27cc0 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
27cd0 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a  g the rollback .
27ce0 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ** a hot journal
27cf0 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
27d00 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62  the filesystem b
27d10 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72  ut no error is r
27d20 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68  eturned.** to th
27d30 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74  e caller..*/.int
27d40 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
27d50 73 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  se(Pager *pPager
27d60 29 7b 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d 20  ){.  u8 *pTmp = 
27d70 28 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 54  (u8 *)pPager->pT
27d80 6d 70 53 70 61 63 65 3b 0a 0a 20 20 61 73 73 65  mpSpace;..  asse
27d90 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
27da0 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
27db0 3b 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  ;.  disable_simu
27dc0 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
27dd0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69  );.  sqlite3Begi
27de0 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
27df0 0a 20 20 70 61 67 65 72 46 72 65 65 4d 61 70 48  .  pagerFreeMapH
27e00 64 72 73 28 70 50 61 67 65 72 29 3b 0a 20 20 2f  drs(pPager);.  /
27e10 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  * pPager->errCod
27e20 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  e = 0; */.  pPag
27e30 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
27e40 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  e = 0;.#ifndef S
27e50 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
27e60 20 73 71 6c 69 74 65 33 57 61 6c 43 6c 6f 73 65   sqlite3WalClose
27e70 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70  (pPager->pWal, p
27e80 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46  Pager->ckptSyncF
27e90 6c 61 67 73 2c 20 70 50 61 67 65 72 2d 3e 70 61  lags, pPager->pa
27ea0 67 65 53 69 7a 65 2c 20 70 54 6d 70 29 3b 0a 20  geSize, pTmp);. 
27eb0 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 3d 20   pPager->pWal = 
27ec0 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 61 67 65  0;.#endif.  page
27ed0 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
27ee0 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
27ef0 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b      pager_unlock
27f00 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73  (pPager);.  }els
27f10 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 69 74 20  e{.    /* If it 
27f20 69 73 20 6f 70 65 6e 2c 20 73 79 6e 63 20 74 68  is open, sync th
27f30 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62  e journal file b
27f40 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 55 6e  efore calling Un
27f50 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 2e  lockAndRollback.
27f60 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20  .    ** If this 
27f70 69 73 20 6e 6f 74 20 64 6f 6e 65 2c 20 74 68 65  is not done, the
27f80 6e 20 61 6e 20 75 6e 73 79 6e 63 65 64 20 70 6f  n an unsynced po
27f90 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f 70 65  rtion of the ope
27fa0 6e 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a  n journal .    *
27fb0 2a 20 66 69 6c 65 20 6d 61 79 20 62 65 20 70 6c  * file may be pl
27fc0 61 79 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74  ayed back into t
27fd0 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20  he database. If 
27fe0 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  a power failure 
27ff0 6f 63 63 75 72 73 20 0a 20 20 20 20 2a 2a 20 77  occurs .    ** w
28000 68 69 6c 65 20 74 68 69 73 20 69 73 20 68 61 70  hile this is hap
28010 70 65 6e 69 6e 67 2c 20 74 68 65 20 64 61 74 61  pening, the data
28020 62 61 73 65 20 63 6f 75 6c 64 20 62 65 63 6f 6d  base could becom
28030 65 20 63 6f 72 72 75 70 74 2e 0a 20 20 20 20 2a  e corrupt..    *
28040 2a 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 20 65  *.    ** If an e
28050 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
28060 65 20 74 72 79 69 6e 67 20 74 6f 20 73 79 6e 63  e trying to sync
28070 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 68   the journal, sh
28080 69 66 74 20 74 68 65 20 70 61 67 65 72 0a 20 20  ift the pager.  
28090 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 45 52    ** into the ER
280a0 52 4f 52 20 73 74 61 74 65 2e 20 54 68 69 73 20  ROR state. This 
280b0 63 61 75 73 65 73 20 55 6e 6c 6f 63 6b 41 6e 64  causes UnlockAnd
280c0 52 6f 6c 6c 62 61 63 6b 20 74 6f 20 75 6e 6c 6f  Rollback to unlo
280d0 63 6b 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  ck the.    ** da
280e0 74 61 62 61 73 65 20 61 6e 64 20 63 6c 6f 73 65  tabase and close
280f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
28100 65 20 77 69 74 68 6f 75 74 20 61 74 74 65 6d 70  e without attemp
28110 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 0a  ting to roll it.
28120 20 20 20 20 2a 2a 20 62 61 63 6b 20 6f 72 20 66      ** back or f
28130 69 6e 61 6c 69 7a 65 20 69 74 2e 20 54 68 65 20  inalize it. The 
28140 6e 65 78 74 20 64 61 74 61 62 61 73 65 20 75 73  next database us
28150 65 72 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20  er will have to 
28160 64 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 20  do hot-journal. 
28170 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 62     ** rollback b
28180 65 66 6f 72 65 20 61 63 63 65 73 73 69 6e 67 20  efore accessing 
28190 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
281a0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
281b0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
281c0 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 70  >jfd) ){.      p
281d0 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
281e0 72 2c 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a  r, pagerSyncHotJ
281f0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 29 3b  ournal(pPager));
28200 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72  .    }.    pager
28210 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63  UnlockAndRollbac
28220 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  k(pPager);.  }. 
28230 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
28240 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e 61  nMalloc();.  ena
28250 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
28260 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 50 41 47  _errors();.  PAG
28270 45 52 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  ERTRACE(("CLOSE 
28280 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
28290 50 61 67 65 72 29 29 29 3b 0a 20 20 49 4f 54 52  Pager)));.  IOTR
282a0 41 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e  ACE(("CLOSE %p\n
282b0 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 73 71  ", pPager)).  sq
282c0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
282d0 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 73 71 6c  ger->jfd);.  sql
282e0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
282f0 65 72 2d 3e 66 64 29 3b 0a 20 20 73 71 6c 69 74  er->fd);.  sqlit
28300 65 33 50 61 67 65 46 72 65 65 28 70 54 6d 70 29  e3PageFree(pTmp)
28310 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
28320 65 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70  eClose(pPager->p
28330 50 43 61 63 68 65 29 3b 0a 0a 23 69 66 64 65 66  PCache);..#ifdef
28340 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
28350 43 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  C.  if( pPager->
28360 78 43 6f 64 65 63 46 72 65 65 20 29 20 70 50 61  xCodecFree ) pPa
28370 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 28  ger->xCodecFree(
28380 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b  pPager->pCodec);
28390 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
283a0 74 28 20 21 70 50 61 67 65 72 2d 3e 61 53 61 76  t( !pPager->aSav
283b0 65 70 6f 69 6e 74 20 26 26 20 21 70 50 61 67 65  epoint && !pPage
283c0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b  r->pInJournal );
283d0 0a 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70  .  assert( !isOp
283e0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
283f0 26 26 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  && !isOpen(pPage
28400 72 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a 20 20 73  r->sjfd) );..  s
28410 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
28420 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  er);.  return SQ
28430 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20  LITE_OK;.}..#if 
28440 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29  !defined(NDEBUG)
28450 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
28460 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52  TE_TEST)./*.** R
28470 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e  eturn the page n
28480 75 6d 62 65 72 20 66 6f 72 20 70 61 67 65 20 70  umber for page p
28490 50 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69  Pg..*/.Pgno sqli
284a0 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
284b0 65 72 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  er(DbPage *pPg){
284c0 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70  .  return pPg->p
284d0 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  gno;.}.#endif../
284e0 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74  *.** Increment t
284f0 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
28500 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e  nt for page pPg.
28510 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
28520 50 61 67 65 72 52 65 66 28 44 62 50 61 67 65 20  PagerRef(DbPage 
28530 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69 74 65 33  *pPg){.  sqlite3
28540 50 63 61 63 68 65 52 65 66 28 70 50 67 29 3b 0a  PcacheRef(pPg);.
28550 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68  }../*.** Sync th
28560 65 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f 74  e journal. In ot
28570 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20  her words, make 
28580 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67  sure all the pag
28590 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20  es that have.** 
285a0 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
285b0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65  the journal have
285c0 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65   actually reache
285d0 64 20 74 68 65 20 73 75 72 66 61 63 65 20 6f 66  d the surface of
285e0 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64   the.** disk and
285f0 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64   can be restored
28600 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   in the event of
28610 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
28620 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  ollback..**.** I
28630 66 20 74 68 65 20 50 61 67 65 72 2e 6e 6f 53 79  f the Pager.noSy
28640 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  nc flag is set, 
28650 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
28660 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
28670 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  * Otherwise, the
28680 20 61 63 74 69 6f 6e 73 20 72 65 71 75 69 72 65   actions require
28690 64 20 64 65 70 65 6e 64 20 6f 6e 20 74 68 65 20  d depend on the 
286a0 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 61 6e 64  journal-mode and
286b0 20 74 68 65 20 0a 2a 2a 20 64 65 76 69 63 65 20   the .** device 
286c0 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  characteristics 
286d0 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  of the file-syst
286e0 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  em, as follows:.
286f0 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65  **.**   * If the
28700 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
28710 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f   an in-memory jo
28720 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f 20 61  urnal file, no a
28730 63 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20 20  ction need.**   
28740 20 20 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a    be taken..**.*
28750 2a 20 20 20 2a 20 4f 74 68 65 72 77 69 73 65 2c  *   * Otherwise,
28760 20 69 66 20 74 68 65 20 64 65 76 69 63 65 20 64   if the device d
28770 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20  oes not support 
28780 74 68 65 20 53 41 46 45 5f 41 50 50 45 4e 44 20  the SAFE_APPEND 
28790 70 72 6f 70 65 72 74 79 2c 0a 2a 2a 20 20 20 20  property,.**    
287a0 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66   then the nRec f
287b0 69 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f 73 74  ield of the most
287c0 20 72 65 63 65 6e 74 6c 79 20 77 72 69 74 74 65   recently writte
287d0 6e 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  n journal header
287e0 0a 2a 2a 20 20 20 20 20 69 73 20 75 70 64 61 74  .**     is updat
287f0 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  ed to contain th
28800 65 20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f 75 72  e number of jour
28810 6e 61 6c 20 72 65 63 6f 72 64 73 20 74 68 61 74  nal records that
28820 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 62 65 65   have.**     bee
28830 6e 20 77 72 69 74 74 65 6e 20 66 6f 6c 6c 6f 77  n written follow
28840 69 6e 67 20 69 74 2e 20 49 66 20 74 68 65 20 70  ing it. If the p
28850 61 67 65 72 20 69 73 20 6f 70 65 72 61 74 69 6e  ager is operatin
28860 67 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a  g in full-sync.*
28870 2a 20 20 20 20 20 6d 6f 64 65 2c 20 74 68 65 6e  *     mode, then
28880 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
28890 65 20 69 73 20 73 79 6e 63 65 64 20 62 65 66 6f  e is synced befo
288a0 72 65 20 74 68 69 73 20 66 69 65 6c 64 20 69 73  re this field is
288b0 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   updated..**.** 
288c0 20 20 2a 20 49 66 20 74 68 65 20 64 65 76 69 63    * If the devic
288d0 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f  e does not suppo
288e0 72 74 20 74 68 65 20 53 45 51 55 45 4e 54 49 41  rt the SEQUENTIA
288f0 4c 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 6e  L property, then
28900 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c   .**     journal
28910 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 2e   file is synced.
28920 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70 73  .**.** Or, in ps
28930 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a  eudo-code:.**.**
28940 20 20 20 69 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d     if( NOT <in-m
28950 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e 20 29  emory journal> )
28960 7b 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54  {.**     if( NOT
28970 20 53 41 46 45 5f 41 50 50 45 4e 44 20 29 7b 0a   SAFE_APPEND ){.
28980 2a 2a 20 20 20 20 20 20 20 69 66 28 20 3c 66 75  **       if( <fu
28990 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e 20 29 20  ll-sync mode> ) 
289a0 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66  xSync(<journal f
289b0 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20 20 20 20  ile>);.**       
289c0 3c 75 70 64 61 74 65 20 6e 52 65 63 20 66 69 65  <update nRec fie
289d0 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a  ld>.**     } .**
289e0 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53 45 51       if( NOT SEQ
289f0 55 45 4e 54 49 41 4c 20 29 20 78 53 79 6e 63 28  UENTIAL ) xSync(
28a00 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b  <journal file>);
28a10 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 49 66  .**   }.**.** If
28a20 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69   successful, thi
28a30 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73  s routine clears
28a40 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
28a50 53 59 4e 43 20 66 6c 61 67 20 6f 66 20 65 76 65  SYNC flag of eve
28a60 72 79 20 0a 2a 2a 20 70 61 67 65 20 63 75 72 72  ry .** page curr
28a70 65 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d 65  ently held in me
28a80 6d 6f 72 79 20 62 65 66 6f 72 65 20 72 65 74 75  mory before retu
28a90 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e  rning SQLITE_OK.
28aa0 20 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72   If an IO.** err
28ab0 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
28ac0 64 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65  d, then the IO e
28ad0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
28ae0 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
28af0 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ler..*/.static i
28b00 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50  nt syncJournal(P
28b10 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
28b20 74 20 6e 65 77 48 64 72 29 7b 0a 20 20 69 6e 74  t newHdr){.  int
28b30 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
28b40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28b50 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
28b60 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
28b70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
28b80 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a  WRITER_CACHEMOD.
28b90 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
28ba0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
28bb0 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29  WRITER_DBMOD.  )
28bc0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
28bd0 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
28be0 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
28bf0 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
28c00 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 72  (pPager) );..  r
28c10 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
28c20 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70 50  ExclusiveLock(pP
28c30 61 67 65 72 2c 20 30 29 3b 0a 20 20 69 66 28 20  ager, 0);.  if( 
28c40 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
28c50 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66  return rc;..  if
28c60 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  ( !pPager->noSyn
28c70 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  c ){.    assert(
28c80 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
28c90 6c 65 20 29 3b 0a 20 20 20 20 69 66 28 20 69 73  le );.    if( is
28ca0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
28cb0 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ) && pPager->jou
28cc0 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
28cd0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
28ce0 52 59 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  RY ){.      cons
28cf0 74 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69  t int iDc = sqli
28d00 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
28d10 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
28d20 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 61 73  r->fd);.      as
28d30 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
28d40 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20  ger->jfd) );..  
28d50 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26      if( 0==(iDc&
28d60 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
28d70 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20  E_APPEND) ){.   
28d80 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f       /* This blo
28d90 63 6b 20 64 65 61 6c 73 20 77 69 74 68 20 61 6e  ck deals with an
28da0 20 6f 62 73 63 75 72 65 20 70 72 6f 62 6c 65 6d   obscure problem
28db0 2e 20 49 66 20 74 68 65 20 6c 61 73 74 20 63 6f  . If the last co
28dc0 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 20 20 20  nnection.       
28dd0 20 2a 2a 20 74 68 61 74 20 77 72 6f 74 65 20 74   ** that wrote t
28de0 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  o this database 
28df0 77 61 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e  was operating in
28e00 20 70 65 72 73 69 73 74 65 6e 74 2d 6a 6f 75 72   persistent-jour
28e10 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  nal.        ** m
28e20 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  ode, then the jo
28e30 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 61  urnal file may a
28e40 74 20 74 68 69 73 20 70 6f 69 6e 74 20 61 63 74  t this point act
28e50 75 61 6c 6c 79 20 62 65 20 6c 61 72 67 65 72 0a  ually be larger.
28e60 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 6e 20          ** than 
28e70 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66  Pager.journalOff
28e80 20 62 79 74 65 73 2e 20 49 66 20 74 68 65 20 6e   bytes. If the n
28e90 65 78 74 20 74 68 69 6e 67 20 69 6e 20 74 68 65  ext thing in the
28ea0 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20   journal.       
28eb0 20 2a 2a 20 66 69 6c 65 20 68 61 70 70 65 6e 73   ** file happens
28ec0 20 74 6f 20 62 65 20 61 20 6a 6f 75 72 6e 61 6c   to be a journal
28ed0 2d 68 65 61 64 65 72 20 28 77 72 69 74 74 65 6e  -header (written
28ee0 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a   as part of the.
28ef0 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69          ** previ
28f00 6f 75 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 27 73  ous connection's
28f10 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 61   transaction), a
28f20 6e 64 20 61 20 63 72 61 73 68 20 6f 72 20 70 6f  nd a crash or po
28f30 77 65 72 2d 66 61 69 6c 75 72 65 20 0a 20 20 20  wer-failure .   
28f40 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 73 20 61       ** occurs a
28f50 66 74 65 72 20 6e 52 65 63 20 69 73 20 75 70 64  fter nRec is upd
28f60 61 74 65 64 20 62 75 74 20 62 65 66 6f 72 65 20  ated but before 
28f70 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
28f80 77 72 69 74 65 73 20 0a 20 20 20 20 20 20 20 20  writes .        
28f90 2a 2a 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65  ** anything else
28fa0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
28fb0 66 69 6c 65 20 28 6f 72 20 63 6f 6d 6d 69 74 73  file (or commits
28fc0 2f 72 6f 6c 6c 73 20 62 61 63 6b 20 69 74 73 20  /rolls back its 
28fd0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e  .        ** tran
28fe0 73 61 63 74 69 6f 6e 29 2c 20 74 68 65 6e 20 53  saction), then S
28ff0 51 4c 69 74 65 20 6d 61 79 20 62 65 63 6f 6d 65  QLite may become
29000 20 63 6f 6e 66 75 73 65 64 20 77 68 65 6e 20 64   confused when d
29010 6f 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20  oing the .      
29020 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c    ** hot-journal
29030 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77   rollback follow
29040 69 6e 67 20 72 65 63 6f 76 65 72 79 2e 20 49 74  ing recovery. It
29050 20 6d 61 79 20 72 6f 6c 6c 20 62 61 63 6b 20 61   may roll back a
29060 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  ll.        ** of
29070 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
29080 73 20 64 61 74 61 2c 20 74 68 65 6e 20 70 72 6f  s data, then pro
29090 63 65 65 64 20 74 6f 20 72 6f 6c 6c 69 6e 67 20  ceed to rolling 
290a0 62 61 63 6b 20 74 68 65 20 6f 6c 64 2c 0a 20 20  back the old,.  
290b0 20 20 20 20 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d        ** out-of-
290c0 64 61 74 65 20 64 61 74 61 20 74 68 61 74 20 66  date data that f
290d0 6f 6c 6c 6f 77 73 20 69 74 2e 20 44 61 74 61 62  ollows it. Datab
290e0 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  ase corruption..
290f0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
29100 20 20 20 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72     ** To work ar
29110 6f 75 6e 64 20 74 68 69 73 2c 20 69 66 20 74 68  ound this, if th
29120 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
29130 6f 65 73 20 61 70 70 65 61 72 20 74 6f 20 63 6f  oes appear to co
29140 6e 74 61 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ntain.        **
29150 20 61 20 76 61 6c 69 64 20 68 65 61 64 65 72 20   a valid header 
29160 66 6f 6c 6c 6f 77 69 6e 67 20 50 61 67 65 72 2e  following Pager.
29170 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 74 68 65 6e  journalOff, then
29180 20 77 72 69 74 65 20 61 20 30 78 30 30 0a 20 20   write a 0x00.  
29190 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20 74 6f        ** byte to
291a0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74   the start of it
291b0 20 74 6f 20 70 72 65 76 65 6e 74 20 69 74 20 66   to prevent it f
291c0 72 6f 6d 20 62 65 69 6e 67 20 72 65 63 6f 67 6e  rom being recogn
291d0 69 7a 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ized..        **
291e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 56 61 72 69  .        ** Vari
291f0 61 62 6c 65 20 69 4e 65 78 74 48 64 72 4f 66 66  able iNextHdrOff
29200 73 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  set is set to th
29210 65 20 6f 66 66 73 65 74 20 61 74 20 77 68 69 63  e offset at whic
29220 68 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a  h this.        *
29230 2a 20 70 72 6f 62 6c 65 6d 61 74 69 63 20 68 65  * problematic he
29240 61 64 65 72 20 77 69 6c 6c 20 6f 63 63 75 72 2c  ader will occur,
29250 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 20 61   if it exists. a
29260 4d 61 67 69 63 20 69 73 20 75 73 65 64 20 0a 20  Magic is used . 
29270 20 20 20 20 20 20 20 2a 2a 20 61 73 20 61 20 74         ** as a t
29280 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72 20  emporary buffer 
29290 74 6f 20 69 6e 73 70 65 63 74 20 74 68 65 20 66  to inspect the f
292a0 69 72 73 74 20 63 6f 75 70 6c 65 20 6f 66 20 62  irst couple of b
292b0 79 74 65 73 20 6f 66 0a 20 20 20 20 20 20 20 20  ytes of.        
292c0 2a 2a 20 74 68 65 20 70 6f 74 65 6e 74 69 61 6c  ** the potential
292d0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
292e0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
292f0 20 20 20 20 69 36 34 20 69 4e 65 78 74 48 64 72      i64 iNextHdr
29300 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  Offset;.        
29310 75 38 20 61 4d 61 67 69 63 5b 38 5d 3b 0a 20 20  u8 aMagic[8];.  
29320 20 20 20 20 20 20 75 38 20 7a 48 65 61 64 65 72        u8 zHeader
29330 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
29340 4d 61 67 69 63 29 2b 34 5d 3b 0a 0a 20 20 20 20  Magic)+4];..    
29350 20 20 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64      memcpy(zHead
29360 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  er, aJournalMagi
29370 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  c, sizeof(aJourn
29380 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 20  alMagic));.     
29390 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48     put32bits(&zH
293a0 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
293b0 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 70 50  urnalMagic)], pP
293c0 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20  ager->nRec);..  
293d0 20 20 20 20 20 20 69 4e 65 78 74 48 64 72 4f 66        iNextHdrOf
293e0 66 73 65 74 20 3d 20 6a 6f 75 72 6e 61 6c 48 64  fset = journalHd
293f0 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b  rOffset(pPager);
29400 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
29410 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
29420 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c  er->jfd, aMagic,
29430 20 38 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73   8, iNextHdrOffs
29440 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  et);.        if(
29450 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
29460 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 61 4d 61 67  & 0==memcmp(aMag
29470 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  ic, aJournalMagi
29480 63 2c 20 38 29 20 29 7b 0a 20 20 20 20 20 20 20  c, 8) ){.       
29490 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
294a0 75 38 20 7a 65 72 6f 62 79 74 65 20 3d 20 30 3b  u8 zerobyte = 0;
294b0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
294c0 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
294d0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 65 72  Pager->jfd, &zer
294e0 6f 62 79 74 65 2c 20 31 2c 20 69 4e 65 78 74 48  obyte, 1, iNextH
294f0 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20  drOffset);.     
29500 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
29510 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
29520 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45  & rc!=SQLITE_IOE
29530 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
29540 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
29550 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
29560 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  .        /* Writ
29570 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  e the nRec value
29580 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
29590 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49  l file header. I
295a0 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  f in.        ** 
295b0 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73  full-synchronous
295c0 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20   mode, sync the 
295d0 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54  journal first. T
295e0 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74  his ensures that
295f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20  .        ** all 
29600 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20  data has really 
29610 68 69 74 20 74 68 65 20 64 69 73 6b 20 62 65 66  hit the disk bef
29620 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70 64 61  ore nRec is upda
29630 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20  ted to mark.    
29640 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63      ** it as a c
29650 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c  andidate for rol
29660 6c 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a  lback..        *
29670 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69  *.        ** Thi
29680 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  s is not require
29690 64 20 69 66 20 74 68 65 20 70 65 72 73 69 73 74  d if the persist
296a0 65 6e 74 20 6d 65 64 69 61 20 73 75 70 70 6f 72  ent media suppor
296b0 74 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ts the.        *
296c0 2a 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72  * SAFE_APPEND pr
296d0 6f 70 65 72 74 79 2e 20 42 65 63 61 75 73 65 20  operty. Because 
296e0 69 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20  in this case it 
296f0 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
29700 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  .        ** for 
29710 67 61 72 62 61 67 65 20 64 61 74 61 20 74 6f 20  garbage data to 
29720 62 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  be appended to t
29730 68 65 20 66 69 6c 65 2c 20 74 68 65 20 6e 52 65  he file, the nRe
29740 63 20 66 69 65 6c 64 0a 20 20 20 20 20 20 20 20  c field.        
29750 2a 2a 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  ** is populated 
29760 77 69 74 68 20 30 78 46 46 46 46 46 46 46 46 20  with 0xFFFFFFFF 
29770 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  when the journal
29780 20 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74   header is writt
29790 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  en.        ** an
297a0 64 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f  d never needs to
297b0 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20   be updated..   
297c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
297d0 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
297e0 53 79 6e 63 20 26 26 20 30 3d 3d 28 69 44 63 26  Sync && 0==(iDc&
297f0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51  SQLITE_IOCAP_SEQ
29800 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20  UENTIAL) ){.    
29810 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
29820 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20  (("SYNC journal 
29830 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  of %d\n", PAGERI
29840 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20  D(pPager)));.   
29850 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
29860 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50  "JSYNC %p\n", pP
29870 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 20  ager)).         
29880 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
29890 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
298a0 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
298b0 67 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  gs);.          i
298c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
298d0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
298e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
298f0 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25  IOTRACE(("JHDR %
29900 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50 61 67 65  p %lld\n", pPage
29910 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r, pPager->journ
29920 61 6c 48 64 72 29 29 3b 0a 20 20 20 20 20 20 20  alHdr));.       
29930 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
29940 72 69 74 65 28 0a 20 20 20 20 20 20 20 20 20 20  rite(.          
29950 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a    pPager->jfd, z
29960 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a  Header, sizeof(z
29970 48 65 61 64 65 72 29 2c 20 70 50 61 67 65 72 2d  Header), pPager-
29980 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20 20  >journalHdr.    
29990 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
299a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
299b0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
299c0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
299d0 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49  0==(iDc&SQLITE_I
299e0 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29  OCAP_SEQUENTIAL)
299f0 20 29 7b 0a 20 20 20 20 20 20 20 20 50 41 47 45   ){.        PAGE
29a00 52 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f  RTRACE(("SYNC jo
29a10 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20  urnal of %d\n", 
29a20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
29a30 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41  );.        IOTRA
29a40 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22  CE(("JSYNC %p\n"
29a50 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20  , pPager)).     
29a60 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
29a70 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  sSync(pPager->jf
29a80 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46  d, pPager->syncF
29a90 6c 61 67 73 7c 20 0a 20 20 20 20 20 20 20 20 20  lags| .         
29aa0 20 28 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c   (pPager->syncFl
29ab0 61 67 73 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43  ags==SQLITE_SYNC
29ac0 5f 46 55 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e  _FULL?SQLITE_SYN
29ad0 43 5f 44 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20  C_DATAONLY:0).  
29ae0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
29af0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
29b00 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
29b10 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70        }..      p
29b20 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
29b30 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r = pPager->jour
29b40 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 20 20 69 66  nalOff;.      if
29b50 28 20 6e 65 77 48 64 72 20 26 26 20 30 3d 3d 28  ( newHdr && 0==(
29b60 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
29b70 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b  _SAFE_APPEND) ){
29b80 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
29b90 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20  >nRec = 0;.     
29ba0 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75     rc = writeJou
29bb0 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
29bc0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
29bd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
29be0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
29bf0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29c00 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
29c10 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Hdr = pPager->jo
29c20 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a  urnalOff;.    }.
29c30 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73 73    }..  /* Unless
29c40 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
29c50 20 6e 6f 53 79 6e 63 20 6d 6f 64 65 2c 20 74 68   noSync mode, th
29c60 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  e journal file w
29c70 61 73 20 6a 75 73 74 20 0a 20 20 2a 2a 20 73 75  as just .  ** su
29c80 63 63 65 73 73 66 75 6c 6c 79 20 73 79 6e 63 65  ccessfully synce
29c90 64 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20 63  d. Either way, c
29ca0 6c 65 61 72 20 74 68 65 20 50 47 48 44 52 5f 4e  lear the PGHDR_N
29cb0 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 6e  EED_SYNC flag on
29cc0 20 0a 20 20 2a 2a 20 61 6c 6c 20 70 61 67 65 73   .  ** all pages
29cd0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
29ce0 50 63 61 63 68 65 43 6c 65 61 72 53 79 6e 63 46  PcacheClearSyncF
29cf0 6c 61 67 73 28 70 50 61 67 65 72 2d 3e 70 50 43  lags(pPager->pPC
29d00 61 63 68 65 29 3b 0a 20 20 70 50 61 67 65 72 2d  ache);.  pPager-
29d10 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
29d20 57 52 49 54 45 52 5f 44 42 4d 4f 44 3b 0a 20 20  WRITER_DBMOD;.  
29d30 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
29d40 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
29d50 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  r) );.  return S
29d60 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
29d70 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  ** The argument 
29d80 69 73 20 74 68 65 20 66 69 72 73 74 20 69 6e 20  is the first in 
29d90 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  a linked list of
29da0 20 64 69 72 74 79 20 70 61 67 65 73 20 63 6f 6e   dirty pages con
29db0 6e 65 63 74 65 64 0a 2a 2a 20 62 79 20 74 68 65  nected.** by the
29dc0 20 50 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f   PgHdr.pDirty po
29dd0 69 6e 74 65 72 2e 20 54 68 69 73 20 66 75 6e 63  inter. This func
29de0 74 69 6f 6e 20 77 72 69 74 65 73 20 65 61 63 68  tion writes each
29df0 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 69   one of the.** i
29e00 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 69  n-memory pages i
29e10 6e 20 74 68 65 20 6c 69 73 74 20 74 6f 20 74 68  n the list to th
29e20 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
29e30 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 6d 61   The argument ma
29e40 79 0a 2a 2a 20 62 65 20 4e 55 4c 4c 2c 20 72 65  y.** be NULL, re
29e50 70 72 65 73 65 6e 74 69 6e 67 20 61 6e 20 65 6d  presenting an em
29e60 70 74 79 20 6c 69 73 74 2e 20 49 6e 20 74 68 69  pty list. In thi
29e70 73 20 63 61 73 65 20 74 68 69 73 20 66 75 6e 63  s case this func
29e80 74 69 6f 6e 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d  tion is.** a no-
29e90 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  op..**.** The pa
29ea0 67 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 74  ger must hold at
29eb0 20 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45   least a RESERVE
29ec0 44 20 6c 6f 63 6b 20 77 68 65 6e 20 74 68 69 73  D lock when this
29ed0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20   function.** is 
29ee0 63 61 6c 6c 65 64 2e 20 42 65 66 6f 72 65 20 77  called. Before w
29ef0 72 69 74 69 6e 67 20 61 6e 79 74 68 69 6e 67 20  riting anything 
29f00 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
29f10 66 69 6c 65 2c 20 74 68 69 73 20 6c 6f 63 6b 0a  file, this lock.
29f20 2a 2a 20 69 73 20 75 70 67 72 61 64 65 64 20 74  ** is upgraded t
29f30 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  o an EXCLUSIVE l
29f40 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b  ock. If the lock
29f50 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69   cannot be obtai
29f60 6e 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 42  ned,.** SQLITE_B
29f70 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 20  USY is returned 
29f80 61 6e 64 20 6e 6f 20 64 61 74 61 20 69 73 20 77  and no data is w
29f90 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61  ritten to the da
29fa0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20  tabase file..** 
29fb0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
29fc0 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20   is a temp-file 
29fd0 70 61 67 65 72 20 61 6e 64 20 74 68 65 20 61 63  pager and the ac
29fe0 74 75 61 6c 20 66 69 6c 65 2d 73 79 73 74 65 6d  tual file-system
29ff0 20 66 69 6c 65 0a 2a 2a 20 69 73 20 6e 6f 74 20   file.** is not 
2a000 79 65 74 20 6f 70 65 6e 2c 20 69 74 20 69 73 20  yet open, it is 
2a010 63 72 65 61 74 65 64 20 61 6e 64 20 6f 70 65 6e  created and open
2a020 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61  ed before any da
2a030 74 61 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65  ta is .** writte
2a040 6e 20 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63  n out..**.** Onc
2a050 65 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 62  e the lock has b
2a060 65 65 6e 20 75 70 67 72 61 64 65 64 20 61 6e 64  een upgraded and
2a070 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20  , if necessary, 
2a080 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c  the file opened,
2a090 0a 2a 2a 20 74 68 65 20 70 61 67 65 73 20 61 72  .** the pages ar
2a0a0 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f  e written out to
2a0b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a0c0 6c 65 20 69 6e 20 6c 69 73 74 20 6f 72 64 65 72  le in list order
2a0d0 2e 20 57 72 69 74 69 6e 67 0a 2a 2a 20 61 20 70  . Writing.** a p
2a0e0 61 67 65 20 69 73 20 73 6b 69 70 70 65 64 20 69  age is skipped i
2a0f0 66 20 69 74 20 6d 65 65 74 73 20 65 69 74 68 65  f it meets eithe
2a100 72 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  r of the followi
2a110 6e 67 20 63 72 69 74 65 72 69 61 3a 0a 2a 2a 0a  ng criteria:.**.
2a120 2a 2a 20 20 20 2a 20 54 68 65 20 70 61 67 65 20  **   * The page 
2a130 6e 75 6d 62 65 72 20 69 73 20 67 72 65 61 74 65  number is greate
2a140 72 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53  r than Pager.dbS
2a150 69 7a 65 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 54  ize, or.**   * T
2a160 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52  he PGHDR_DONT_WR
2a170 49 54 45 20 66 6c 61 67 20 69 73 20 73 65 74 20  ITE flag is set 
2a180 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a  on the page..**.
2a190 2a 2a 20 49 66 20 77 72 69 74 69 6e 67 20 6f 75  ** If writing ou
2a1a0 74 20 61 20 70 61 67 65 20 63 61 75 73 65 73 20  t a page causes 
2a1b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2a1c0 65 20 74 6f 20 67 72 6f 77 2c 20 50 61 67 65 72  e to grow, Pager
2a1d0 2e 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 20 69  .dbFileSize.** i
2a1e0 73 20 75 70 64 61 74 65 64 20 61 63 63 6f 72 64  s updated accord
2a1f0 69 6e 67 6c 79 2e 20 49 66 20 70 61 67 65 20 31  ingly. If page 1
2a200 20 69 73 20 77 72 69 74 74 65 6e 20 6f 75 74 2c   is written out,
2a210 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
2a220 63 61 63 68 65 64 0a 2a 2a 20 69 6e 20 50 61 67  cached.** in Pag
2a230 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20  er.dbFileVers[] 
2a240 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61  is updated to ma
2a250 74 63 68 20 74 68 65 20 6e 65 77 20 76 61 6c 75  tch the new valu
2a260 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 74  e stored in.** t
2a270 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2a280 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79  ..**.** If every
2a290 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73  thing is success
2a2a0 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ful, SQLITE_OK i
2a2b0 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61  s returned. If a
2a2c0 6e 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f  n IO error .** o
2a2d0 63 63 75 72 73 2c 20 61 6e 20 49 4f 20 65 72 72  ccurs, an IO err
2a2e0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
2a2f0 6e 65 64 2e 20 4f 72 2c 20 69 66 20 74 68 65 20  ned. Or, if the 
2a300 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 63  EXCLUSIVE lock c
2a310 61 6e 6e 6f 74 0a 2a 2a 20 62 65 20 6f 62 74 61  annot.** be obta
2a320 69 6e 65 64 2c 20 53 51 4c 49 54 45 5f 42 55 53  ined, SQLITE_BUS
2a330 59 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  Y is returned..*
2a340 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
2a350 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
2a360 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
2a370 20 50 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a   PgHdr *pList){.
2a380 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2a390 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
2a3a0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
2a3b0 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54   code */..  /* T
2a3c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2a3d0 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 6f 72 20  only called for 
2a3e0 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65 72 73 20  rollback pagers 
2a3f0 69 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  in WRITER_DBMOD 
2a400 73 74 61 74 65 2e 20 2a 2f 0a 20 20 61 73 73 65  state. */.  asse
2a410 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
2a420 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
2a430 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65  sert( pPager->te
2a440 6d 70 46 69 6c 65 20 7c 7c 20 70 50 61 67 65 72  mpFile || pPager
2a450 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
2a460 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 29 3b 0a  WRITER_DBMOD );.
2a470 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2a480 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
2a490 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  VE_LOCK );.  ass
2a4a0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
2a4b0 65 72 2d 3e 66 64 29 20 7c 7c 20 70 4c 69 73 74  er->fd) || pList
2a4c0 2d 3e 70 44 69 72 74 79 3d 3d 30 20 29 3b 0a 0a  ->pDirty==0 );..
2a4d0 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
2a4e0 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20   is a temp-file 
2a4f0 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
2a500 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74   opened, open it
2a510 20 6e 6f 77 2e 20 49 74 0a 20 20 2a 2a 20 69 73   now. It.  ** is
2a520 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f   not possible fo
2a530 72 20 72 63 20 74 6f 20 62 65 20 6f 74 68 65 72  r rc to be other
2a540 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20   than SQLITE_OK 
2a550 69 66 20 74 68 69 73 20 62 72 61 6e 63 68 0a 20  if this branch. 
2a560 20 2a 2a 20 69 73 20 74 61 6b 65 6e 2c 20 61 73   ** is taken, as
2a570 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
2a580 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70  ock() is a no-op
2a590 20 66 6f 72 20 74 65 6d 70 2d 66 69 6c 65 73 2e   for temp-files.
2a5a0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f  .  */.  if( !isO
2a5b0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
2a5c0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2a5d0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
2a5e0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
2a5f0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   );.    rc = pag
2a600 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65  erOpentemp(pPage
2a610 72 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  r, pPager->fd, p
2a620 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 29  Pager->vfsFlags)
2a630 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f  ;.  }..  /* Befo
2a640 72 65 20 74 68 65 20 66 69 72 73 74 20 77 72 69  re the first wri
2a650 74 65 2c 20 67 69 76 65 20 74 68 65 20 56 46 53  te, give the VFS
2a660 20 61 20 68 69 6e 74 20 6f 66 20 77 68 61 74 20   a hint of what 
2a670 74 68 65 20 66 69 6e 61 6c 0a 20 20 2a 2a 20 66  the final.  ** f
2a680 69 6c 65 20 73 69 7a 65 20 77 69 6c 6c 20 62 65  ile size will be
2a690 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
2a6a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
2a6b0 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  | isOpen(pPager-
2a6c0 3e 66 64 29 20 29 3b 0a 20 20 69 66 28 20 72 63  >fd) );.  if( rc
2a6d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20  ==SQLITE_OK .   
2a6e0 26 26 20 70 50 61 67 65 72 2d 3e 64 62 48 69 6e  && pPager->dbHin
2a6f0 74 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62  tSize<pPager->db
2a700 53 69 7a 65 0a 20 20 20 26 26 20 28 70 4c 69 73  Size.   && (pLis
2a710 74 2d 3e 70 44 69 72 74 79 20 7c 7c 20 70 4c 69  t->pDirty || pLi
2a720 73 74 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  st->pgno>pPager-
2a730 3e 64 62 48 69 6e 74 53 69 7a 65 29 0a 20 20 29  >dbHintSize).  )
2a740 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  {.    sqlite3_in
2a750 74 36 34 20 73 7a 46 69 6c 65 20 3d 20 70 50 61  t64 szFile = pPa
2a760 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2a 20  ger->pageSize * 
2a770 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70  (sqlite3_int64)p
2a780 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
2a790 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65     sqlite3OsFile
2a7a0 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67  ControlHint(pPag
2a7b0 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46  er->fd, SQLITE_F
2a7c0 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 2c 20  CNTL_SIZE_HINT, 
2a7d0 26 73 7a 46 69 6c 65 29 3b 0a 20 20 20 20 70 50  &szFile);.    pP
2a7e0 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
2a7f0 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
2a800 65 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28  e;.  }..  while(
2a810 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2a820 26 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 50  & pList ){.    P
2a830 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 4c 69 73 74  gno pgno = pList
2a840 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 20 20 2f 2a 20  ->pgno;..    /* 
2a850 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69 72  If there are dir
2a860 74 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  ty pages in the 
2a870 70 61 67 65 20 63 61 63 68 65 20 77 69 74 68 20  page cache with 
2a880 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65  page numbers gre
2a890 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e  ater.    ** than
2a8a0 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74   Pager.dbSize, t
2a8b0 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65  his means sqlite
2a8c0 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d  3PagerTruncateIm
2a8d0 61 67 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64  age() was called
2a8e0 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20   to.    ** make 
2a8f0 74 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72  the file smaller
2a900 20 28 70 72 65 73 75 6d 61 62 6c 79 20 62 79 20   (presumably by 
2a910 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65  auto-vacuum code
2a920 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a  ). Do not write.
2a930 20 20 20 20 2a 2a 20 61 6e 79 20 73 75 63 68 20      ** any such 
2a940 70 61 67 65 73 20 74 6f 20 74 68 65 20 66 69 6c  pages to the fil
2a950 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
2a960 20 41 6c 73 6f 2c 20 64 6f 20 6e 6f 74 20 77 72   Also, do not wr
2a970 69 74 65 20 6f 75 74 20 61 6e 79 20 70 61 67 65  ite out any page
2a980 20 74 68 61 74 20 68 61 73 20 74 68 65 20 50 47   that has the PG
2a990 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66  HDR_DONT_WRITE f
2a9a0 6c 61 67 0a 20 20 20 20 2a 2a 20 73 65 74 20 28  lag.    ** set (
2a9b0 73 65 74 20 62 79 20 73 71 6c 69 74 65 33 50 61  set by sqlite3Pa
2a9c0 67 65 72 44 6f 6e 74 57 72 69 74 65 28 29 29 2e  gerDontWrite()).
2a9d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2a9e0 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62  pgno<=pPager->db
2a9f0 53 69 7a 65 20 26 26 20 30 3d 3d 28 70 4c 69 73  Size && 0==(pLis
2aa00 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  t->flags&PGHDR_D
2aa10 4f 4e 54 5f 57 52 49 54 45 29 20 29 7b 0a 20 20  ONT_WRITE) ){.  
2aa20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
2aa30 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70   (pgno-1)*(i64)p
2aa40 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
2aa50 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
2aa60 77 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 63  write */.      c
2aa70 68 61 72 20 2a 70 44 61 74 61 3b 20 20 20 20 20  har *pData;     
2aa80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2aaa0 20 44 61 74 61 20 74 6f 20 77 72 69 74 65 20 2a   Data to write *
2aab0 2f 20 20 20 20 0a 0a 20 20 20 20 20 20 61 73 73  /    ..      ass
2aac0 65 72 74 28 20 28 70 4c 69 73 74 2d 3e 66 6c 61  ert( (pList->fla
2aad0 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
2aae0 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  NC)==0 );.      
2aaf0 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d  if( pList->pgno=
2ab00 3d 31 20 29 20 70 61 67 65 72 5f 77 72 69 74 65  =1 ) pager_write
2ab10 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70  _changecounter(p
2ab20 4c 69 73 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  List);..      /*
2ab30 20 45 6e 63 6f 64 65 20 74 68 65 20 64 61 74 61   Encode the data
2ab40 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 43 4f  base */.      CO
2ab50 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 4c 69  DEC2(pPager, pLi
2ab60 73 74 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c  st->pData, pgno,
2ab70 20 36 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54   6, return SQLIT
2ab80 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 20 70 44  E_NOMEM_BKPT, pD
2ab90 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ata);..      /* 
2aba0 57 72 69 74 65 20 6f 75 74 20 74 68 65 20 70 61  Write out the pa
2abb0 67 65 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20  ge data. */.    
2abc0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2abd0 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64  Write(pPager->fd
2abe0 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , pData, pPager-
2abf0 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65  >pageSize, offse
2ac00 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66  t);..      /* If
2ac10 20 70 61 67 65 20 31 20 77 61 73 20 6a 75 73 74   page 1 was just
2ac20 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65   written, update
2ac30 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
2ac40 73 20 74 6f 20 6d 61 74 63 68 0a 20 20 20 20 20  s to match.     
2ac50 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6e 6f   ** the value no
2ac60 77 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  w stored in the 
2ac70 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
2ac80 66 20 77 72 69 74 69 6e 67 20 74 68 69 73 20 0a  f writing this .
2ac90 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 63 61        ** page ca
2aca0 75 73 65 64 20 74 68 65 20 64 61 74 61 62 61 73  used the databas
2acb0 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20  e file to grow, 
2acc0 75 70 64 61 74 65 20 64 62 46 69 6c 65 53 69 7a  update dbFileSiz
2acd0 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  e. .      */.   
2ace0 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29     if( pgno==1 )
2acf0 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
2ad00 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
2ad10 56 65 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d  Vers, &pData[24]
2ad20 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
2ad30 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
2ad40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2ad50 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62   pgno>pPager->db
2ad60 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  FileSize ){.    
2ad70 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69      pPager->dbFi
2ad80 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20  leSize = pgno;. 
2ad90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61       }.      pPa
2ada0 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52  ger->aStat[PAGER
2adb0 5f 53 54 41 54 5f 57 52 49 54 45 5d 2b 2b 3b 0a  _STAT_WRITE]++;.
2adc0 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65  .      /* Update
2add0 20 61 6e 79 20 62 61 63 6b 75 70 20 6f 62 6a 65   any backup obje
2ade0 63 74 73 20 63 6f 70 79 69 6e 67 20 74 68 65 20  cts copying the 
2adf0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73  contents of this
2ae00 20 70 61 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20   pager. */.     
2ae10 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70   sqlite3BackupUp
2ae20 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61  date(pPager->pBa
2ae30 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a  ckup, pgno, (u8*
2ae40 29 70 4c 69 73 74 2d 3e 70 44 61 74 61 29 3b 0a  )pList->pData);.
2ae50 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43  .      PAGERTRAC
2ae60 45 28 28 22 53 54 4f 52 45 20 25 64 20 70 61 67  E(("STORE %d pag
2ae70 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c  e %d hash(%08x)\
2ae80 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
2ae90 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
2aea0 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61  Pager), pgno, pa
2aeb0 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69  ger_pagehash(pLi
2aec0 73 74 29 29 29 3b 0a 20 20 20 20 20 20 49 4f 54  st)));.      IOT
2aed0 52 41 43 45 28 28 22 50 47 4f 55 54 20 25 70 20  RACE(("PGOUT %p 
2aee0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
2aef0 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50 41 47  gno));.      PAG
2af00 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f  ER_INCR(sqlite3_
2af10 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f  pager_writedb_co
2af20 75 6e 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  unt);.    }else{
2af30 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43  .      PAGERTRAC
2af40 45 28 28 22 4e 4f 53 54 4f 52 45 20 25 64 20 70  E(("NOSTORE %d p
2af50 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
2af60 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f  ID(pPager), pgno
2af70 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61  ));.    }.    pa
2af80 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
2af90 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 70 4c 69  (pList);.    pLi
2afa0 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72  st = pList->pDir
2afb0 74 79 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ty;.  }..  retur
2afc0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  n rc;.}../*.** E
2afd0 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 73  nsure that the s
2afe0 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ub-journal file 
2aff0 69 73 20 6f 70 65 6e 2e 20 49 66 20 69 74 20 69  is open. If it i
2b000 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20  s already open, 
2b010 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  this .** functio
2b020 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
2b030 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
2b040 20 72 65 74 75 72 6e 65 64 20 69 66 20 65 76 65   returned if eve
2b050 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61 63 63  rything goes acc
2b060 6f 72 64 69 6e 67 20 74 6f 20 70 6c 61 6e 2e 20  ording to plan. 
2b070 41 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f  An .** SQLITE_IO
2b080 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f  ERR_XXX error co
2b090 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  de is returned i
2b0a0 66 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  f a call to sqli
2b0b0 74 65 33 4f 73 4f 70 65 6e 28 29 20 0a 2a 2a 20  te3OsOpen() .** 
2b0c0 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  fails..*/.static
2b0d0 20 69 6e 74 20 6f 70 65 6e 53 75 62 4a 6f 75 72   int openSubJour
2b0e0 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
2b0f0 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
2b100 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
2b110 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
2b120 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 63 6f 6e  sjfd) ){.    con
2b130 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 20  st int flags =  
2b140 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a  SQLITE_OPEN_SUBJ
2b150 4f 55 52 4e 41 4c 20 7c 20 53 51 4c 49 54 45 5f  OURNAL | SQLITE_
2b160 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 0a  OPEN_READWRITE .
2b170 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4f        | SQLITE_O
2b180 50 45 4e 5f 43 52 45 41 54 45 20 7c 20 53 51 4c  PEN_CREATE | SQL
2b190 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
2b1a0 56 45 20 0a 20 20 20 20 20 20 7c 20 53 51 4c 49  VE .      | SQLI
2b1b0 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
2b1c0 43 4c 4f 53 45 3b 0a 20 20 20 20 69 6e 74 20 6e  CLOSE;.    int n
2b1d0 53 74 6d 74 53 70 69 6c 6c 20 3d 20 73 71 6c 69  StmtSpill = sqli
2b1e0 74 65 33 43 6f 6e 66 69 67 2e 6e 53 74 6d 74 53  te3Config.nStmtS
2b1f0 70 69 6c 6c 3b 0a 20 20 20 20 69 66 28 20 70 50  pill;.    if( pP
2b200 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
2b210 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
2b220 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 7c 7c 20 70  MODE_MEMORY || p
2b230 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d  Pager->subjInMem
2b240 6f 72 79 20 29 7b 0a 20 20 20 20 20 20 6e 53 74  ory ){.      nSt
2b250 6d 74 53 70 69 6c 6c 20 3d 20 2d 31 3b 0a 20 20  mtSpill = -1;.  
2b260 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
2b270 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28  ite3JournalOpen(
2b280 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c  pPager->pVfs, 0,
2b290 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 66   pPager->sjfd, f
2b2a0 6c 61 67 73 2c 20 6e 53 74 6d 74 53 70 69 6c 6c  lags, nStmtSpill
2b2b0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2b2c0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70  rc;.}../*.** App
2b2d0 65 6e 64 20 61 20 72 65 63 6f 72 64 20 6f 66 20  end a record of 
2b2e0 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74  the current stat
2b2f0 65 20 6f 66 20 70 61 67 65 20 70 50 67 20 74 6f  e of page pPg to
2b300 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
2b310 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  . .**.** If succ
2b320 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20  essful, set the 
2b330 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  bit correspondin
2b340 67 20 74 6f 20 70 50 67 2d 3e 70 67 6e 6f 20 69  g to pPg->pgno i
2b350 6e 20 74 68 65 20 62 69 74 76 65 63 73 0a 2a 2a  n the bitvecs.**
2b360 20 66 6f 72 20 61 6c 6c 20 6f 70 65 6e 20 73 61   for all open sa
2b370 76 65 70 6f 69 6e 74 73 20 62 65 66 6f 72 65 20  vepoints before 
2b380 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
2b390 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
2b3a0 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
2b3b0 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69   if everything i
2b3c0 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 6e  s successful, an
2b3d0 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64   IO.** error cod
2b3e0 65 20 69 66 20 74 68 65 20 61 74 74 65 6d 70 74  e if the attempt
2b3f0 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65   to write to the
2b400 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 61 69   sub-journal fai
2b410 6c 73 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c 49 54  ls, or .** SQLIT
2b420 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c  E_NOMEM if a mal
2b430 6c 6f 63 20 66 61 69 6c 73 20 77 68 69 6c 65 20  loc fails while 
2b440 73 65 74 74 69 6e 67 20 61 20 62 69 74 20 69 6e  setting a bit in
2b450 20 61 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20   a savepoint.** 
2b460 62 69 74 76 65 63 2e 0a 2a 2f 0a 73 74 61 74 69  bitvec..*/.stati
2b470 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c  c int subjournal
2b480 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29  Page(PgHdr *pPg)
2b490 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
2b4a0 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20  ITE_OK;.  Pager 
2b4b0 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
2b4c0 50 61 67 65 72 3b 0a 20 20 69 66 28 20 70 50 61  Pager;.  if( pPa
2b4d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
2b4e0 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
2b4f0 4f 44 45 5f 4f 46 46 20 29 7b 0a 0a 20 20 20 20  ODE_OFF ){..    
2b500 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 75 62 2d  /* Open the sub-
2b510 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 68  journal, if it h
2b520 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62  as not already b
2b530 65 65 6e 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20  een opened */.  
2b540 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2b550 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->useJournal );.
2b560 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
2b570 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
2b580 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  || pagerUseWal(p
2b590 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 61 73  Pager) );.    as
2b5a0 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
2b5b0 67 65 72 2d 3e 73 6a 66 64 29 20 7c 7c 20 70 50  ger->sjfd) || pP
2b5c0 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3d 3d 30  ager->nSubRec==0
2b5d0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2b5e0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
2b5f0 65 72 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  er) .         ||
2b600 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70   pageInJournal(p
2b610 50 61 67 65 72 2c 20 70 50 67 29 20 0a 20 20 20  Pager, pPg) .   
2b620 20 20 20 20 20 20 7c 7c 20 70 50 67 2d 3e 70 67        || pPg->pg
2b630 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  no>pPager->dbOri
2b640 67 53 69 7a 65 20 0a 20 20 20 20 29 3b 0a 20 20  gSize .    );.  
2b650 20 20 72 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f    rc = openSubJo
2b660 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 0a  urnal(pPager);..
2b670 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75      /* If the su
2b680 62 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6f 70  b-journal was op
2b690 65 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  ened successfull
2b6a0 79 20 28 6f 72 20 77 61 73 20 61 6c 72 65 61 64  y (or was alread
2b6b0 79 20 6f 70 65 6e 29 2c 0a 20 20 20 20 2a 2a 20  y open),.    ** 
2b6c0 77 72 69 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  write the journa
2b6d0 6c 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68  l record into th
2b6e0 65 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20  e file.  */.    
2b6f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2b700 4b 20 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20  K ){.      void 
2b710 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44  *pData = pPg->pD
2b720 61 74 61 3b 0a 20 20 20 20 20 20 69 36 34 20 6f  ata;.      i64 o
2b730 66 66 73 65 74 20 3d 20 28 69 36 34 29 70 50 61  ffset = (i64)pPa
2b740 67 65 72 2d 3e 6e 53 75 62 52 65 63 2a 28 34 2b  ger->nSubRec*(4+
2b750 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
2b760 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70  );.      char *p
2b770 44 61 74 61 32 3b 0a 20 20 0a 20 20 20 20 20 20  Data2;.  .      
2b780 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70  CODEC2(pPager, p
2b790 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
2b7a0 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54   7, return SQLIT
2b7b0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 20 70 44  E_NOMEM_BKPT, pD
2b7c0 61 74 61 32 29 3b 0a 20 20 20 20 20 20 50 41 47  ata2);.      PAG
2b7d0 45 52 54 52 41 43 45 28 28 22 53 54 4d 54 2d 4a  ERTRACE(("STMT-J
2b7e0 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25  OURNAL %d page %
2b7f0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
2b800 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
2b810 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  ));.      rc = w
2b820 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
2b830 72 2d 3e 73 6a 66 64 2c 20 6f 66 66 73 65 74 2c  r->sjfd, offset,
2b840 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
2b850 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2b860 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2b870 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
2b880 69 74 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  ite(pPager->sjfd
2b890 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72  , pData2, pPager
2b8a0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73  ->pageSize, offs
2b8b0 65 74 2b 34 29 3b 0a 20 20 20 20 20 20 7d 0a 20  et+4);.      }. 
2b8c0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
2b8d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2b8e0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62      pPager->nSub
2b8f0 52 65 63 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72  Rec++;.    asser
2b900 74 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  t( pPager->nSave
2b910 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20 20 20 72  point>0 );.    r
2b920 63 20 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69  c = addToSavepoi
2b930 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72  ntBitvecs(pPager
2b940 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
2b950 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2b960 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a  .static int subj
2b970 6f 75 72 6e 61 6c 50 61 67 65 49 66 52 65 71 75  ournalPageIfRequ
2b980 69 72 65 64 28 50 67 48 64 72 20 2a 70 50 67 29  ired(PgHdr *pPg)
2b990 7b 0a 20 20 69 66 28 20 73 75 62 6a 52 65 71 75  {.  if( subjRequ
2b9a0 69 72 65 73 50 61 67 65 28 70 50 67 29 20 29 7b  iresPage(pPg) ){
2b9b0 0a 20 20 20 20 72 65 74 75 72 6e 20 73 75 62 6a  .    return subj
2b9c0 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b  ournalPage(pPg);
2b9d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
2b9e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2b9f0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
2ba00 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
2ba10 6c 6c 65 64 20 62 79 20 74 68 65 20 70 63 61 63  lled by the pcac
2ba20 68 65 20 6c 61 79 65 72 20 77 68 65 6e 20 69 74  he layer when it
2ba30 20 68 61 73 20 72 65 61 63 68 65 64 20 73 6f 6d   has reached som
2ba40 65 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79  e.** soft memory
2ba50 20 6c 69 6d 69 74 2e 20 54 68 65 20 66 69 72 73   limit. The firs
2ba60 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  t argument is a 
2ba70 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67  pointer to a Pag
2ba80 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61  er object.** (ca
2ba90 73 74 20 61 73 20 61 20 76 6f 69 64 2a 29 2e 20  st as a void*). 
2baa0 54 68 65 20 70 61 67 65 72 20 69 73 20 61 6c 77  The pager is alw
2bab0 61 79 73 20 27 70 75 72 67 65 61 62 6c 65 27 20  ays 'purgeable' 
2bac0 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  (not an in-memor
2bad0 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 29 2e 20  y.** database). 
2bae0 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
2baf0 65 6e 74 20 69 73 20 61 20 72 65 66 65 72 65 6e  ent is a referen
2bb00 63 65 20 74 6f 20 61 20 70 61 67 65 20 74 68 61  ce to a page tha
2bb10 74 20 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74  t is .** current
2bb20 6c 79 20 64 69 72 74 79 20 62 75 74 20 68 61 73  ly dirty but has
2bb30 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
2bb40 72 65 66 65 72 65 6e 63 65 73 2e 20 54 68 65 20  references. The 
2bb50 70 61 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79  page.** is alway
2bb60 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
2bb70 68 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  h the Pager obje
2bb80 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
2bb90 20 66 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d   first .** argum
2bba0 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  ent..**.** The j
2bbb0 6f 62 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ob of this funct
2bbc0 69 6f 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20 70  ion is to make p
2bbd0 50 67 20 63 6c 65 61 6e 20 62 79 20 77 72 69 74  Pg clean by writ
2bbe0 69 6e 67 20 69 74 73 20 63 6f 6e 74 65 6e 74 73  ing its contents
2bbf0 0a 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64  .** out to the d
2bc00 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 66  atabase file, if
2bc10 20 70 6f 73 73 69 62 6c 65 2e 20 54 68 69 73 20   possible. This 
2bc20 6d 61 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63  may involve sync
2bc30 69 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  ing the.** journ
2bc40 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  al file. .**.** 
2bc50 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73  If successful, s
2bc60 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
2bc70 43 6c 65 61 6e 28 29 20 69 73 20 63 61 6c 6c 65  Clean() is calle
2bc80 64 20 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e  d on the page an
2bc90 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72  d.** SQLITE_OK r
2bca0 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
2bcb0 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
2bcc0 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6d  hile trying to m
2bcd0 61 6b 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  ake the.** page 
2bce0 63 6c 65 61 6e 2c 20 74 68 65 20 49 4f 20 65 72  clean, the IO er
2bcf0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
2bd00 72 6e 65 64 2e 20 49 66 20 74 68 65 20 70 61 67  rned. If the pag
2bd10 65 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d  e cannot be.** m
2bd20 61 64 65 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f  ade clean for so
2bd30 6d 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c  me other reason,
2bd40 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63   but no error oc
2bd50 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54  curs, then SQLIT
2bd60 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72  E_OK.** is retur
2bd70 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 50 63  ned by sqlite3Pc
2bd80 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20  acheMakeClean() 
2bd90 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a  is not called..*
2bda0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
2bdb0 65 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a 70  erStress(void *p
2bdc0 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  , PgHdr *pPg){. 
2bdd0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
2bde0 20 28 50 61 67 65 72 20 2a 29 70 3b 0a 20 20 69   (Pager *)p;.  i
2bdf0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2be00 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  K;..  assert( pP
2be10 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65  g->pPager==pPage
2be20 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
2be30 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
2be40 44 49 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54  DIRTY );..  /* T
2be50 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 4e 4f  he doNotSpill NO
2be60 53 59 4e 43 20 62 69 74 20 69 73 20 73 65 74 20  SYNC bit is set 
2be70 64 75 72 69 6e 67 20 74 69 6d 65 73 20 77 68 65  during times whe
2be80 6e 20 64 6f 69 6e 67 20 61 20 73 79 6e 63 20 6f  n doing a sync o
2be90 66 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28  f.  ** journal (
2bea0 61 6e 64 20 61 64 64 69 6e 67 20 61 20 6e 65 77  and adding a new
2beb0 20 68 65 61 64 65 72 29 20 69 73 20 6e 6f 74 20   header) is not 
2bec0 61 6c 6c 6f 77 65 64 2e 20 20 54 68 69 73 20 6f  allowed.  This o
2bed0 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e  ccurs.  ** durin
2bee0 67 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  g calls to sqlit
2bef0 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 77  e3PagerWrite() w
2bf00 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6a  hile trying to j
2bf10 6f 75 72 6e 61 6c 20 6d 75 6c 74 69 70 6c 65 0a  ournal multiple.
2bf20 20 20 2a 2a 20 70 61 67 65 73 20 62 65 6c 6f 6e    ** pages belon
2bf30 67 69 6e 67 20 74 6f 20 74 68 65 20 73 61 6d 65  ging to the same
2bf40 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20   sector..  **.  
2bf50 2a 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c  ** The doNotSpil
2bf60 6c 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 4f  l ROLLBACK and O
2bf70 46 46 20 62 69 74 73 20 69 6e 68 69 62 69 74 73  FF bits inhibits
2bf80 20 61 6c 6c 20 63 61 63 68 65 20 73 70 69 6c 6c   all cache spill
2bf90 69 6e 67 0a 20 20 2a 2a 20 72 65 67 61 72 64 6c  ing.  ** regardl
2bfa0 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f  ess of whether o
2bfb0 72 20 6e 6f 74 20 61 20 73 79 6e 63 20 69 73 20  r not a sync is 
2bfc0 72 65 71 75 69 72 65 64 2e 20 20 54 68 69 73 20  required.  This 
2bfd0 69 73 20 73 65 74 20 64 75 72 69 6e 67 0a 20 20  is set during.  
2bfe0 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 72  ** a rollback or
2bff0 20 62 79 20 75 73 65 72 20 72 65 71 75 65 73 74   by user request
2c000 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a  , respectively..
2c010 20 20 2a 2a 0a 20 20 2a 2a 20 53 70 69 6c 6c 69    **.  ** Spilli
2c020 6e 67 20 69 73 20 61 6c 73 6f 20 70 72 6f 68 69  ng is also prohi
2c030 62 69 74 65 64 20 77 68 65 6e 20 69 6e 20 61 6e  bited when in an
2c040 20 65 72 72 6f 72 20 73 74 61 74 65 20 73 69 6e   error state sin
2c050 63 65 20 74 68 61 74 20 63 6f 75 6c 64 0a 20 20  ce that could.  
2c060 2a 2a 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62  ** lead to datab
2c070 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20  ase corruption. 
2c080 20 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74    In the current
2c090 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2c0a0 69 74 20 0a 20 20 2a 2a 20 69 73 20 69 6d 70 6f  it .  ** is impo
2c0b0 73 73 69 62 6c 65 20 66 6f 72 20 73 71 6c 69 74  ssible for sqlit
2c0c0 65 33 50 63 61 63 68 65 46 65 74 63 68 28 29 20  e3PcacheFetch() 
2c0d0 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74  to be called wit
2c0e0 68 20 63 72 65 61 74 65 46 6c 61 67 3d 3d 33 0a  h createFlag==3.
2c0f0 20 20 2a 2a 20 77 68 69 6c 65 20 69 6e 20 74 68    ** while in th
2c100 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 68  e error state, h
2c110 65 6e 63 65 20 69 74 20 69 73 20 69 6d 70 6f 73  ence it is impos
2c120 73 69 62 6c 65 20 66 6f 72 20 74 68 69 73 20 72  sible for this r
2c130 6f 75 74 69 6e 65 20 74 6f 0a 20 20 2a 2a 20 62  outine to.  ** b
2c140 65 20 63 61 6c 6c 65 64 20 69 6e 20 74 68 65 20  e called in the 
2c150 65 72 72 6f 72 20 73 74 61 74 65 2e 20 20 4e 65  error state.  Ne
2c160 76 65 72 74 68 65 6c 65 73 73 2c 20 77 65 20 69  vertheless, we i
2c170 6e 63 6c 75 64 65 20 61 20 4e 45 56 45 52 28 29  nclude a NEVER()
2c180 0a 20 20 2a 2a 20 74 65 73 74 20 66 6f 72 20 74  .  ** test for t
2c190 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 61  he error state a
2c1a0 73 20 61 20 73 61 66 65 67 75 61 72 64 20 61 67  s a safeguard ag
2c1b0 61 69 6e 73 74 20 66 75 74 75 72 65 20 63 68 61  ainst future cha
2c1c0 6e 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nges..  */.  if(
2c1d0 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65   NEVER(pPager->e
2c1e0 72 72 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e  rrCode) ) return
2c1f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 74 65   SQLITE_OK;.  te
2c200 73 74 63 61 73 65 28 20 70 50 61 67 65 72 2d 3e  stcase( pPager->
2c210 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49  doNotSpill & SPI
2c220 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20  LLFLAG_ROLLBACK 
2c230 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
2c240 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
2c250 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 4f 46  l & SPILLFLAG_OF
2c260 46 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  F );.  testcase(
2c270 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
2c280 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f  ill & SPILLFLAG_
2c290 4e 4f 53 59 4e 43 20 29 3b 0a 20 20 69 66 28 20  NOSYNC );.  if( 
2c2a0 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
2c2b0 6c 6c 0a 20 20 20 26 26 20 28 28 70 50 61 67 65  ll.   && ((pPage
2c2c0 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20  r->doNotSpill & 
2c2d0 28 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42  (SPILLFLAG_ROLLB
2c2e0 41 43 4b 7c 53 50 49 4c 4c 46 4c 41 47 5f 4f 46  ACK|SPILLFLAG_OF
2c2f0 46 29 29 21 3d 30 0a 20 20 20 20 20 20 7c 7c 20  F))!=0.      || 
2c300 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47  (pPg->flags & PG
2c310 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d  HDR_NEED_SYNC)!=
2c320 30 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  0).  ){.    retu
2c330 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2c340 7d 0a 0a 20 20 70 50 67 2d 3e 70 44 69 72 74 79  }..  pPg->pDirty
2c350 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 61 67 65   = 0;.  if( page
2c360 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
2c370 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
2c380 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e  E_OMIT_CONCURREN
2c390 54 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  T.    /* If the 
2c3a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
2c3b0 20 22 42 45 47 49 4e 20 43 4f 4e 43 55 52 52 45   "BEGIN CONCURRE
2c3c0 4e 54 22 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  NT" transaction,
2c3d0 20 74 68 65 20 70 61 67 65 20 0a 20 20 20 20 2a   the page .    *
2c3e0 2a 20 63 61 6e 6e 6f 74 20 62 65 20 66 6c 75 73  * cannot be flus
2c3f0 68 65 64 20 74 6f 20 64 69 73 6b 2e 20 52 65 74  hed to disk. Ret
2c400 75 72 6e 20 65 61 72 6c 79 20 69 6e 20 74 68 69  urn early in thi
2c410 73 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20 20 69  s case. */.    i
2c420 66 28 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 52  f( pPager->pAllR
2c430 65 61 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ead ) return SQL
2c440 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a  ITE_OK;.#endif..
2c450 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 73      /* Write a s
2c460 69 6e 67 6c 65 20 66 72 61 6d 65 20 66 6f 72 20  ingle frame for 
2c470 74 68 69 73 20 70 61 67 65 20 74 6f 20 74 68 65  this page to the
2c480 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20   log. */.    rc 
2c490 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65  = subjournalPage
2c4a0 49 66 52 65 71 75 69 72 65 64 28 70 50 67 29 3b  IfRequired(pPg);
2c4b0 20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51   .    if( rc==SQ
2c4c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2c4d0 20 72 63 20 3d 20 70 61 67 65 72 57 61 6c 46 72   rc = pagerWalFr
2c4e0 61 6d 65 73 28 70 50 61 67 65 72 2c 20 70 50 67  ames(pPager, pPg
2c4f0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
2c500 20 7d 65 6c 73 65 7b 0a 20 20 0a 20 20 20 20 2f   }else{.  .    /
2c510 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  * Sync the journ
2c520 61 6c 20 66 69 6c 65 20 69 66 20 72 65 71 75 69  al file if requi
2c530 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  red. */.    if( 
2c540 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
2c550 5f 4e 45 45 44 5f 53 59 4e 43 20 0a 20 20 20 20  _NEED_SYNC .    
2c560 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
2c570 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
2c580 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 29 7b  _CACHEMOD.    ){
2c590 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63  .      rc = sync
2c5a0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20  Journal(pPager, 
2c5b0 31 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  1);.    }.  .   
2c5c0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f   /* Write the co
2c5d0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2c5e0 67 65 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  ge out to the da
2c5f0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a  tabase file. */.
2c600 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2c610 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61  TE_OK ){.      a
2c620 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c 61  ssert( (pPg->fla
2c630 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
2c640 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  NC)==0 );.      
2c650 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
2c660 5f 70 61 67 65 6c 69 73 74 28 70 50 61 67 65 72  _pagelist(pPager
2c670 2c 20 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  , pPg);.    }.  
2c680 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65  }..  /* Mark the
2c690 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20   page as clean. 
2c6a0 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
2c6b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 41  ITE_OK ){.    PA
2c6c0 47 45 52 54 52 41 43 45 28 28 22 53 54 52 45 53  GERTRACE(("STRES
2c6d0 53 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  S %d page %d\n",
2c6e0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
2c6f0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20  , pPg->pgno));. 
2c700 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
2c710 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  MakeClean(pPg);.
2c720 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 61    }..  return pa
2c730 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
2c740 2c 20 72 63 29 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  , rc); .}../*.**
2c750 20 46 6c 75 73 68 20 61 6c 6c 20 75 6e 72 65 66   Flush all unref
2c760 65 72 65 6e 63 65 64 20 64 69 72 74 79 20 70 61  erenced dirty pa
2c770 67 65 73 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a  ges to disk..*/.
2c780 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
2c790 46 6c 75 73 68 28 50 61 67 65 72 20 2a 70 50 61  Flush(Pager *pPa
2c7a0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
2c7b0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
2c7c0 3b 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29  ;.  if( !MEMDB )
2c7d0 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 4c 69  {.    PgHdr *pLi
2c7e0 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  st = sqlite3Pcac
2c7f0 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67  heDirtyList(pPag
2c800 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
2c810 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
2c820 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
2c830 67 65 72 29 20 29 3b 0a 20 20 20 20 77 68 69 6c  ger) );.    whil
2c840 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
2c850 20 26 26 20 70 4c 69 73 74 20 29 7b 0a 20 20 20   && pList ){.   
2c860 20 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 20     PgHdr *pNext 
2c870 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b  = pList->pDirty;
2c880 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74  .      if( pList
2c890 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
2c8a0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 53       rc = pagerS
2c8b0 74 72 65 73 73 28 28 76 6f 69 64 2a 29 70 50 61  tress((void*)pPa
2c8c0 67 65 72 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20  ger, pList);.   
2c8d0 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 69 73 74     }.      pList
2c8e0 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a   = pNext;.    }.
2c8f0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
2c900 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
2c910 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ate and initiali
2c920 7a 65 20 61 20 6e 65 77 20 50 61 67 65 72 20 6f  ze a new Pager o
2c930 62 6a 65 63 74 20 61 6e 64 20 70 75 74 20 61 20  bject and put a 
2c940 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 0a 2a 2a  pointer to it.**
2c950 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 20 54 68   in *ppPager. Th
2c960 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20 65  e pager should e
2c970 76 65 6e 74 75 61 6c 6c 79 20 62 65 20 66 72 65  ventually be fre
2c980 65 64 20 62 79 20 70 61 73 73 69 6e 67 20 69 74  ed by passing it
2c990 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61  .** to sqlite3Pa
2c9a0 67 65 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a  gerClose()..**.*
2c9b0 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20  * The zFilename 
2c9c0 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
2c9d0 70 61 74 68 20 74 6f 20 74 68 65 20 64 61 74 61  path to the data
2c9e0 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65  base file to ope
2c9f0 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61  n..** If zFilena
2ca00 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20  me is NULL then 
2ca10 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64  a randomly-named
2ca20 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
2ca30 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e  is created.** an
2ca40 64 20 75 73 65 64 20 61 73 20 74 68 65 20 66 69  d used as the fi
2ca50 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e  le to be cached.
2ca60 20 54 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   Temporary files
2ca70 20 61 72 65 20 62 65 20 64 65 6c 65 74 65 64 0a   are be deleted.
2ca80 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
2ca90 20 77 68 65 6e 20 74 68 65 79 20 61 72 65 20 63   when they are c
2caa0 6c 6f 73 65 64 2e 20 49 66 20 7a 46 69 6c 65 6e  losed. If zFilen
2cab0 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a  ame is ":memory:
2cac0 22 20 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69  " then .** all i
2cad0 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65  nformation is he
2cae0 6c 64 20 69 6e 20 63 61 63 68 65 2e 20 49 74 20  ld in cache. It 
2caf0 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e  is never written
2cb00 20 74 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20 54 68   to disk. .** Th
2cb10 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  is can be used t
2cb20 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 69  o implement an i
2cb30 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
2cb40 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78  e..**.** The nEx
2cb50 74 72 61 20 70 61 72 61 6d 65 74 65 72 20 73 70  tra parameter sp
2cb60 65 63 69 66 69 65 73 20 74 68 65 20 6e 75 6d 62  ecifies the numb
2cb70 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
2cb80 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a  pace allocated.*
2cb90 2a 20 61 6c 6f 6e 67 20 77 69 74 68 20 65 61 63  * along with eac
2cba0 68 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  h page reference
2cbb0 2e 20 54 68 69 73 20 73 70 61 63 65 20 69 73 20  . This space is 
2cbc0 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 65  available to the
2cbd0 20 75 73 65 72 0a 2a 2a 20 76 69 61 20 74 68 65   user.** via the
2cbe0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
2cbf0 45 78 74 72 61 28 29 20 41 50 49 2e 0a 2a 2a 0a  Extra() API..**.
2cc00 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 61 72 67  ** The flags arg
2cc10 75 6d 65 6e 74 20 69 73 20 75 73 65 64 20 74 6f  ument is used to
2cc20 20 73 70 65 63 69 66 79 20 70 72 6f 70 65 72 74   specify propert
2cc30 69 65 73 20 74 68 61 74 20 61 66 66 65 63 74 20  ies that affect 
2cc40 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  the.** operation
2cc50 20 6f 66 20 74 68 65 20 70 61 67 65 72 2e 20 49   of the pager. I
2cc60 74 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73  t should be pass
2cc70 65 64 20 73 6f 6d 65 20 62 69 74 77 69 73 65 20  ed some bitwise 
2cc80 63 6f 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f  combination.** o
2cc90 66 20 74 68 65 20 50 41 47 45 52 5f 2a 20 66 6c  f the PAGER_* fl
2cca0 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76  ags..**.** The v
2ccb0 66 73 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65  fsFlags paramete
2ccc0 72 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74  r is a bitmask t
2ccd0 6f 20 70 61 73 73 20 74 6f 20 74 68 65 20 66 6c  o pass to the fl
2cce0 61 67 73 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a  ags parameter.**
2ccf0 20 6f 66 20 74 68 65 20 78 4f 70 65 6e 28 29 20   of the xOpen() 
2cd00 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 73 75  method of the su
2cd10 70 70 6c 69 65 64 20 56 46 53 20 77 68 65 6e 20  pplied VFS when 
2cd20 6f 70 65 6e 69 6e 67 20 66 69 6c 65 73 2e 20 0a  opening files. .
2cd30 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
2cd40 65 72 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c  er object is all
2cd50 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 20 73  ocated and the s
2cd60 70 65 63 69 66 69 65 64 20 66 69 6c 65 20 6f 70  pecified file op
2cd70 65 6e 65 64 20 0a 2a 2a 20 73 75 63 63 65 73 73  ened .** success
2cd80 66 75 6c 6c 79 2c 20 53 51 4c 49 54 45 5f 4f 4b  fully, SQLITE_OK
2cd90 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
2cda0 20 2a 70 70 50 61 67 65 72 20 73 65 74 20 74 6f   *ppPager set to
2cdb0 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65   point to.** the
2cdc0 20 6e 65 77 20 70 61 67 65 72 20 6f 62 6a 65 63   new pager objec
2cdd0 74 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  t. If an error o
2cde0 63 63 75 72 73 2c 20 2a 70 70 50 61 67 65 72 20  ccurs, *ppPager 
2cdf0 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a  is set to NULL.*
2ce00 2a 20 61 6e 64 20 65 72 72 6f 72 20 63 6f 64 65  * and error code
2ce10 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 20   returned. This 
2ce20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74  function may ret
2ce30 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2ce40 0a 2a 2a 20 28 73 71 6c 69 74 65 33 4d 61 6c 6c  .** (sqlite3Mall
2ce50 6f 63 28 29 20 69 73 20 75 73 65 64 20 74 6f 20  oc() is used to 
2ce60 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 29  allocate memory)
2ce70 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  , SQLITE_CANTOPE
2ce80 4e 20 6f 72 20 0a 2a 2a 20 76 61 72 69 6f 75 73  N or .** various
2ce90 20 53 51 4c 49 54 45 5f 49 4f 5f 58 58 58 20 65   SQLITE_IO_XXX e
2cea0 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rrors..*/.int sq
2ceb0 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a  lite3PagerOpen(.
2cec0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
2ced0 56 66 73 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  Vfs,       /* Th
2cee0 65 20 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73  e virtual file s
2cef0 79 73 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a  ystem to use */.
2cf00 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65    Pager **ppPage
2cf10 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55  r,         /* OU
2cf20 54 3a 20 52 65 74 75 72 6e 20 74 68 65 20 50 61  T: Return the Pa
2cf30 67 65 72 20 73 74 72 75 63 74 75 72 65 20 68 65  ger structure he
2cf40 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  re */.  const ch
2cf50 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  ar *zFilename,  
2cf60 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
2cf70 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
2cf80 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e   open */.  int n
2cf90 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 20 20  Extra,          
2cfa0 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74      /* Extra byt
2cfb0 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63  es append to eac
2cfc0 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  h in-memory page
2cfd0 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
2cfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2cff0 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c  * flags controll
2d000 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f  ing this file */
2d010 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 2c  .  int vfsFlags,
2d020 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
2d030 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f  lags passed thro
2d040 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76  ugh to sqlite3_v
2d050 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20  fs.xOpen() */.  
2d060 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28  void (*xReinit)(
2d070 44 62 50 61 67 65 2a 29 20 2f 2a 20 46 75 6e 63  DbPage*) /* Func
2d080 74 69 6f 6e 20 74 6f 20 72 65 69 6e 69 74 69 61  tion to reinitia
2d090 6c 69 7a 65 20 70 61 67 65 73 20 2a 2f 0a 29 7b  lize pages */.){
2d0a0 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a 20 20 50  .  u8 *pPtr;.  P
2d0b0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30  ager *pPager = 0
2d0c0 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72  ;       /* Pager
2d0d0 20 6f 62 6a 65 63 74 20 74 6f 20 61 6c 6c 6f 63   object to alloc
2d0e0 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 2a  ate and return *
2d0f0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
2d100 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20  ITE_OK;      /* 
2d110 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
2d120 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20   int tempFile = 
2d130 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  0;        /* Tru
2d140 65 20 66 6f 72 20 74 65 6d 70 20 66 69 6c 65 73  e for temp files
2d150 20 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f 72   (incl. in-memor
2d160 79 20 66 69 6c 65 73 29 20 2a 2f 0a 20 20 69 6e  y files) */.  in
2d170 74 20 6d 65 6d 44 62 20 3d 20 30 3b 20 20 20 20  t memDb = 0;    
2d180 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2d190 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d  f this is an in-
2d1a0 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20  memory file */. 
2d1b0 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20   int readOnly = 
2d1c0 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  0;        /* Tru
2d1d0 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 72  e if this is a r
2d1e0 65 61 64 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f  ead-only file */
2d1f0 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69  .  int journalFi
2d200 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 42  leSize;     /* B
2d210 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ytes to allocate
2d220 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61   for each journa
2d230 6c 20 66 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  l fd */.  char *
2d240 7a 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20  zPathname = 0;  
2d250 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61 74 68 20     /* Full path 
2d260 74 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  to database file
2d270 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74 68 6e   */.  int nPathn
2d280 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ame = 0;       /
2d290 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
2d2a0 73 20 69 6e 20 7a 50 61 74 68 6e 61 6d 65 20 2a  s in zPathname *
2d2b0 2f 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e  /.  int useJourn
2d2c0 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41  al = (flags & PA
2d2d0 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c  GER_OMIT_JOURNAL
2d2e0 29 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73 65 20 74  )==0; /* False t
2d2f0 6f 20 6f 6d 69 74 20 6a 6f 75 72 6e 61 6c 20 2a  o omit journal *
2d300 2f 0a 20 20 69 6e 74 20 70 63 61 63 68 65 53 69  /.  int pcacheSi
2d310 7a 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  ze = sqlite3Pcac
2d320 68 65 53 69 7a 65 28 29 3b 20 20 20 20 20 20 20  heSize();       
2d330 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f  /* Bytes to allo
2d340 63 61 74 65 20 66 6f 72 20 50 43 61 63 68 65 20  cate for PCache 
2d350 2a 2f 0a 20 20 75 33 32 20 73 7a 50 61 67 65 44  */.  u32 szPageD
2d360 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  flt = SQLITE_DEF
2d370 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20  AULT_PAGE_SIZE; 
2d380 20 2f 2a 20 44 65 66 61 75 6c 74 20 70 61 67 65   /* Default page
2d390 20 73 69 7a 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   size */.  const
2d3a0 20 63 68 61 72 20 2a 7a 55 72 69 20 3d 20 30 3b   char *zUri = 0;
2d3b0 20 20 20 20 2f 2a 20 55 52 49 20 61 72 67 73 20      /* URI args 
2d3c0 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74  to copy */.  int
2d3d0 20 6e 55 72 69 20 3d 20 30 3b 20 20 20 20 20 20   nUri = 0;      
2d3e0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2d3f0 6f 66 20 62 79 74 65 73 20 6f 66 20 55 52 49 20  of bytes of URI 
2d400 61 72 67 73 20 61 74 20 2a 7a 55 72 69 20 2a 2f  args at *zUri */
2d410 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
2d420 74 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65  t how much space
2d430 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72   is required for
2d440 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 69   each journal fi
2d450 6c 65 2d 68 61 6e 64 6c 65 0a 20 20 2a 2a 20 28  le-handle.  ** (
2d460 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f 66  there are two of
2d470 20 74 68 65 6d 2c 20 74 68 65 20 6d 61 69 6e 20   them, the main 
2d480 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20  journal and the 
2d490 73 75 62 2d 6a 6f 75 72 6e 61 6c 29 2e 20 20 2a  sub-journal).  *
2d4a0 2f 0a 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53  /.  journalFileS
2d4b0 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c  ize = ROUND8(sql
2d4c0 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28  ite3JournalSize(
2d4d0 70 56 66 73 29 29 3b 0a 0a 20 20 2f 2a 20 53 65  pVfs));..  /* Se
2d4e0 74 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72  t the output var
2d4f0 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20 69 6e  iable to NULL in
2d500 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f   case an error o
2d510 63 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70 70 50  ccurs. */.  *ppP
2d520 61 67 65 72 20 3d 20 30 3b 0a 0a 23 69 66 6e 64  ager = 0;..#ifnd
2d530 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
2d540 45 4d 4f 52 59 44 42 0a 20 20 69 66 28 20 66 6c  EMORYDB.  if( fl
2d550 61 67 73 20 26 20 50 41 47 45 52 5f 4d 45 4d 4f  ags & PAGER_MEMO
2d560 52 59 20 29 7b 0a 20 20 20 20 6d 65 6d 44 62 20  RY ){.    memDb 
2d570 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 7a 46 69  = 1;.    if( zFi
2d580 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e  lename && zFilen
2d590 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  ame[0] ){.      
2d5a0 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  zPathname = sqli
2d5b0 74 65 33 44 62 53 74 72 44 75 70 28 30 2c 20 7a  te3DbStrDup(0, z
2d5c0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
2d5d0 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d   if( zPathname==
2d5e0 30 20 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  0  ) return SQLI
2d5f0 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
2d600 20 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d       nPathname =
2d610 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
2d620 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  (zPathname);.   
2d630 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30     zFilename = 0
2d640 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
2d650 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65  if..  /* Compute
2d660 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 66   and store the f
2d670 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 69 6e 20  ull pathname in 
2d680 61 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66  an allocated buf
2d690 66 65 72 20 70 6f 69 6e 74 65 64 0a 20 20 2a 2a  fer pointed.  **
2d6a0 20 74 6f 20 62 79 20 7a 50 61 74 68 6e 61 6d 65   to by zPathname
2d6b0 2c 20 6c 65 6e 67 74 68 20 6e 50 61 74 68 6e 61  , length nPathna
2d6c0 6d 65 2e 20 4f 72 2c 20 69 66 20 74 68 69 73 20  me. Or, if this 
2d6d0 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  is a temporary f
2d6e0 69 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61 76 65 20  ile,.  ** leave 
2d6f0 62 6f 74 68 20 6e 50 61 74 68 6e 61 6d 65 20 61  both nPathname a
2d700 6e 64 20 7a 50 61 74 68 6e 61 6d 65 20 73 65 74  nd zPathname set
2d710 20 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66   to 0..  */.  if
2d720 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a  ( zFilename && z
2d730 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20  Filename[0] ){. 
2d740 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2d750 3b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20  ;.    nPathname 
2d760 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  = pVfs->mxPathna
2d770 6d 65 2b 31 3b 0a 20 20 20 20 7a 50 61 74 68 6e  me+1;.    zPathn
2d780 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ame = sqlite3DbM
2d790 61 6c 6c 6f 63 52 61 77 28 30 2c 20 6e 50 61 74  allocRaw(0, nPat
2d7a0 68 6e 61 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66  hname*2);.    if
2d7b0 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29  ( zPathname==0 )
2d7c0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
2d7d0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
2d7e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 50 61 74  ;.    }.    zPat
2d7f0 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 20 2f 2a  hname[0] = 0; /*
2d800 20 4d 61 6b 65 20 73 75 72 65 20 69 6e 69 74 69   Make sure initi
2d810 61 6c 69 7a 65 64 20 65 76 65 6e 20 69 66 20 46  alized even if F
2d820 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29 20 66 61  ullPathname() fa
2d830 69 6c 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ils */.    rc = 
2d840 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74  sqlite3OsFullPat
2d850 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c  hname(pVfs, zFil
2d860 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  ename, nPathname
2d870 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , zPathname);.  
2d880 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 71    nPathname = sq
2d890 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50  lite3Strlen30(zP
2d8a0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 20  athname);.    z 
2d8b0 3d 20 7a 55 72 69 20 3d 20 26 7a 46 69 6c 65 6e  = zUri = &zFilen
2d8c0 61 6d 65 5b 73 71 6c 69 74 65 33 53 74 72 6c 65  ame[sqlite3Strle
2d8d0 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b 31  n30(zFilename)+1
2d8e0 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 7a  ];.    while( *z
2d8f0 20 29 7b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 73   ){.      z += s
2d900 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
2d910 29 2b 31 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20  )+1;.      z += 
2d920 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
2d930 7a 29 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  z)+1;.    }.    
2d940 6e 55 72 69 20 3d 20 28 69 6e 74 29 28 26 7a 5b  nUri = (int)(&z[
2d950 31 5d 20 2d 20 7a 55 72 69 29 3b 0a 20 20 20 20  1] - zUri);.    
2d960 61 73 73 65 72 74 28 20 6e 55 72 69 3e 3d 30 20  assert( nUri>=0 
2d970 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
2d980 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 50 61 74  QLITE_OK && nPat
2d990 68 6e 61 6d 65 2b 38 3e 70 56 66 73 2d 3e 6d 78  hname+8>pVfs->mx
2d9a0 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
2d9b0 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
2d9c0 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 74   is taken when t
2d9d0 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 74 68 20  he journal path 
2d9e0 72 65 71 75 69 72 65 64 20 62 79 0a 20 20 20 20  required by.    
2d9f0 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
2da00 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 77  e being opened w
2da10 69 6c 6c 20 62 65 20 6d 6f 72 65 20 74 68 61 6e  ill be more than
2da20 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
2da30 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73  e.      ** bytes
2da40 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54 68 69 73   in length. This
2da50 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62   means the datab
2da60 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70  ase cannot be op
2da70 65 6e 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20 61  ened,.      ** a
2da80 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65  s it will not be
2da90 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f 70 65   possible to ope
2daa0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
2dab0 6c 65 20 6f 72 20 65 76 65 6e 0a 20 20 20 20 20  le or even.     
2dac0 20 2a 2a 20 63 68 65 63 6b 20 66 6f 72 20 61 20   ** check for a 
2dad0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 65 66 6f  hot-journal befo
2dae0 72 65 20 72 65 61 64 69 6e 67 2e 0a 20 20 20 20  re reading..    
2daf0 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
2db00 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
2db10 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
2db20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2db30 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
2db40 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50 61 74  e3DbFree(0, zPat
2db50 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65  hname);.      re
2db60 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
2db70 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74   }..  /* Allocat
2db80 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65  e memory for the
2db90 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
2dba0 2c 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2c  , PCache object,
2dbb0 20 74 68 65 0a 20 20 2a 2a 20 74 68 72 65 65 20   the.  ** three 
2dbc0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
2dbd0 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  , the database f
2dbe0 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65  ile name and the
2dbf0 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66   journal .  ** f
2dc00 69 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 6c 61  ile name. The la
2dc10 79 6f 75 74 20 69 6e 20 6d 65 6d 6f 72 79 20 69  yout in memory i
2dc20 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  s as follows:.  
2dc30 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 50 61 67 65  **.  **     Page
2dc40 72 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20  r object        
2dc50 20 20 20 20 20 20 20 20 20 20 20 20 28 73 69 7a              (siz
2dc60 65 6f 66 28 50 61 67 65 72 29 20 62 79 74 65 73  eof(Pager) bytes
2dc70 29 0a 20 20 2a 2a 20 20 20 20 20 50 43 61 63 68  ).  **     PCach
2dc80 65 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20  e object        
2dc90 20 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69             (sqli
2dca0 74 65 33 50 63 61 63 68 65 53 69 7a 65 28 29 20  te3PcacheSize() 
2dcb0 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
2dcc0 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  Database file ha
2dcd0 6e 64 6c 65 20 20 20 20 20 20 20 20 20 20 20 20  ndle            
2dce0 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20  (pVfs->szOsFile 
2dcf0 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
2dd00 53 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  Sub-journal file
2dd10 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20   handle         
2dd20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65  (journalFileSize
2dd30 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
2dd40 20 4d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   Main journal fi
2dd50 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20  le handle       
2dd60 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a   (journalFileSiz
2dd70 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  e bytes).  **   
2dd80 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20    Database file 
2dd90 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20  name            
2dda0 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 31 20 62    (nPathname+1 b
2ddb0 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4a  ytes).  **     J
2ddc0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
2ddd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2dde0 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31 20 62 79  nPathname+8+1 by
2ddf0 74 65 73 29 0a 20 20 2a 2f 0a 20 20 70 50 74 72  tes).  */.  pPtr
2de00 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33   = (u8 *)sqlite3
2de10 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20  MallocZero(.    
2de20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70  ROUND8(sizeof(*p
2de30 50 61 67 65 72 29 29 20 2b 20 20 20 20 20 20 2f  Pager)) +      /
2de40 2a 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  * Pager structur
2de50 65 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28  e */.    ROUND8(
2de60 70 63 61 63 68 65 53 69 7a 65 29 20 2b 20 20 20  pcacheSize) +   
2de70 20 20 20 20 20 20 20 20 2f 2a 20 50 43 61 63 68          /* PCach
2de80 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20  e object */.    
2de90 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f  ROUND8(pVfs->szO
2dea0 73 46 69 6c 65 29 20 2b 20 20 20 20 20 20 20 2f  sFile) +       /
2deb0 2a 20 54 68 65 20 6d 61 69 6e 20 64 62 20 66 69  * The main db fi
2dec0 6c 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61  le */.    journa
2ded0 6c 46 69 6c 65 53 69 7a 65 20 2a 20 32 20 2b 20  lFileSize * 2 + 
2dee0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2def0 74 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  two journal file
2df00 73 20 2a 2f 20 0a 20 20 20 20 6e 50 61 74 68 6e  s */ .    nPathn
2df10 61 6d 65 20 2b 20 31 20 2b 20 6e 55 72 69 20 2b  ame + 1 + nUri +
2df20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c           /* zFil
2df30 65 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 50 61  ename */.    nPa
2df40 74 68 6e 61 6d 65 20 2b 20 38 20 2b 20 32 20 20  thname + 8 + 2  
2df50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
2df60 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64  Journal */.#ifnd
2df70 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
2df80 41 4c 0a 20 20 20 20 2b 20 6e 50 61 74 68 6e 61  AL.    + nPathna
2df90 6d 65 20 2b 20 34 20 2b 20 32 20 20 20 20 20 20  me + 4 + 2      
2dfa0 20 20 20 20 20 20 2f 2a 20 7a 57 61 6c 20 2a 2f        /* zWal */
2dfb0 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a 20 20 61  .#endif.  );.  a
2dfc0 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
2dfd0 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 53 51 4c 49  E_ALIGNMENT(SQLI
2dfe0 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6a 6f  TE_INT_TO_PTR(jo
2dff0 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 29 20  urnalFileSize)) 
2e000 29 3b 0a 20 20 69 66 28 20 21 70 50 74 72 20 29  );.  if( !pPtr )
2e010 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
2e020 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65  ree(0, zPathname
2e030 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
2e040 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
2e050 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 20 3d 20  .  }.  pPager = 
2e060 20 20 20 20 20 20 20 20 20 20 20 20 20 28 50 61               (Pa
2e070 67 65 72 2a 29 28 70 50 74 72 29 3b 0a 20 20 70  ger*)(pPtr);.  p
2e080 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 20 3d  Pager->pPCache =
2e090 20 20 20 20 28 50 43 61 63 68 65 2a 29 28 70 50      (PCache*)(pP
2e0a0 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a  tr += ROUND8(siz
2e0b0 65 6f 66 28 2a 70 50 61 67 65 72 29 29 29 3b 0a  eof(*pPager)));.
2e0c0 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 20    pPager->fd =  
2e0d0 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
2e0e0 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28  (pPtr += ROUND8(
2e0f0 70 63 61 63 68 65 53 69 7a 65 29 29 3b 0a 20 20  pcacheSize));.  
2e100 70 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d 20 28  pPager->sjfd = (
2e110 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70  sqlite3_file*)(p
2e120 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 56  Ptr += ROUND8(pV
2e130 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 29 3b 0a  fs->szOsFile));.
2e140 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20    pPager->jfd = 
2e150 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
2e160 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c  (pPtr += journal
2e170 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61  FileSize);.  pPa
2e180 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d  ger->zFilename =
2e190 20 20 20 20 28 63 68 61 72 2a 29 28 70 50 74 72      (char*)(pPtr
2e1a0 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53   += journalFileS
2e1b0 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ize);.  assert( 
2e1c0 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
2e1d0 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e 6a 66 64  MENT(pPager->jfd
2e1e0 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20  ) );..  /* Fill 
2e1f0 69 6e 20 74 68 65 20 50 61 67 65 72 2e 7a 46 69  in the Pager.zFi
2e200 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61 67 65 72  lename and Pager
2e210 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66 66 65 72  .zJournal buffer
2e220 73 2c 20 69 66 20 72 65 71 75 69 72 65 64 2e 20  s, if required. 
2e230 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74 68 6e 61  */.  if( zPathna
2e240 6d 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  me ){.    assert
2e250 28 20 6e 50 61 74 68 6e 61 6d 65 3e 30 20 29 3b  ( nPathname>0 );
2e260 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  .    pPager->zJo
2e270 75 72 6e 61 6c 20 3d 20 20 20 28 63 68 61 72 2a  urnal =   (char*
2e280 29 28 70 50 74 72 20 2b 3d 20 6e 50 61 74 68 6e  )(pPtr += nPathn
2e290 61 6d 65 20 2b 20 31 20 2b 20 6e 55 72 69 29 3b  ame + 1 + nUri);
2e2a0 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67  .    memcpy(pPag
2e2b0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a  er->zFilename, z
2e2c0 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Pathname, nPathn
2e2d0 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 55  ame);.    if( nU
2e2e0 72 69 20 29 20 6d 65 6d 63 70 79 28 26 70 50 61  ri ) memcpy(&pPa
2e2f0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e  ger->zFilename[n
2e300 50 61 74 68 6e 61 6d 65 2b 31 5d 2c 20 7a 55 72  Pathname+1], zUr
2e310 69 2c 20 6e 55 72 69 29 3b 0a 20 20 20 20 6d 65  i, nUri);.    me
2e320 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  mcpy(pPager->zJo
2e330 75 72 6e 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65  urnal, zPathname
2e340 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , nPathname);.  
2e350 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
2e360 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68  ->zJournal[nPath
2e370 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c  name], "-journal
2e380 5c 30 30 30 22 2c 20 38 2b 32 29 3b 0a 20 20 20  \000", 8+2);.   
2e390 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66   sqlite3FileSuff
2e3a0 69 78 33 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c  ix3(pPager->zFil
2e3b0 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a  ename, pPager->z
2e3c0 4a 6f 75 72 6e 61 6c 29 3b 0a 23 69 66 6e 64 65  Journal);.#ifnde
2e3d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
2e3e0 4c 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 57  L.    pPager->zW
2e3f0 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 4a  al = &pPager->zJ
2e400 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65  ournal[nPathname
2e410 2b 38 2b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70  +8+1];.    memcp
2e420 79 28 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20  y(pPager->zWal, 
2e430 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68  zPathname, nPath
2e440 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70  name);.    memcp
2e450 79 28 26 70 50 61 67 65 72 2d 3e 7a 57 61 6c 5b  y(&pPager->zWal[
2e460 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 77 61  nPathname], "-wa
2e470 6c 5c 30 30 30 22 2c 20 34 2b 31 29 3b 0a 20 20  l\000", 4+1);.  
2e480 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66    sqlite3FileSuf
2e490 66 69 78 33 28 70 50 61 67 65 72 2d 3e 7a 46 69  fix3(pPager->zFi
2e4a0 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e  lename, pPager->
2e4b0 7a 57 61 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20  zWal);.#endif.  
2e4c0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2e4d0 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  0, zPathname);. 
2e4e0 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 56 66   }.  pPager->pVf
2e4f0 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 50 61 67  s = pVfs;.  pPag
2e500 65 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20 76  er->vfsFlags = v
2e510 66 73 46 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f  fsFlags;..  /* O
2e520 70 65 6e 20 74 68 65 20 70 61 67 65 72 20 66 69  pen the pager fi
2e530 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a  le..  */.  if( z
2e540 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c  Filename && zFil
2e550 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20  ename[0] ){.    
2e560 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 20 20 20  int fout = 0;   
2e570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e580 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 72 65   /* VFS flags re
2e590 74 75 72 6e 65 64 20 62 79 20 78 4f 70 65 6e 28  turned by xOpen(
2e5a0 29 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  ) */.    rc = sq
2e5b0 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
2e5c0 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  , pPager->zFilen
2e5d0 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c  ame, pPager->fd,
2e5e0 20 76 66 73 46 6c 61 67 73 2c 20 26 66 6f 75 74   vfsFlags, &fout
2e5f0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
2e600 6d 65 6d 44 62 20 29 3b 0a 20 20 20 20 72 65 61  memDb );.    rea
2e610 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53 51  dOnly = (fout&SQ
2e620 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
2e630 4c 59 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  LY);..    /* If 
2e640 74 68 65 20 66 69 6c 65 20 77 61 73 20 73 75 63  the file was suc
2e650 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64  cessfully opened
2e660 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20   for read/write 
2e670 61 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 63  access,.    ** c
2e680 68 6f 6f 73 65 20 61 20 64 65 66 61 75 6c 74 20  hoose a default 
2e690 70 61 67 65 20 73 69 7a 65 20 69 6e 20 63 61 73  page size in cas
2e6a0 65 20 77 65 20 68 61 76 65 20 74 6f 20 63 72 65  e we have to cre
2e6b0 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64  ate the.    ** d
2e6c0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
2e6d0 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73  e default page s
2e6e0 69 7a 65 20 69 73 20 74 68 65 20 6d 61 78 69 6d  ize is the maxim
2e6f0 75 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20  um of:.    **.  
2e700 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54 45    **    + SQLITE
2e710 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2e720 5a 45 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20  ZE,.    **    + 
2e730 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
2e740 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53  ed by sqlite3OsS
2e750 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20  ectorSize().    
2e760 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72 67  **    + The larg
2e770 65 73 74 20 70 61 67 65 20 73 69 7a 65 20 74 68  est page size th
2e780 61 74 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  at can be writte
2e790 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20  n atomically..  
2e7a0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
2e7b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2e7c0 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71      int iDc = sq
2e7d0 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
2e7e0 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
2e7f0 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20  ger->fd);.      
2e800 69 66 28 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b  if( !readOnly ){
2e810 0a 20 20 20 20 20 20 20 20 73 65 74 53 65 63 74  .        setSect
2e820 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  orSize(pPager);.
2e830 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53          assert(S
2e840 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
2e850 47 45 5f 53 49 5a 45 3c 3d 53 51 4c 49 54 45 5f  GE_SIZE<=SQLITE_
2e860 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
2e870 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 20 20  _SIZE);.        
2e880 69 66 28 20 73 7a 50 61 67 65 44 66 6c 74 3c 70  if( szPageDflt<p
2e890 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
2e8a0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  e ){.          i
2e8b0 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  f( pPager->secto
2e8c0 72 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58  rSize>SQLITE_MAX
2e8d0 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2e8e0 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ZE ){.          
2e8f0 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53    szPageDflt = S
2e900 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
2e910 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20  T_PAGE_SIZE;.   
2e920 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2e930 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65            szPage
2e940 44 66 6c 74 20 3d 20 28 75 33 32 29 70 50 61 67  Dflt = (u32)pPag
2e950 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a  er->sectorSize;.
2e960 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2e970 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
2e980 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
2e990 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20 20 20  C_WRITE.        
2e9a0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
2e9b0 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  ii;.          as
2e9c0 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
2e9d0 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31  P_ATOMIC512==(51
2e9e0 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20  2>>8));.        
2e9f0 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
2ea00 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d  IOCAP_ATOMIC64K=
2ea10 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20  =(65536>>8));.  
2ea20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53          assert(S
2ea30 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
2ea40 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35  T_PAGE_SIZE<=655
2ea50 33 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66  36);.          f
2ea60 6f 72 28 69 69 3d 73 7a 50 61 67 65 44 66 6c 74  or(ii=szPageDflt
2ea70 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  ; ii<=SQLITE_MAX
2ea80 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2ea90 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20  ZE; ii=ii*2){.  
2eaa0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 44            if( iD
2eab0 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  c&(SQLITE_IOCAP_
2eac0 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20  ATOMIC|(ii>>8)) 
2ead0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2eae0 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 69 69   szPageDflt = ii
2eaf0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2eb00 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2eb10 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
2eb20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
2eb30 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d 20 73 71 6c 69  r->noLock = sqli
2eb40 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28  te3_uri_boolean(
2eb50 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 6e 6f 6c 6f  zFilename, "nolo
2eb60 63 6b 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ck", 0);.      i
2eb70 66 28 20 28 69 44 63 20 26 20 53 51 4c 49 54 45  f( (iDc & SQLITE
2eb80 5f 49 4f 43 41 50 5f 49 4d 4d 55 54 41 42 4c 45  _IOCAP_IMMUTABLE
2eb90 29 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 73  )!=0.       || s
2eba0 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65  qlite3_uri_boole
2ebb0 61 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 69  an(zFilename, "i
2ebc0 6d 6d 75 74 61 62 6c 65 22 2c 20 30 29 20 29 7b  mmutable", 0) ){
2ebd0 0a 20 20 20 20 20 20 20 20 20 20 76 66 73 46 6c  .          vfsFl
2ebe0 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50  ags |= SQLITE_OP
2ebf0 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  EN_READONLY;.   
2ec00 20 20 20 20 20 20 20 67 6f 74 6f 20 61 63 74 5f         goto act_
2ec10 6c 69 6b 65 5f 74 65 6d 70 5f 66 69 6c 65 3b 0a  like_temp_file;.
2ec20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2ec30 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
2ec40 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
2ec50 65 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  e is requested, 
2ec60 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64  it is not opened
2ec70 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20   immediately..  
2ec80 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
2ec90 65 20 77 65 20 61 63 63 65 70 74 20 74 68 65 20  e we accept the 
2eca0 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  default page siz
2ecb0 65 20 61 6e 64 20 64 65 6c 61 79 20 61 63 74 75  e and delay actu
2ecc0 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e  ally.    ** open
2ecd0 69 6e 67 20 74 68 65 20 66 69 6c 65 20 75 6e 74  ing the file unt
2ece0 69 6c 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  il the first cal
2ecf0 6c 20 74 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a  l to OsWrite()..
2ed00 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
2ed10 69 73 20 62 72 61 6e 63 68 20 69 73 20 61 6c 73  is branch is als
2ed20 6f 20 72 75 6e 20 66 6f 72 20 61 6e 20 69 6e 2d  o run for an in-
2ed30 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
2ed40 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20   An in-memory.  
2ed50 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73    ** database is
2ed60 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 20 74   the same as a t
2ed70 65 6d 70 2d 66 69 6c 65 20 74 68 61 74 20 69 73  emp-file that is
2ed80 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 6f   never written o
2ed90 75 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73  ut to.    ** dis
2eda0 6b 20 61 6e 64 20 75 73 65 73 20 61 6e 20 69 6e  k and uses an in
2edb0 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62 61 63 6b  -memory rollback
2edc0 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2a   journal..    **
2edd0 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62 72 61  .    ** This bra
2ede0 6e 63 68 20 61 6c 73 6f 20 72 75 6e 73 20 66 6f  nch also runs fo
2edf0 72 20 66 69 6c 65 73 20 6d 61 72 6b 65 64 20 61  r files marked a
2ee00 73 20 69 6d 6d 75 74 61 62 6c 65 2e 0a 20 20 20  s immutable..   
2ee10 20 2a 2f 20 0a 61 63 74 5f 6c 69 6b 65 5f 74 65   */ .act_like_te
2ee20 6d 70 5f 66 69 6c 65 3a 0a 20 20 20 20 74 65 6d  mp_file:.    tem
2ee30 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70  pFile = 1;.    p
2ee40 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
2ee50 50 41 47 45 52 5f 52 45 41 44 45 52 3b 20 20 20  PAGER_READER;   
2ee60 20 20 2f 2a 20 50 72 65 74 65 6e 64 20 77 65 20    /* Pretend we 
2ee70 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20 6c  already have a l
2ee80 6f 63 6b 20 2a 2f 0a 20 20 20 20 70 50 61 67 65  ock */.    pPage
2ee90 72 2d 3e 65 4c 6f 63 6b 20 3d 20 45 58 43 4c 55  r->eLock = EXCLU
2eea0 53 49 56 45 5f 4c 4f 43 4b 3b 20 20 20 20 2f 2a  SIVE_LOCK;    /*
2eeb0 20 50 72 65 74 65 6e 64 20 77 65 20 61 72 65 20   Pretend we are 
2eec0 69 6e 20 45 58 43 4c 55 53 49 56 45 20 6d 6f 64  in EXCLUSIVE mod
2eed0 65 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d  e */.    pPager-
2eee0 3e 6e 6f 4c 6f 63 6b 20 3d 20 31 3b 20 20 20 20  >noLock = 1;    
2eef0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
2ef00 6f 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a  o no locking */.
2ef10 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28      readOnly = (
2ef20 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f  vfsFlags&SQLITE_
2ef30 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a  OPEN_READONLY);.
2ef40 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f    }..  /* The fo
2ef50 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f 20  llowing call to 
2ef60 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
2ef70 28 29 20 73 65 72 76 65 73 20 74 6f 20 73 65 74  () serves to set
2ef80 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 0a 20   the value of . 
2ef90 20 2a 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69   ** Pager.pageSi
2efa0 7a 65 20 61 6e 64 20 74 6f 20 61 6c 6c 6f 63 61  ze and to alloca
2efb0 74 65 20 74 68 65 20 50 61 67 65 72 2e 70 54 6d  te the Pager.pTm
2efc0 70 53 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20  pSpace buffer.. 
2efd0 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
2efe0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
2eff0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d  ssert( pPager->m
2f000 65 6d 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20 72  emDb==0 );.    r
2f010 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2f020 53 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67  SetPagesize(pPag
2f030 65 72 2c 20 26 73 7a 50 61 67 65 44 66 6c 74 2c  er, &szPageDflt,
2f040 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61   -1);.    testca
2f050 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
2f060 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  K );.  }..  /* I
2f070 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 50 43  nitialize the PC
2f080 61 63 68 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a  ache object. */.
2f090 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2f0a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
2f0b0 74 28 20 6e 45 78 74 72 61 3c 31 30 30 30 20 29  t( nExtra<1000 )
2f0c0 3b 0a 20 20 20 20 6e 45 78 74 72 61 20 3d 20 52  ;.    nExtra = R
2f0d0 4f 55 4e 44 38 28 6e 45 78 74 72 61 29 3b 0a 20  OUND8(nExtra);. 
2f0e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2f0f0 63 61 63 68 65 4f 70 65 6e 28 73 7a 50 61 67 65  cacheOpen(szPage
2f100 44 66 6c 74 2c 20 6e 45 78 74 72 61 2c 20 21 6d  Dflt, nExtra, !m
2f110 65 6d 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20  emDb,.          
2f120 20 20 20 20 20 20 20 20 20 20 20 20 20 21 6d 65               !me
2f130 6d 44 62 3f 70 61 67 65 72 53 74 72 65 73 73 3a  mDb?pagerStress:
2f140 30 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65  0, (void *)pPage
2f150 72 2c 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63  r, pPager->pPCac
2f160 68 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  he);.  }..  /* I
2f170 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
2f180 72 65 64 20 61 62 6f 76 65 2c 20 66 72 65 65 20  red above, free 
2f190 74 68 65 20 20 50 61 67 65 72 20 73 74 72 75 63  the  Pager struc
2f1a0 74 75 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74  ture and close t
2f1b0 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  he file..  */.  
2f1c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2f1d0 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
2f1e0 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
2f1f0 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  fd);.    sqlite3
2f200 50 61 67 65 46 72 65 65 28 70 50 61 67 65 72 2d  PageFree(pPager-
2f210 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20  >pTmpSpace);.   
2f220 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
2f230 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72  ager);.    retur
2f240 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 50 41 47  n rc;.  }..  PAG
2f250 45 52 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25  ERTRACE(("OPEN %
2f260 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e  d %s\n", FILEHAN
2f270 44 4c 45 49 44 28 70 50 61 67 65 72 2d 3e 66 64  DLEID(pPager->fd
2f280 29 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  ), pPager->zFile
2f290 6e 61 6d 65 29 29 3b 0a 20 20 49 4f 54 52 41 43  name));.  IOTRAC
2f2a0 45 28 28 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e  E(("OPEN %p %s\n
2f2b0 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65  ", pPager, pPage
2f2c0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a  r->zFilename))..
2f2d0 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75    pPager->useJou
2f2e0 72 6e 61 6c 20 3d 20 28 75 38 29 75 73 65 4a 6f  rnal = (u8)useJo
2f2f0 75 72 6e 61 6c 3b 0a 20 20 2f 2a 20 70 50 61 67  urnal;.  /* pPag
2f300 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30  er->stmtOpen = 0
2f310 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2f320 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b  ->stmtInUse = 0;
2f330 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2f340 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20  >nRef = 0; */.  
2f350 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  /* pPager->stmtS
2f360 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ize = 0; */.  /*
2f370 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
2f380 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ze = 0; */.  /* 
2f390 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20  pPager->nPage = 
2f3a0 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
2f3b0 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f  mxPgno = SQLITE_
2f3c0 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a  MAX_PAGE_COUNT;.
2f3d0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61    /* pPager->sta
2f3e0 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43  te = PAGER_UNLOC
2f3f0 4b 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  K; */.  /* pPage
2f400 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20  r->errMask = 0; 
2f410 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d  */.  pPager->tem
2f420 70 46 69 6c 65 20 3d 20 28 75 38 29 74 65 6d 70  pFile = (u8)temp
2f430 46 69 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20  File;.  assert( 
2f440 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f  tempFile==PAGER_
2f450 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d  LOCKINGMODE_NORM
2f460 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c  AL .          ||
2f470 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52   tempFile==PAGER
2f480 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
2f490 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65  LUSIVE );.  asse
2f4a0 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  rt( PAGER_LOCKIN
2f4b0 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3d  GMODE_EXCLUSIVE=
2f4c0 3d 31 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  =1 );.  pPager->
2f4d0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
2f4e0 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 20 0a 20  (u8)tempFile; . 
2f4f0 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
2f500 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65  ountDone = pPage
2f510 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70  r->tempFile;.  p
2f520 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 28  Pager->memDb = (
2f530 75 38 29 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67  u8)memDb;.  pPag
2f540 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 28  er->readOnly = (
2f550 75 38 29 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 61  u8)readOnly;.  a
2f560 73 73 65 72 74 28 20 75 73 65 4a 6f 75 72 6e 61  ssert( useJourna
2f570 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  l || pPager->tem
2f580 70 46 69 6c 65 20 29 3b 0a 20 20 70 50 61 67 65  pFile );.  pPage
2f590 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67  r->noSync = pPag
2f5a0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20  er->tempFile;.  
2f5b0 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  if( pPager->noSy
2f5c0 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  nc ){.    assert
2f5d0 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
2f5e0 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  nc==0 );.    ass
2f5f0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 78 74  ert( pPager->ext
2f600 72 61 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  raSync==0 );.   
2f610 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2f620 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b  >syncFlags==0 );
2f630 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2f640 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67  ger->walSyncFlag
2f650 73 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  s==0 );.    asse
2f660 72 74 28 20 70 50 61 67 65 72 2d 3e 63 6b 70 74  rt( pPager->ckpt
2f670 53 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a  SyncFlags==0 );.
2f680 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
2f690 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20  ger->fullSync = 
2f6a0 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  1;.    pPager->e
2f6b0 78 74 72 61 53 79 6e 63 20 3d 20 30 3b 0a 20 20  xtraSync = 0;.  
2f6c0 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c    pPager->syncFl
2f6d0 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
2f6e0 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50  C_NORMAL;.    pP
2f6f0 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61  ager->walSyncFla
2f700 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
2f710 5f 4e 4f 52 4d 41 4c 20 7c 20 57 41 4c 5f 53 59  _NORMAL | WAL_SY
2f720 4e 43 5f 54 52 41 4e 53 41 43 54 49 4f 4e 53 3b  NC_TRANSACTIONS;
2f730 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70  .    pPager->ckp
2f740 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c  tSyncFlags = SQL
2f750 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b  ITE_SYNC_NORMAL;
2f760 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72  .  }.  /* pPager
2f770 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f  ->pFirst = 0; */
2f780 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46  .  /* pPager->pF
2f790 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 20  irstSynced = 0; 
2f7a0 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2f7b0 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20  pLast = 0; */.  
2f7c0 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d  pPager->nExtra =
2f7d0 20 28 75 31 36 29 6e 45 78 74 72 61 3b 0a 20 20   (u16)nExtra;.  
2f7e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
2f7f0 69 7a 65 4c 69 6d 69 74 20 3d 20 53 51 4c 49 54  izeLimit = SQLIT
2f800 45 5f 44 45 46 41 55 4c 54 5f 4a 4f 55 52 4e 41  E_DEFAULT_JOURNA
2f810 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20  L_SIZE_LIMIT;.  
2f820 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
2f830 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 74 65  Pager->fd) || te
2f840 6d 70 46 69 6c 65 20 29 3b 0a 20 20 73 65 74 53  mpFile );.  setS
2f850 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
2f860 29 3b 0a 20 20 69 66 28 20 21 75 73 65 4a 6f 75  );.  if( !useJou
2f870 72 6e 61 6c 20 29 7b 0a 20 20 20 20 70 50 61 67  rnal ){.    pPag
2f880 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  er->journalMode 
2f890 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  = PAGER_JOURNALM
2f8a0 4f 44 45 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73 65  ODE_OFF;.  }else
2f8b0 20 69 66 28 20 6d 65 6d 44 62 20 29 7b 0a 20 20   if( memDb ){.  
2f8c0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
2f8d0 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f  lMode = PAGER_JO
2f8e0 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
2f8f0 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65  ;.  }.  /* pPage
2f900 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20  r->xBusyHandler 
2f910 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2f920 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
2f930 72 41 72 67 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  rArg = 0; */.  p
2f940 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
2f950 20 3d 20 78 52 65 69 6e 69 74 3b 0a 20 20 2f 2a   = xReinit;.  /*
2f960 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e   memset(pPager->
2f970 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66  aHash, 0, sizeof
2f980 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29  (pPager->aHash))
2f990 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2f9a0 2d 3e 73 7a 4d 6d 61 70 20 3d 20 53 51 4c 49 54  ->szMmap = SQLIT
2f9b0 45 5f 44 45 46 41 55 4c 54 5f 4d 4d 41 50 5f 53  E_DEFAULT_MMAP_S
2f9c0 49 5a 45 20 2f 2f 20 77 69 6c 6c 20 62 65 20 73  IZE // will be s
2f9d0 65 74 20 62 79 20 62 74 72 65 65 2e 63 20 2a 2f  et by btree.c */
2f9e0 0a 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70  ..  *ppPager = p
2f9f0 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20  Pager;.  return 
2fa00 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
2fa10 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
2fa20 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2fa30 68 61 73 20 6e 6f 74 20 62 65 20 64 65 6c 65 74  has not be delet
2fa40 65 64 20 6f 72 20 72 65 6e 61 6d 65 64 20 6f 75  ed or renamed ou
2fa50 74 20 66 72 6f 6d 0a 2a 2a 20 75 6e 64 65 72 20  t from.** under 
2fa60 74 68 65 20 70 61 67 65 72 2e 20 20 52 65 74 75  the pager.  Retu
2fa70 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
2fa80 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
2fa90 73 74 69 6c 6c 20 77 65 72 65 20 69 74 20 6f 75  still were it ou
2faa0 67 68 74 0a 2a 2a 20 74 6f 20 62 65 20 6f 6e 20  ght.** to be on 
2fab0 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 6e 6f  disk.  Return no
2fac0 6e 2d 7a 65 72 6f 20 28 53 51 4c 49 54 45 5f 52  n-zero (SQLITE_R
2fad0 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 20  EADONLY_DBMOVED 
2fae0 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72  or some other er
2faf0 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 66 72 6f 6d  ror.** code from
2fb00 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
2fb10 28 29 29 20 69 66 20 74 68 65 20 64 61 74 61 62  ()) if the datab
2fb20 61 73 65 20 68 61 73 20 67 6f 6e 65 20 6d 69 73  ase has gone mis
2fb30 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sing..*/.static 
2fb40 69 6e 74 20 64 61 74 61 62 61 73 65 49 73 55 6e  int databaseIsUn
2fb50 6d 6f 76 65 64 28 50 61 67 65 72 20 2a 70 50 61  moved(Pager *pPa
2fb60 67 65 72 29 7b 0a 20 20 69 6e 74 20 62 48 61 73  ger){.  int bHas
2fb70 4d 6f 76 65 64 20 3d 20 30 3b 0a 20 20 69 6e 74  Moved = 0;.  int
2fb80 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 50 61 67   rc;..  if( pPag
2fb90 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 20 72  er->tempFile ) r
2fba0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2fbb0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
2fbc0 62 53 69 7a 65 3d 3d 30 20 29 20 72 65 74 75 72  bSize==0 ) retur
2fbd0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  n SQLITE_OK;.  a
2fbe0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 7a  ssert( pPager->z
2fbf0 46 69 6c 65 6e 61 6d 65 20 26 26 20 70 50 61 67  Filename && pPag
2fc00 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d  er->zFilename[0]
2fc10 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
2fc20 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  e3OsFileControl(
2fc30 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49  pPager->fd, SQLI
2fc40 54 45 5f 46 43 4e 54 4c 5f 48 41 53 5f 4d 4f 56  TE_FCNTL_HAS_MOV
2fc50 45 44 2c 20 26 62 48 61 73 4d 6f 76 65 64 29 3b  ED, &bHasMoved);
2fc60 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2fc70 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a 20 20  E_NOTFOUND ){.  
2fc80 20 20 2f 2a 20 49 66 20 74 68 65 20 48 41 53 5f    /* If the HAS_
2fc90 4d 4f 56 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72  MOVED file-contr
2fca0 6f 6c 20 69 73 20 75 6e 69 6d 70 6c 65 6d 65 6e  ol is unimplemen
2fcb0 74 65 64 2c 20 61 73 73 75 6d 65 20 74 68 61 74  ted, assume that
2fcc0 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
2fcd0 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f   has not been mo
2fce0 76 65 64 2e 20 20 54 68 61 74 20 69 73 20 74 68  ved.  That is th
2fcf0 65 20 68 69 73 74 6f 72 69 63 61 6c 20 62 65 68  e historical beh
2fd00 61 76 69 6f 72 20 6f 66 20 53 51 4c 69 74 65 3a  avior of SQLite:
2fd10 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 2a 2a   prior to.    **
2fd20 20 76 65 72 73 69 6f 6e 20 33 2e 38 2e 33 2c 20   version 3.8.3, 
2fd30 69 74 20 6e 65 76 65 72 20 63 68 65 63 6b 65 64  it never checked
2fd40 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   */.    rc = SQL
2fd50 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20  ITE_OK;.  }else 
2fd60 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2fd70 4b 20 26 26 20 62 48 61 73 4d 6f 76 65 64 20 29  K && bHasMoved )
2fd80 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
2fd90 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56  E_READONLY_DBMOV
2fda0 45 44 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ED;.  }.  return
2fdb0 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   rc;.}.../*.** T
2fdc0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2fdd0 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74 72 61  called after tra
2fde0 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20  nsitioning from 
2fdf0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a  PAGER_UNLOCK to.
2fe00 2a 2a 20 50 41 47 45 52 5f 53 48 41 52 45 44 20  ** PAGER_SHARED 
2fe10 73 74 61 74 65 2e 20 49 74 20 74 65 73 74 73 20  state. It tests 
2fe20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 68 6f  if there is a ho
2fe30 74 20 6a 6f 75 72 6e 61 6c 20 70 72 65 73 65 6e  t journal presen
2fe40 74 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65  t in.** the file
2fe50 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20  -system for the 
2fe60 67 69 76 65 6e 20 70 61 67 65 72 2e 20 41 20 68  given pager. A h
2fe70 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e  ot journal is on
2fe80 65 20 74 68 61 74 20 0a 2a 2a 20 6e 65 65 64 73  e that .** needs
2fe90 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61   to be played ba
2fea0 63 6b 2e 20 41 63 63 6f 72 64 69 6e 67 20 74 6f  ck. According to
2feb0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
2fec0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a  a hot-journal.**
2fed0 20 66 69 6c 65 20 65 78 69 73 74 73 20 69 66 20   file exists if 
2fee0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72  the following cr
2fef0 69 74 65 72 69 61 20 61 72 65 20 6d 65 74 3a 0a  iteria are met:.
2ff00 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 6a 6f  **.**   * The jo
2ff10 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
2ff20 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 73 79  s in the file sy
2ff30 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a  stem, and.**   *
2ff40 20 4e 6f 20 70 72 6f 63 65 73 73 20 68 6f 6c 64   No process hold
2ff50 73 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  s a RESERVED or 
2ff60 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20  greater lock on 
2ff70 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2ff80 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68  e, and.**   * Th
2ff90 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2ffa0 69 74 73 65 6c 66 20 69 73 20 67 72 65 61 74 65  itself is greate
2ffb0 72 20 74 68 61 6e 20 30 20 62 79 74 65 73 20 69  r than 0 bytes i
2ffc0 6e 20 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20  n size, and.**  
2ffd0 20 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74   * The first byt
2ffe0 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
2fff0 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64   file exists and
30000 20 69 73 20 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a   is not 0x00..**
30010 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65  .** If the curre
30020 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  nt size of the d
30030 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
30040 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20  0 but a journal 
30050 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20  file.** exists, 
30060 74 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79  that is probably
30070 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20   an old journal 
30080 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61  left over from a
30090 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61   prior.** databa
300a0 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  se with the same
300b0 20 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63   name. In this c
300c0 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ase the journal 
300d0 66 69 6c 65 20 69 73 0a 2a 2a 20 6a 75 73 74 20  file is.** just 
300e0 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 4f 73  deleted using Os
300f0 44 65 6c 65 74 65 2c 20 2a 70 45 78 69 73 74 73  Delete, *pExists
30100 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64   is set to 0 and
30110 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73   SQLITE_OK.** is
30120 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
30130 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
30140 65 73 20 6e 6f 74 20 63 68 65 63 6b 20 69 66 20  es not check if 
30150 74 68 65 72 65 20 69 73 20 61 20 6d 61 73 74 65  there is a maste
30160 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r journal filena
30170 6d 65 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64  me.** at the end
30180 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 20 49 66   of the file. If
30190 20 74 68 65 72 65 20 69 73 2c 20 61 6e 64 20 74   there is, and t
301a0 68 61 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  hat master journ
301b0 61 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f 65 73 20  al file.** does 
301c0 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65 6e 20  not exist, then 
301d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
301e0 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68   is not really h
301f0 6f 74 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63  ot. In this.** c
30200 61 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ase this routine
30210 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 66   will return a f
30220 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 2e 20 54  alse-positive. T
30230 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  he pager_playbac
30240 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77  k().** routine w
30250 69 6c 6c 20 64 69 73 63 6f 76 65 72 20 74 68 61  ill discover tha
30260 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  t the journal fi
30270 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79  le is not really
30280 20 68 6f 74 20 61 6e 64 20 0a 2a 2a 20 77 69 6c   hot and .** wil
30290 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69 74 20 62 61  l not roll it ba
302a0 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ck. .**.** If a 
302b0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
302c0 20 69 73 20 66 6f 75 6e 64 20 74 6f 20 65 78 69   is found to exi
302d0 73 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20  st, *pExists is 
302e0 73 65 74 20 74 6f 20 31 20 61 6e 64 20 0a 2a 2a  set to 1 and .**
302f0 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
30300 6e 65 64 2e 20 49 66 20 6e 6f 20 68 6f 74 2d 6a  ned. If no hot-j
30310 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70  ournal file is p
30320 72 65 73 65 6e 74 2c 20 2a 70 45 78 69 73 74 73  resent, *pExists
30330 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 20   is.** set to 0 
30340 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
30350 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
30360 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
30370 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f  ile trying.** to
30380 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68   determine wheth
30390 65 72 20 6f 72 20 6e 6f 74 20 61 20 68 6f 74 2d  er or not a hot-
303a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
303b0 73 74 73 2c 20 74 68 65 20 49 4f 20 65 72 72 6f  sts, the IO erro
303c0 72 0a 2a 2a 20 63 6f 64 65 20 69 73 20 72 65 74  r.** code is ret
303d0 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61  urned and the va
303e0 6c 75 65 20 6f 66 20 2a 70 45 78 69 73 74 73 20  lue of *pExists 
303f0 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f  is undefined..*/
30400 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 48  .static int hasH
30410 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  otJournal(Pager 
30420 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 45  *pPager, int *pE
30430 78 69 73 74 73 29 7b 0a 20 20 73 71 6c 69 74 65  xists){.  sqlite
30440 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56  3_vfs * const pV
30450 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
30460 73 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  s;.  int rc = SQ
30470 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
30480 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
30490 65 20 2a 2f 0a 20 20 69 6e 74 20 65 78 69 73 74  e */.  int exist
304a0 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  s = 1;          
304b0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
304c0 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  a journal file i
304d0 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69  s present */.  i
304e0 6e 74 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20 21 21  nt jrnlOpen = !!
304f0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
30500 66 64 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  fd);..  assert( 
30510 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
30520 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  al );.  assert( 
30530 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
30540 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  d) );.  assert( 
30550 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
30560 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 0a 20  PAGER_OPEN );.. 
30570 20 61 73 73 65 72 74 28 20 6a 72 6e 6c 4f 70 65   assert( jrnlOpe
30580 6e 3d 3d 30 20 7c 7c 20 28 20 73 71 6c 69 74 65  n==0 || ( sqlite
30590 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
305a0 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
305b0 3e 6a 66 64 29 20 26 0a 20 20 20 20 53 51 4c 49  >jfd) &.    SQLI
305c0 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54  TE_IOCAP_UNDELET
305d0 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 0a 20  ABLE_WHEN_OPEN. 
305e0 20 29 29 3b 0a 0a 20 20 2a 70 45 78 69 73 74 73   ));..  *pExists
305f0 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 6a 72 6e   = 0;.  if( !jrn
30600 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20  lOpen ){.    rc 
30610 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
30620 73 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  s(pVfs, pPager->
30630 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45  zJournal, SQLITE
30640 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
30650 26 65 78 69 73 74 73 29 3b 0a 20 20 7d 0a 20 20  &exists);.  }.  
30660 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
30670 4b 20 26 26 20 65 78 69 73 74 73 20 29 7b 0a 20  K && exists ){. 
30680 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64 20 3d 20     int locked = 
30690 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
306a0 2a 20 54 72 75 65 20 69 66 20 73 6f 6d 65 20 70  * True if some p
306b0 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52  rocess holds a R
306c0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a  ESERVED lock */.
306d0 0a 20 20 20 20 2f 2a 20 52 61 63 65 20 63 6f 6e  .    /* Race con
306e0 64 69 74 69 6f 6e 20 68 65 72 65 3a 20 20 41 6e  dition here:  An
306f0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69  other process mi
30700 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 68 6f  ght have been ho
30710 6c 64 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a  lding the.    **
30720 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f   the RESERVED lo
30730 63 6b 20 61 6e 64 20 68 61 76 65 20 61 20 6a 6f  ck and have a jo
30740 75 72 6e 61 6c 20 6f 70 65 6e 20 61 74 20 74 68  urnal open at th
30750 65 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  e sqlite3OsAcces
30760 73 28 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  s() .    ** call
30770 20 61 62 6f 76 65 2c 20 62 75 74 20 74 68 65 6e   above, but then
30780 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
30790 6e 61 6c 20 61 6e 64 20 64 72 6f 70 20 74 68 65  nal and drop the
307a0 20 6c 6f 63 6b 20 62 65 66 6f 72 65 0a 20 20 20   lock before.   
307b0 20 2a 2a 20 77 65 20 67 65 74 20 74 6f 20 74 68   ** we get to th
307c0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69  e following sqli
307d0 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76  te3OsCheckReserv
307e0 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e 20 20  edLock() call.  
307f0 49 66 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69  If that.    ** i
30800 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 69 73  s the case, this
30810 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 74   routine might t
30820 68 69 6e 6b 20 74 68 65 72 65 20 69 73 20 61 20  hink there is a 
30830 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e  hot journal when
30840 0a 20 20 20 20 2a 2a 20 69 6e 20 66 61 63 74 20  .    ** in fact 
30850 74 68 65 72 65 20 69 73 20 6e 6f 6e 65 2e 20 20  there is none.  
30860 54 68 69 73 20 72 65 73 75 6c 74 73 20 69 6e 20  This results in 
30870 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65  a false-positive
30880 20 77 68 69 63 68 20 77 69 6c 6c 0a 20 20 20 20   which will.    
30890 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69 74 68  ** be dealt with
308a0 20 62 79 20 74 68 65 20 70 6c 61 79 62 61 63 6b   by the playback
308b0 20 72 6f 75 74 69 6e 65 2e 20 20 54 69 63 6b 65   routine.  Ticke
308c0 74 20 23 33 38 38 33 2e 0a 20 20 20 20 2a 2f 0a  t #3883..    */.
308d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
308e0 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  OsCheckReservedL
308f0 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
30900 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 20 20 69 66  &locked);.    if
30910 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
30920 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20  && !locked ){.  
30930 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20      Pgno nPage; 
30940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30950 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
30960 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 66  es in database f
30970 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73  ile */..      as
30980 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65  sert( pPager->te
30990 6d 70 46 69 6c 65 3d 3d 30 20 29 3b 0a 20 20 20  mpFile==0 );.   
309a0 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67     rc = pagerPag
309b0 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
309c0 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  nPage);.      if
309d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
309e0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
309f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
30a00 20 7a 65 72 6f 20 70 61 67 65 73 20 69 6e 20 73   zero pages in s
30a10 69 7a 65 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  ize, that means 
30a20 74 68 61 74 20 65 69 74 68 65 72 20 28 31 29 20  that either (1) 
30a30 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a  the.        ** j
30a40 6f 75 72 6e 61 6c 20 69 73 20 61 20 72 65 6d 6e  ournal is a remn
30a50 61 6e 74 20 66 72 6f 6d 20 61 20 70 72 69 6f 72  ant from a prior
30a60 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74   database with t
30a70 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 77 68 65  he same name whe
30a80 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  re.        ** th
30a90 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
30aa0 62 75 74 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72  but not the jour
30ab0 6e 61 6c 20 77 61 73 20 64 65 6c 65 74 65 64 2c  nal was deleted,
30ac0 20 6f 72 20 28 32 29 20 74 68 65 20 69 6e 69 74   or (2) the init
30ad0 69 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ial.        ** t
30ae0 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20  ransaction that 
30af0 70 6f 70 75 6c 61 74 65 73 20 61 20 6e 65 77 20  populates a new 
30b00 64 61 74 61 62 61 73 65 20 69 73 20 62 65 69 6e  database is bein
30b10 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20  g rolled back.. 
30b20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 65 69 74         ** In eit
30b30 68 65 72 20 63 61 73 65 2c 20 74 68 65 20 6a 6f  her case, the jo
30b40 75 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e 20 62  urnal file can b
30b50 65 20 64 65 6c 65 74 65 64 2e 20 20 48 6f 77 65  e deleted.  Howe
30b60 76 65 72 2c 20 74 61 6b 65 20 63 61 72 65 0a 20  ver, take care. 
30b70 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 74 6f         ** not to
30b80 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
30b90 6e 61 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69  nal file if it i
30ba0 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 64  s already open d
30bb0 75 65 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a  ue to.        **
30bc0 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 50 45   journal_mode=PE
30bd0 52 53 49 53 54 2e 0a 20 20 20 20 20 20 20 20 2a  RSIST..        *
30be0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 50  /.        if( nP
30bf0 61 67 65 3d 3d 30 20 26 26 20 21 6a 72 6e 6c 4f  age==0 && !jrnlO
30c00 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pen ){.         
30c10 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
30c20 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
30c30 20 20 20 20 20 20 20 69 66 28 20 70 61 67 65 72         if( pager
30c40 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 52  LockDb(pPager, R
30c50 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d 53  ESERVED_LOCK)==S
30c60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
30c70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
30c80 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70 50  sDelete(pVfs, pP
30c90 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
30ca0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
30cb0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
30cc0 6c 75 73 69 76 65 4d 6f 64 65 20 29 20 70 61 67  lusiveMode ) pag
30cd0 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65  erUnlockDb(pPage
30ce0 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  r, SHARED_LOCK);
30cf0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
30d00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e         sqlite3En
30d10 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
30d20 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
30d30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
30d40 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
30d50 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65  ists and no othe
30d60 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73  r connection has
30d70 20 61 20 72 65 73 65 72 76 65 64 0a 20 20 20 20   a reserved.    
30d80 20 20 20 20 20 20 2a 2a 20 6f 72 20 67 72 65 61        ** or grea
30d90 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ter lock on the 
30da0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 4e  database file. N
30db0 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  ow check that th
30dc0 65 72 65 20 69 73 0a 20 20 20 20 20 20 20 20 20  ere is.         
30dd0 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   ** at least one
30de0 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74 65 73 20   non-zero bytes 
30df0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
30e00 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
30e10 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49  ..          ** I
30e20 66 20 74 68 65 72 65 20 69 73 2c 20 74 68 65 6e  f there is, then
30e30 20 77 65 20 63 6f 6e 73 69 64 65 72 20 74 68 69   we consider thi
30e40 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20  s journal to be 
30e50 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20 0a 20 20  hot. If not, .  
30e60 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61          ** it ca
30e70 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20  n be ignored..  
30e80 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
30e90 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70       if( !jrnlOp
30ea0 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
30eb0 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45    int f = SQLITE
30ec0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53  _OPEN_READONLY|S
30ed0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
30ee0 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20  JOURNAL;.       
30ef0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
30f00 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50  3OsOpen(pVfs, pP
30f10 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
30f20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20  pPager->jfd, f, 
30f30 26 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  &f);.          }
30f40 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
30f50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
30f60 20 20 20 20 20 20 20 20 20 20 20 20 75 38 20 66              u8 f
30f70 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  irst = 0;.      
30f80 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
30f90 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
30fa0 3e 6a 66 64 2c 20 28 76 6f 69 64 20 2a 29 26 66  >jfd, (void *)&f
30fb0 69 72 73 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20  irst, 1, 0);.   
30fc0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
30fd0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
30fe0 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
30ff0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
31000 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
31010 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31020 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65      if( !jrnlOpe
31030 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
31040 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
31050 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
31060 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
31070 20 20 20 20 20 20 20 20 20 20 2a 70 45 78 69 73            *pExis
31080 74 73 20 3d 20 28 66 69 72 73 74 21 3d 30 29 3b  ts = (first!=0);
31090 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
310a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
310b0 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20  CANTOPEN ){.    
310c0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65          /* If we
310d0 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74 68 65   cannot open the
310e0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
310f0 6c 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20  l file in order 
31100 74 6f 20 73 65 65 20 69 66 0a 20 20 20 20 20 20  to see if.      
31110 20 20 20 20 20 20 2a 2a 20 69 74 20 68 61 73 20        ** it has 
31120 61 20 7a 65 72 6f 20 68 65 61 64 65 72 2c 20 74  a zero header, t
31130 68 61 74 20 6d 69 67 68 74 20 62 65 20 64 75 65  hat might be due
31140 20 74 6f 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72   to an I/O error
31150 2c 20 6f 72 0a 20 20 20 20 20 20 20 20 20 20 20  , or.           
31160 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20   ** it might be 
31170 64 75 65 20 74 6f 20 74 68 65 20 72 61 63 65 20  due to the race 
31180 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69  condition descri
31190 62 65 64 20 61 62 6f 76 65 20 61 6e 64 20 69 6e  bed above and in
311a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
311b0 74 69 63 6b 65 74 20 23 33 38 38 33 2e 20 20 45  ticket #3883.  E
311c0 69 74 68 65 72 20 77 61 79 2c 20 61 73 73 75 6d  ither way, assum
311d0 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  e that the journ
311e0 61 6c 20 69 73 20 68 6f 74 2e 0a 20 20 20 20 20  al is hot..     
311f0 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d         ** This m
31200 69 67 68 74 20 62 65 20 61 20 66 61 6c 73 65 20  ight be a false 
31210 70 6f 73 69 74 69 76 65 2e 20 20 42 75 74 20 69  positive.  But i
31220 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20 74 68  f it is, then th
31230 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
31240 20 61 75 74 6f 6d 61 74 69 63 20 6a 6f 75 72 6e   automatic journ
31250 61 6c 20 70 6c 61 79 62 61 63 6b 20 61 6e 64 20  al playback and 
31260 72 65 63 6f 76 65 72 79 20 6d 65 63 68 61 6e 69  recovery mechani
31270 73 6d 20 77 69 6c 6c 20 64 65 61 6c 0a 20 20 20  sm will deal.   
31280 20 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68           ** with
31290 20 69 74 20 75 6e 64 65 72 20 61 6e 20 45 58 43   it under an EXC
312a0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 77 68 65 72  LUSIVE lock wher
312b0 65 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64  e we do not need
312c0 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 20 20   to.            
312d0 2a 2a 20 77 6f 72 72 79 20 73 6f 20 6d 75 63 68  ** worry so much
312e0 20 77 69 74 68 20 72 61 63 65 20 63 6f 6e 64 69   with race condi
312f0 74 69 6f 6e 73 2e 0a 20 20 20 20 20 20 20 20 20  tions..         
31300 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
31310 20 20 2a 70 45 78 69 73 74 73 20 3d 20 31 3b 0a    *pExists = 1;.
31320 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
31330 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
31340 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31350 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
31360 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
31370 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
31380 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
31390 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73  ed to obtain a s
313a0 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68  hared lock on th
313b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
313c0 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61  .** It is illega
313d0 6c 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65  l to call sqlite
313e0 33 50 61 67 65 72 47 65 74 28 29 20 75 6e 74 69  3PagerGet() unti
313f0 6c 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  l after this fun
31400 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65  ction.** has bee
31410 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63  n successfully c
31420 61 6c 6c 65 64 2e 20 49 66 20 61 20 73 68 61 72  alled. If a shar
31430 65 64 2d 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61  ed-lock is alrea
31440 64 79 20 68 65 6c 64 20 77 68 65 6e 0a 2a 2a 20  dy held when.** 
31450 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
31460 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
31470 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68   no-op..**.** Th
31480 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65 72  e following oper
31490 61 74 69 6f 6e 73 20 61 72 65 20 61 6c 73 6f 20  ations are also 
314a0 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68 69  performed by thi
314b0 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
314c0 2a 20 20 20 31 29 20 49 66 20 74 68 65 20 70 61  *   1) If the pa
314d0 67 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ger is currently
314e0 20 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e 20 73   in PAGER_OPEN s
314f0 74 61 74 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65  tate (no lock he
31500 6c 64 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68  ld.**      on th
31510 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29  e database file)
31520 2c 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70  , then an attemp
31530 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6f 62 74  t is made to obt
31540 61 69 6e 20 61 0a 2a 2a 20 20 20 20 20 20 53 48  ain a.**      SH
31550 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ARED lock on the
31560 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
31570 49 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  Immediately afte
31580 72 20 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20  r obtaining.**  
31590 20 20 20 20 74 68 65 20 53 48 41 52 45 44 20 6c      the SHARED l
315a0 6f 63 6b 2c 20 74 68 65 20 66 69 6c 65 2d 73 79  ock, the file-sy
315b0 73 74 65 6d 20 69 73 20 63 68 65 63 6b 65 64 20  stem is checked 
315c0 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  for a hot-journa
315d0 6c 2c 0a 2a 2a 20 20 20 20 20 20 77 68 69 63 68  l,.**      which
315e0 20 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20   is played back 
315f0 69 66 20 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c  if present. Foll
31600 6f 77 69 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f  owing any hot-jo
31610 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72  urnal .**      r
31620 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e  ollback, the con
31630 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63 61 63  tents of the cac
31640 68 65 20 61 72 65 20 76 61 6c 69 64 61 74 65 64  he are validated
31650 20 62 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20   by checking.** 
31660 20 20 20 20 20 74 68 65 20 27 63 68 61 6e 67 65       the 'change
31670 2d 63 6f 75 6e 74 65 72 27 20 66 69 65 6c 64 20  -counter' field 
31680 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
31690 66 69 6c 65 20 68 65 61 64 65 72 20 61 6e 64 0a  file header and.
316a0 2a 2a 20 20 20 20 20 20 64 69 73 63 61 72 64 65  **      discarde
316b0 64 20 69 66 20 74 68 65 79 20 61 72 65 20 66 6f  d if they are fo
316c0 75 6e 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69  und to be invali
316d0 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66  d..**.**   2) If
316e0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75   the pager is ru
316f0 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69  nning in exclusi
31700 76 65 2d 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65  ve-mode, and the
31710 72 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  re are currently
31720 0a 2a 2a 20 20 20 20 20 20 6e 6f 20 6f 75 74 73  .**      no outs
31730 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
31740 65 73 20 74 6f 20 61 6e 79 20 70 61 67 65 73 2c  es to any pages,
31750 20 61 6e 64 20 69 73 20 69 6e 20 74 68 65 20 65   and is in the e
31760 72 72 6f 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20  rror state,.**  
31770 20 20 20 20 74 68 65 6e 20 61 6e 20 61 74 74 65      then an atte
31780 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63  mpt is made to c
31790 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72 20 73  lear the error s
317a0 74 61 74 65 20 62 79 20 64 69 73 63 61 72 64 69  tate by discardi
317b0 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 63  ng.**      the c
317c0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
317d0 61 67 65 20 63 61 63 68 65 20 61 6e 64 20 72 6f  age cache and ro
317e0 6c 6c 69 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f  lling back any o
317f0 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  pen journal.**  
31800 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20      file..**.** 
31810 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  If everything is
31820 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c   successful, SQL
31830 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
31840 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  ed. If an IO err
31850 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68  or .** occurs wh
31860 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20  ile locking the 
31870 64 61 74 61 62 61 73 65 2c 20 63 68 65 63 6b 69  database, checki
31880 6e 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75  ng for a hot-jou
31890 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 0a 2a 2a  rnal file or .**
318a0 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
318b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
318c0 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
318d0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
318e0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
318f0 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72  SharedLock(Pager
31900 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
31910 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
31920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31930 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
31940 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75  /..  /* This rou
31950 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tine is only cal
31960 6c 65 64 20 66 72 6f 6d 20 62 2d 74 72 65 65 20  led from b-tree 
31970 61 6e 64 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68  and only when th
31980 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20  ere are no.  ** 
31990 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
319a0 73 2e 20 54 68 69 73 20 69 6d 70 6c 69 65 73 20  s. This implies 
319b0 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 73  that the pager s
319c0 74 61 74 65 20 73 68 6f 75 6c 64 20 65 69 74 68  tate should eith
319d0 65 72 0a 20 20 2a 2a 20 62 65 20 4f 50 45 4e 20  er.  ** be OPEN 
319e0 6f 72 20 52 45 41 44 45 52 2e 20 52 45 41 44 45  or READER. READE
319f0 52 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62  R is only possib
31a00 6c 65 20 69 66 20 74 68 65 20 70 61 67 65 72 20  le if the pager 
31a10 69 73 20 6f 72 20 77 61 73 20 69 6e 20 0a 20 20  is or was in .  
31a20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 61 63 63  ** exclusive acc
31a30 65 73 73 20 6d 6f 64 65 2e 20 20 2a 2f 0a 20 20  ess mode.  */.  
31a40 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
31a50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
31a60 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
31a70 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  0 );.  assert( a
31a80 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
31a90 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  e(pPager) );.  a
31aa0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
31ab0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
31ac0 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  N || pPager->eSt
31ad0 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
31ae0 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  R );.  assert( p
31af0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
31b00 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
31b10 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  if( !pagerUseWal
31b20 28 70 50 61 67 65 72 29 20 26 26 20 70 50 61 67  (pPager) && pPag
31b30 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
31b40 52 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20 69 6e  R_OPEN ){.    in
31b50 74 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20  t bHotJournal = 
31b60 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  1;          /* T
31b70 72 75 65 20 69 66 20 74 68 65 72 65 20 65 78 69  rue if there exi
31b80 73 74 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61  sts a hot journa
31b90 6c 2d 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 61  l-file */..    a
31ba0 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
31bb0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
31bc0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30  ger->tempFile==0
31bd0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63   || pPager->eLoc
31be0 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
31bf0 4b 20 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70  K );..    rc = p
31c00 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
31c10 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44  k(pPager, SHARED
31c20 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20  _LOCK);.    if( 
31c30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
31c40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
31c50 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f  Pager->eLock==NO
31c60 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d  _LOCK || pPager-
31c70 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f  >eLock==UNKNOWN_
31c80 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 67 6f  LOCK );.      go
31c90 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  to failed;.    }
31ca0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f  ..    /* If a jo
31cb0 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
31cc0 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20  s, and there is 
31cd0 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  no RESERVED lock
31ce0 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   on the.    ** d
31cf0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
31d00 65 6e 20 69 74 20 65 69 74 68 65 72 20 6e 65 65  en it either nee
31d10 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20  ds to be played 
31d20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e  back or deleted.
31d30 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
31d40 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 3d 53  pPager->eLock<=S
31d50 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
31d60 20 20 20 20 72 63 20 3d 20 68 61 73 48 6f 74 4a      rc = hasHotJ
31d70 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 26  ournal(pPager, &
31d80 62 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  bHotJournal);.  
31d90 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
31da0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
31db0 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
31dc0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62 48      }.    if( bH
31dd0 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  otJournal ){.   
31de0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 72     if( pPager->r
31df0 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20  eadOnly ){.     
31e00 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
31e10 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b  EADONLY_ROLLBACK
31e20 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  ;.        goto f
31e30 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  ailed;.      }..
31e40 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20        /* Get an 
31e50 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
31e60 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
31e70 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69  ile. At this poi
31e80 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20 20 2a  nt it is.      *
31e90 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  * important that
31ea0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
31eb0 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64   is not obtained
31ec0 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74   on the way to t
31ed0 68 65 0a 20 20 20 20 20 20 2a 2a 20 45 58 43 4c  he.      ** EXCL
31ee0 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69  USIVE lock. If i
31ef0 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20  t were, another 
31f00 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70  process might op
31f10 65 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  en the.      ** 
31f20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64  database file, d
31f30 65 74 65 63 74 20 74 68 65 20 52 45 53 45 52 56  etect the RESERV
31f40 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e  ED lock, and con
31f50 63 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a 20  clude that the. 
31f60 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
31f70 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 61 64   is safe to read
31f80 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63   while this proc
31f90 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c  ess is still rol
31fa0 6c 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20  ling the .      
31fb0 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62  ** hot-journal b
31fc0 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20  ack..      ** . 
31fd0 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20       ** Because 
31fe0 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65  the intermediate
31ff0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69   RESERVED lock i
32000 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c  s not requested,
32010 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74   any.      ** ot
32020 68 65 72 20 70 72 6f 63 65 73 73 20 61 74 74 65  her process atte
32030 6d 70 74 69 6e 67 20 74 6f 20 61 63 63 65 73 73  mpting to access
32040 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
32050 6c 65 20 77 69 6c 6c 20 67 65 74 20 74 6f 20 0a  le will get to .
32060 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 70 6f        ** this po
32070 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20  int in the code 
32080 61 6e 64 20 66 61 69 6c 20 74 6f 20 6f 62 74 61  and fail to obta
32090 69 6e 20 69 74 73 20 6f 77 6e 20 45 58 43 4c 55  in its own EXCLU
320a0 53 49 56 45 20 6c 6f 63 6b 20 0a 20 20 20 20 20  SIVE lock .     
320b0 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62   ** on the datab
320c0 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  ase file..      
320d0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 55 6e 6c 65  **.      ** Unle
320e0 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ss the pager is 
320f0 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  in locking_mode=
32100 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20  exclusive mode, 
32110 74 68 65 20 6c 6f 63 6b 20 69 73 0a 20 20 20 20  the lock is.    
32120 20 20 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64 20    ** downgraded 
32130 74 6f 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 62  to SHARED_LOCK b
32140 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74  efore this funct
32150 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 20 20 20  ion returns..   
32160 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
32170 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61   pagerLockDb(pPa
32180 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
32190 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
321a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
321b0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61  .        goto fa
321c0 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 0a  iled;.      }. .
321d0 20 20 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69        /* If it i
321e0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
321f0 65 6e 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20  en and the file 
32200 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20  exists on disk, 
32210 6f 70 65 6e 20 74 68 65 20 0a 20 20 20 20 20 20  open the .      
32220 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  ** journal for r
32230 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73  ead/write access
32240 2e 20 57 72 69 74 65 20 61 63 63 65 73 73 20 69  . Write access i
32250 73 20 72 65 71 75 69 72 65 64 20 62 65 63 61 75  s required becau
32260 73 65 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20  se .      ** in 
32270 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73  exclusive-access
32280 20 6d 6f 64 65 20 74 68 65 20 66 69 6c 65 20 64   mode the file d
32290 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62  escriptor will b
322a0 65 20 6b 65 70 74 20 6f 70 65 6e 20 0a 20 20 20  e kept open .   
322b0 20 20 20 2a 2a 20 61 6e 64 20 70 6f 73 73 69 62     ** and possib
322c0 6c 79 20 75 73 65 64 20 66 6f 72 20 61 20 74 72  ly used for a tr
322d0 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65 72 20  ansaction later 
322e0 6f 6e 2e 20 41 6c 73 6f 2c 20 77 72 69 74 65 2d  on. Also, write-
322f0 61 63 63 65 73 73 20 0a 20 20 20 20 20 20 2a 2a  access .      **
32300 20 69 73 20 75 73 75 61 6c 6c 79 20 72 65 71 75   is usually requ
32310 69 72 65 64 20 74 6f 20 66 69 6e 61 6c 69 7a 65  ired to finalize
32320 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 6e 20   the journal in 
32330 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 70 65 72  journal_mode=per
32340 73 69 73 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d  sist .      ** m
32350 6f 64 65 20 28 61 6e 64 20 61 6c 73 6f 20 66 6f  ode (and also fo
32360 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 74  r journal_mode=t
32370 72 75 6e 63 61 74 65 20 6f 6e 20 73 6f 6d 65 20  runcate on some 
32380 73 79 73 74 65 6d 73 29 2e 0a 20 20 20 20 20 20  systems)..      
32390 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74  **.      ** If t
323a0 68 65 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20  he journal does 
323b0 6e 6f 74 20 65 78 69 73 74 2c 20 69 74 20 75 73  not exist, it us
323c0 75 61 6c 6c 79 20 6d 65 61 6e 73 20 74 68 61 74  ually means that
323d0 20 73 6f 6d 65 20 0a 20 20 20 20 20 20 2a 2a 20   some .      ** 
323e0 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
323f0 20 6d 61 6e 61 67 65 64 20 74 6f 20 67 65 74 20   managed to get 
32400 69 6e 20 61 6e 64 20 72 6f 6c 6c 20 69 74 20 62  in and roll it b
32410 61 63 6b 20 62 65 66 6f 72 65 20 0a 20 20 20 20  ack before .    
32420 20 20 2a 2a 20 74 68 69 73 20 63 6f 6e 6e 65 63    ** this connec
32430 74 69 6f 6e 20 6f 62 74 61 69 6e 65 64 20 74 68  tion obtained th
32440 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
32450 20 61 62 6f 76 65 2e 20 4f 72 2c 20 69 74 20 0a   above. Or, it .
32460 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 65 61        ** may mea
32470 6e 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  n that the pager
32480 20 77 61 73 20 69 6e 20 74 68 65 20 65 72 72 6f   was in the erro
32490 72 2d 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  r-state when thi
324a0 73 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74  s.      ** funct
324b0 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 61  ion was called a
324c0 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nd the journal f
324d0 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ile does not exi
324e0 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  st..      */.   
324f0 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70     if( !isOpen(p
32500 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
32510 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76         sqlite3_v
32520 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20  fs * const pVfs 
32530 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
32540 20 20 20 20 20 20 20 20 69 6e 74 20 62 45 78 69          int bExi
32550 73 74 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  sts;            
32560 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75    /* True if jou
32570 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
32580 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
32590 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
325a0 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 56  (.            pV
325b0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
325c0 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43  rnal, SQLITE_ACC
325d0 45 53 53 5f 45 58 49 53 54 53 2c 20 26 62 45 78  ESS_EXISTS, &bEx
325e0 69 73 74 73 29 3b 0a 20 20 20 20 20 20 20 20 69  ists);.        i
325f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
32600 20 26 26 20 62 45 78 69 73 74 73 20 29 7b 0a 20   && bExists ){. 
32610 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 6f 75           int fou
32620 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
32630 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f   int f = SQLITE_
32640 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
32650 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
32660 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20  JOURNAL;.       
32670 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
32680 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
32690 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
326a0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
326b0 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
326c0 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
326d0 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20  , f, &fout);.   
326e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
326f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
32700 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
32710 66 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  fd) );.         
32720 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
32730 4f 4b 20 26 26 20 66 6f 75 74 26 53 51 4c 49 54  OK && fout&SQLIT
32740 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20  E_OPEN_READONLY 
32750 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
32760 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  c = SQLITE_CANTO
32770 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  PEN_BKPT;.      
32780 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
32790 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
327a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
327b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
327c0 0a 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61 79  . .      /* Play
327d0 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20  back and delete 
327e0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72  the journal.  Dr
327f0 6f 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20  op the database 
32800 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c  write.      ** l
32810 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72  ock and reacquir
32820 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  e the read lock.
32830 20 50 75 72 67 65 20 74 68 65 20 63 61 63 68 65   Purge the cache
32840 20 62 65 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a   before.      **
32850 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68   playing back th
32860 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f  e hot-journal so
32870 20 74 68 61 74 20 77 65 20 64 6f 6e 27 74 20 65   that we don't e
32880 6e 64 20 75 70 20 77 69 74 68 0a 20 20 20 20 20  nd up with.     
32890 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74   ** an inconsist
328a0 65 6e 74 20 63 61 63 68 65 2e 20 20 53 79 6e 63  ent cache.  Sync
328b0 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c   the hot journal
328c0 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 0a   before playing.
328d0 20 20 20 20 20 20 2a 2a 20 69 74 20 62 61 63 6b        ** it back
328e0 20 73 69 6e 63 65 20 74 68 65 20 70 72 6f 63 65   since the proce
328f0 73 73 20 74 68 61 74 20 63 72 61 73 68 65 64 20  ss that crashed 
32900 61 6e 64 20 6c 65 66 74 20 74 68 65 20 68 6f 74  and left the hot
32910 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a   journal.      *
32920 2a 20 70 72 6f 62 61 62 6c 79 20 64 69 64 20 6e  * probably did n
32930 6f 74 20 73 79 6e 63 20 69 74 20 61 6e 64 20 77  ot sync it and w
32940 65 20 61 72 65 20 72 65 71 75 69 72 65 64 20 74  e are required t
32950 6f 20 61 6c 77 61 79 73 20 73 79 6e 63 0a 20 20  o always sync.  
32960 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e      ** the journ
32970 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e  al before playin
32980 67 20 69 74 20 62 61 63 6b 2e 0a 20 20 20 20 20  g it back..     
32990 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73   */.      if( is
329a0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
329b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ) ){.        ass
329c0 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
329d0 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  OK );.        rc
329e0 20 3d 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a   = pagerSyncHotJ
329f0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
32a00 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
32a10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
32a20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
32a30 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
32a40 72 2c 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  r, !pPager->temp
32a50 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20  File);.         
32a60 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
32a70 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20  = PAGER_OPEN;.  
32a80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
32a90 6c 73 65 20 69 66 28 20 21 70 50 61 67 65 72 2d  lse if( !pPager-
32aa0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
32ab0 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 55  {.        pagerU
32ac0 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  nlockDb(pPager, 
32ad0 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
32ae0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
32af0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
32b00 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
32b10 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65  s branch is take
32b20 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  n if an error oc
32b30 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e  curs while tryin
32b40 67 20 74 6f 20 6f 70 65 6e 0a 20 20 20 20 20 20  g to open.      
32b50 20 20 2a 2a 20 6f 72 20 72 6f 6c 6c 20 62 61 63    ** or roll bac
32b60 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  k a hot-journal 
32b70 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 61 6e  while holding an
32b80 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
32b90 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   The.        ** 
32ba0 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 72  pager_unlock() r
32bb0 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63  outine will be c
32bc0 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 72 65 74  alled before ret
32bd0 75 72 6e 69 6e 67 20 74 6f 20 75 6e 6c 6f 63 6b  urning to unlock
32be0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
32bf0 66 69 6c 65 2e 20 49 66 20 74 68 65 20 75 6e 6c  file. If the unl
32c00 6f 63 6b 20 61 74 74 65 6d 70 74 20 66 61 69 6c  ock attempt fail
32c10 73 2c 20 74 68 65 6e 20 50 61 67 65 72 2e 65 4c  s, then Pager.eL
32c20 6f 63 6b 20 6d 75 73 74 20 62 65 0a 20 20 20 20  ock must be.    
32c30 20 20 20 20 2a 2a 20 73 65 74 20 74 6f 20 55 4e      ** set to UN
32c40 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 28 73 65 65 20  KNOWN_LOCK (see 
32c50 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76  the comment abov
32c60 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 66 6f  e the #define fo
32c70 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 55 4e  r .        ** UN
32c80 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 61 62 6f 76 65  KNOWN_LOCK above
32c90 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74   for an explanat
32ca0 69 6f 6e 29 2e 20 0a 20 20 20 20 20 20 20 20 2a  ion). .        *
32cb0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20  *.        ** In 
32cc0 6f 72 64 65 72 20 74 6f 20 67 65 74 20 70 61 67  order to get pag
32cd0 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 74 6f 20 64  er_unlock() to d
32ce0 6f 20 74 68 69 73 2c 20 73 65 74 20 50 61 67 65  o this, set Page
32cf0 72 2e 65 53 74 61 74 65 20 74 6f 0a 20 20 20 20  r.eState to.    
32d00 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 45 52 52      ** PAGER_ERR
32d10 4f 52 20 6e 6f 77 2e 20 54 68 69 73 20 69 73 20  OR now. This is 
32d20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6f 75  not actually cou
32d30 6e 74 65 64 20 61 73 20 61 20 74 72 61 6e 73 69  nted as a transi
32d40 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  tion.        ** 
32d50 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65 20 69  to ERROR state i
32d60 6e 20 74 68 65 20 73 74 61 74 65 20 64 69 61 67  n the state diag
32d70 72 61 6d 20 61 74 20 74 68 65 20 74 6f 70 20 6f  ram at the top o
32d80 66 20 74 68 69 73 20 66 69 6c 65 2c 0a 20 20 20  f this file,.   
32d90 20 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65       ** since we
32da0 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 73   know that the s
32db0 61 6d 65 20 63 61 6c 6c 20 74 6f 20 70 61 67 65  ame call to page
32dc0 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20  r_unlock() will 
32dd0 76 65 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  very.        ** 
32de0 73 68 6f 72 74 6c 79 20 74 72 61 6e 73 69 74 69  shortly transiti
32df0 6f 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a  on the pager obj
32e00 65 63 74 20 74 6f 20 74 68 65 20 4f 50 45 4e 20  ect to the OPEN 
32e10 73 74 61 74 65 2e 20 43 61 6c 6c 69 6e 67 0a 20  state. Calling. 
32e20 20 20 20 20 20 20 20 2a 2a 20 61 73 73 65 72 74         ** assert
32e30 5f 70 61 67 65 72 5f 73 74 61 74 65 28 29 20 77  _pager_state() w
32e40 6f 75 6c 64 20 66 61 69 6c 20 6e 6f 77 2c 20 61  ould fail now, a
32e50 73 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20  s it should not 
32e60 62 65 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20  be possible.    
32e70 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 20      ** to be in 
32e80 45 52 52 4f 52 20 73 74 61 74 65 20 77 68 65 6e  ERROR state when
32e90 20 74 68 65 72 65 20 61 72 65 20 7a 65 72 6f 20   there are zero 
32ea0 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
32eb0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 66   .        ** ref
32ec0 65 72 65 6e 63 65 73 2e 0a 20 20 20 20 20 20 20  erences..       
32ed0 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 61 67 65   */.        page
32ee0 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
32ef0 72 63 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  rc);.        got
32f00 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
32f10 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  }..      assert(
32f20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
32f30 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20  =PAGER_OPEN );. 
32f40 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50       assert( (pP
32f50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41  ager->eLock==SHA
32f60 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20  RED_LOCK).      
32f70 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d       || (pPager-
32f80 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26  >exclusiveMode &
32f90 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e  & pPager->eLock>
32fa0 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20  SHARED_LOCK).   
32fb0 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20     );.    }..   
32fc0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
32fd0 6d 70 46 69 6c 65 20 26 26 20 70 50 61 67 65 72  mpFile && pPager
32fe0 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c  ->hasHeldSharedL
32ff0 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ock ){.      /* 
33000 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20  The shared-lock 
33010 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61 63  has just been ac
33020 71 75 69 72 65 64 20 74 68 65 6e 20 63 68 65 63  quired then chec
33030 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65  k to.      ** se
33040 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  e if the databas
33050 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66  e has been modif
33060 69 65 64 2e 20 20 49 66 20 74 68 65 20 64 61 74  ied.  If the dat
33070 61 62 61 73 65 20 68 61 73 20 63 68 61 6e 67 65  abase has change
33080 64 2c 0a 20 20 20 20 20 20 2a 2a 20 66 6c 75 73  d,.      ** flus
33090 68 20 74 68 65 20 63 61 63 68 65 2e 20 20 54 68  h the cache.  Th
330a0 65 20 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c  e hasHeldSharedL
330b0 6f 63 6b 20 66 6c 61 67 20 70 72 65 76 65 6e 74  ock flag prevent
330c0 73 20 74 68 69 73 20 66 72 6f 6d 0a 20 20 20 20  s this from.    
330d0 20 20 2a 2a 20 6f 63 63 75 72 72 69 6e 67 20 6f    ** occurring o
330e0 6e 20 74 68 65 20 76 65 72 79 20 66 69 72 73 74  n the very first
330f0 20 61 63 63 65 73 73 20 74 6f 20 61 20 66 69 6c   access to a fil
33100 65 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73  e, in order to s
33110 61 76 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 73  ave a.      ** s
33120 69 6e 67 6c 65 20 75 6e 6e 65 63 65 73 73 61 72  ingle unnecessar
33130 79 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  y sqlite3OsRead(
33140 29 20 63 61 6c 6c 20 61 74 20 74 68 65 20 73 74  ) call at the st
33150 61 72 74 2d 75 70 2e 0a 20 20 20 20 20 20 2a 2a  art-up..      **
33160 0a 20 20 20 20 20 20 2a 2a 20 44 61 74 61 62 61  .      ** Databa
33170 73 65 20 63 68 61 6e 67 65 73 20 61 72 65 20 64  se changes are d
33180 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69  etected by looki
33190 6e 67 20 61 74 20 31 35 20 62 79 74 65 73 20 62  ng at 15 bytes b
331a0 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a  eginning.      *
331b0 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34 20 69  * at offset 24 i
331c0 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 54  nto the file.  T
331d0 68 65 20 66 69 72 73 74 20 34 20 6f 66 20 74 68  he first 4 of th
331e0 65 73 65 20 31 36 20 62 79 74 65 73 20 61 72 65  ese 16 bytes are
331f0 0a 20 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62  .      ** a 32-b
33200 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20  it counter that 
33210 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77  is incremented w
33220 69 74 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e  ith each change.
33230 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f    The.      ** o
33240 74 68 65 72 20 62 79 74 65 73 20 63 68 61 6e 67  ther bytes chang
33250 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20  e randomly with 
33260 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65  each file change
33270 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61   when.      ** a
33280 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65   codec is in use
33290 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20  ..      ** .    
332a0 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20    ** There is a 
332b0 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c  vanishingly smal
332c0 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20 61 20  l chance that a 
332d0 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20  change will not 
332e0 62 65 20 0a 20 20 20 20 20 20 2a 2a 20 64 65 74  be .      ** det
332f0 65 63 74 65 64 2e 20 20 54 68 65 20 63 68 61 6e  ected.  The chan
33300 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63  ce of an undetec
33310 74 65 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f  ted change is so
33320 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20   small that.    
33330 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 6e    ** it can be n
33340 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20 20 20  eglected..      
33350 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 50  */.      Pgno nP
33360 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63  age = 0;.      c
33370 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 73  har dbFileVers[s
33380 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62  izeof(pPager->db
33390 46 69 6c 65 56 65 72 73 29 5d 3b 0a 0a 20 20 20  FileVers)];..   
333a0 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67     rc = pagerPag
333b0 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
333c0 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  nPage);.      if
333d0 28 20 72 63 20 29 20 67 6f 74 6f 20 66 61 69 6c  ( rc ) goto fail
333e0 65 64 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6e  ed;..      if( n
333f0 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Page>0 ){.      
33400 20 20 49 4f 54 52 41 43 45 28 28 22 43 4b 56 45    IOTRACE(("CKVE
33410 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  RS %p %d\n", pPa
33420 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ger, sizeof(dbFi
33430 6c 65 56 65 72 73 29 29 29 3b 0a 20 20 20 20 20  leVers)));.     
33440 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
33450 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
33460 2c 20 26 64 62 46 69 6c 65 56 65 72 73 2c 20 73  , &dbFileVers, s
33470 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
33480 29 2c 20 32 34 29 3b 0a 20 20 20 20 20 20 20 20  ), 24);.        
33490 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
334a0 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  K && rc!=SQLITE_
334b0 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
334c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
334d0 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
334e0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
334f0 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  {.        memset
33500 28 64 62 46 69 6c 65 56 65 72 73 2c 20 30 2c 20  (dbFileVers, 0, 
33510 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
33520 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  s));.      }..  
33530 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70      if( memcmp(p
33540 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
33550 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73  s, dbFileVers, s
33560 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
33570 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
33580 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
33590 67 65 72 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  ger);..        /
335a0 2a 20 55 6e 6d 61 70 20 74 68 65 20 64 61 74 61  * Unmap the data
335b0 62 61 73 65 20 66 69 6c 65 2e 20 49 74 20 69 73  base file. It is
335c0 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 65   possible that e
335d0 78 74 65 72 6e 61 6c 20 70 72 6f 63 65 73 73 65  xternal processe
335e0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 79  s.        ** may
335f0 20 68 61 76 65 20 74 72 75 6e 63 61 74 65 64 20   have truncated 
33600 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
33610 65 20 61 6e 64 20 74 68 65 6e 20 65 78 74 65 6e  e and then exten
33620 64 65 64 20 69 74 20 62 61 63 6b 0a 20 20 20 20  ded it back.    
33630 20 20 20 20 2a 2a 20 74 6f 20 69 74 73 20 6f 72      ** to its or
33640 69 67 69 6e 61 6c 20 73 69 7a 65 20 77 68 69 6c  iginal size whil
33650 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 77  e this process w
33660 61 73 20 6e 6f 74 20 68 6f 6c 64 69 6e 67 20 61  as not holding a
33670 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a   lock..        *
33680 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  * In this case t
33690 68 65 72 65 20 6d 61 79 20 65 78 69 73 74 20 61  here may exist a
336a0 20 50 61 67 65 72 2e 70 4d 61 70 20 6d 61 70 70   Pager.pMap mapp
336b0 69 6e 67 20 74 68 61 74 20 61 70 70 65 61 72 73  ing that appears
336c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62  .        ** to b
336d0 65 20 74 68 65 20 72 69 67 68 74 20 73 69 7a 65  e the right size
336e0 20 62 75 74 20 69 73 20 6e 6f 74 20 61 63 74 75   but is not actu
336f0 61 6c 6c 79 20 76 61 6c 69 64 2e 20 41 76 6f 69  ally valid. Avoi
33700 64 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a  d this.        *
33710 2a 20 70 6f 73 73 69 62 69 6c 69 74 79 20 62 79  * possibility by
33720 20 75 6e 6d 61 70 70 69 6e 67 20 74 68 65 20 64   unmapping the d
33730 62 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 20  b here. */.     
33740 20 20 20 69 66 28 20 55 53 45 46 45 54 43 48 28     if( USEFETCH(
33750 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
33760 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e       sqlite3OsUn
33770 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64  fetch(pPager->fd
33780 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
33790 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
337a0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
337b0 65 20 69 73 20 61 20 57 41 4c 20 66 69 6c 65 20  e is a WAL file 
337c0 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  in the file-syst
337d0 65 6d 2c 20 6f 70 65 6e 20 74 68 69 73 20 64 61  em, open this da
337e0 74 61 62 61 73 65 20 69 6e 20 57 41 4c 0a 20 20  tabase in WAL.  
337f0 20 20 2a 2a 20 6d 6f 64 65 2e 20 4f 74 68 65 72    ** mode. Other
33800 77 69 73 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  wise, the follow
33810 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  ing function cal
33820 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  l is a no-op..  
33830 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61    */.    rc = pa
33840 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73  gerOpenWalIfPres
33850 65 6e 74 28 70 50 61 67 65 72 29 3b 0a 23 69 66  ent(pPager);.#if
33860 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
33870 5f 57 41 4c 0a 20 20 20 20 61 73 73 65 72 74 28  _WAL.    assert(
33880 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 3d 3d 30   pPager->pWal==0
33890 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   || rc==SQLITE_O
338a0 4b 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  K );.#endif.  }.
338b0 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57  .  if( pagerUseW
338c0 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
338d0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
338e0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72  LITE_OK );.    r
338f0 63 20 3d 20 70 61 67 65 72 42 65 67 69 6e 52 65  c = pagerBeginRe
33900 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  adTransaction(pP
33910 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  ager);.  }..  if
33920 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
33930 6c 65 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d  le==0 && pPager-
33940 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
33950 50 45 4e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  PEN && rc==SQLIT
33960 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
33970 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
33980 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d  pPager, &pPager-
33990 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20  >dbSize);.  }.. 
339a0 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 72 63  failed:.  if( rc
339b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
339c0 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44     assert( !MEMD
339d0 42 20 29 3b 0a 20 20 20 20 70 61 67 65 72 5f 75  B );.    pager_u
339e0 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  nlock(pPager);. 
339f0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
33a00 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
33a10 5f 4f 50 45 4e 20 29 3b 0a 20 20 7d 65 6c 73 65  _OPEN );.  }else
33a20 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53  {.    pPager->eS
33a30 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41  tate = PAGER_REA
33a40 44 45 52 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  DER;.    pPager-
33a50 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f  >hasHeldSharedLo
33a60 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65  ck = 1;.  }.  re
33a70 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
33a80 2a 20 49 66 20 74 68 65 20 72 65 66 65 72 65 6e  * If the referen
33a90 63 65 20 63 6f 75 6e 74 20 68 61 73 20 72 65 61  ce count has rea
33aa0 63 68 65 64 20 7a 65 72 6f 2c 20 72 6f 6c 6c 62  ched zero, rollb
33ab0 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65 0a 2a  ack any active.*
33ac0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  * transaction an
33ad0 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67  d unlock the pag
33ae0 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74  er..**.** Except
33af0 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  , in locking_mod
33b00 65 3d 45 58 43 4c 55 53 49 56 45 20 77 68 65 6e  e=EXCLUSIVE when
33b10 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e   there is nothin
33b20 67 20 74 6f 20 69 6e 0a 2a 2a 20 74 68 65 20 72  g to in.** the r
33b30 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c  ollback journal,
33b40 20 74 68 65 20 75 6e 6c 6f 63 6b 20 69 73 20 6e   the unlock is n
33b50 6f 74 20 70 65 72 66 6f 72 6d 65 64 20 61 6e 64  ot performed and
33b60 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 74   there is.** not
33b70 68 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  hing to rollback
33b80 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  , so this routin
33b90 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
33ba0 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61   .static void pa
33bb0 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65  gerUnlockIfUnuse
33bc0 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  d(Pager *pPager)
33bd0 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  {.  if( pPager->
33be0 6e 4d 6d 61 70 4f 75 74 3d 3d 30 20 26 26 20 28  nMmapOut==0 && (
33bf0 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
33c00 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
33c10 43 61 63 68 65 29 3d 3d 30 29 20 29 7b 0a 20 20  Cache)==0) ){.  
33c20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64    pagerUnlockAnd
33c30 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  Rollback(pPager)
33c40 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
33c50 63 71 75 69 72 65 20 61 20 72 65 66 65 72 65 6e  cquire a referen
33c60 63 65 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65  ce to page numbe
33c70 72 20 70 67 6e 6f 20 69 6e 20 70 61 67 65 72 20  r pgno in pager 
33c80 70 50 61 67 65 72 20 28 61 20 70 61 67 65 0a 2a  pPager (a page.*
33c90 2a 20 72 65 66 65 72 65 6e 63 65 20 68 61 73 20  * reference has 
33ca0 74 79 70 65 20 44 62 50 61 67 65 2a 29 2e 20 49  type DbPage*). I
33cb0 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
33cc0 72 65 66 65 72 65 6e 63 65 20 69 73 20 0a 2a 2a  reference is .**
33cd0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 62   successfully ob
33ce0 74 61 69 6e 65 64 2c 20 69 74 20 69 73 20 63 6f  tained, it is co
33cf0 70 69 65 64 20 74 6f 20 2a 70 70 50 61 67 65 20  pied to *ppPage 
33d00 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
33d10 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
33d20 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
33d30 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  age is already i
33d40 6e 20 74 68 65 20 63 61 63 68 65 2c 20 69 74 20  n the cache, it 
33d50 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a  is returned. .**
33d60 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 6e 65   Otherwise, a ne
33d70 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20 69 73  w page object is
33d80 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 70   allocated and p
33d90 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 64 61  opulated with da
33da0 74 61 0a 2a 2a 20 72 65 61 64 20 66 72 6f 6d 20  ta.** read from 
33db0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
33dc0 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73  e. In some cases
33dd0 2c 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64  , the pcache mod
33de0 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73  ule may.** choos
33df0 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63 61 74  e not to allocat
33e00 65 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a  e a new page obj
33e10 65 63 74 20 61 6e 64 20 6d 61 79 20 72 65 75 73  ect and may reus
33e20 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a  e an existing.**
33e30 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e 6f 20   object with no 
33e40 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
33e50 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  rences..**.** Th
33e60 65 20 65 78 74 72 61 20 64 61 74 61 20 61 70 70  e extra data app
33e70 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65 20  ended to a page 
33e80 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61  is always initia
33e90 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20 74  lized to zeros t
33ea0 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 74 69 6d  he .** first tim
33eb0 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64  e a page is load
33ec0 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20  ed into memory. 
33ed0 49 66 20 74 68 65 20 70 61 67 65 20 72 65 71 75  If the page requ
33ee0 65 73 74 65 64 20 69 73 20 0a 2a 2a 20 61 6c 72  ested is .** alr
33ef0 65 61 64 79 20 69 6e 20 74 68 65 20 63 61 63 68  eady in the cach
33f00 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
33f10 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
33f20 74 68 65 6e 20 74 68 65 20 65 78 74 72 61 0a 2a  then the extra.*
33f30 2a 20 64 61 74 61 20 69 73 20 6c 65 66 74 20 61  * data is left a
33f40 73 20 69 74 20 77 61 73 20 77 68 65 6e 20 74 68  s it was when th
33f50 65 20 70 61 67 65 20 6f 62 6a 65 63 74 20 77 61  e page object wa
33f60 73 20 6c 61 73 74 20 75 73 65 64 2e 0a 2a 2a 0a  s last used..**.
33f70 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  ** If the databa
33f80 73 65 20 69 6d 61 67 65 20 69 73 20 73 6d 61 6c  se image is smal
33f90 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71  ler than the req
33fa0 75 65 73 74 65 64 20 70 61 67 65 20 6f 72 20 69  uested page or i
33fb0 66 20 61 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f  f a .** non-zero
33fc0 20 76 61 6c 75 65 20 69 73 20 70 61 73 73 65 64   value is passed
33fd0 20 61 73 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e   as the noConten
33fe0 74 20 70 61 72 61 6d 65 74 65 72 20 61 6e 64 20  t parameter and 
33ff0 74 68 65 20 0a 2a 2a 20 72 65 71 75 65 73 74 65  the .** requeste
34000 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  d page is not al
34010 72 65 61 64 79 20 73 74 6f 72 65 64 20 69 6e 20  ready stored in 
34020 74 68 65 20 63 61 63 68 65 2c 20 74 68 65 6e 20  the cache, then 
34030 6e 6f 20 0a 2a 2a 20 61 63 74 75 61 6c 20 64 69  no .** actual di
34040 73 6b 20 72 65 61 64 20 6f 63 63 75 72 73 2e 20  sk read occurs. 
34050 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
34060 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66   memory image of
34070 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 69 73   the .** page is
34080 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
34090 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a 2a 0a 2a  all zeros. .**.*
340a0 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69  * If noContent i
340b0 73 20 74 72 75 65 2c 20 69 74 20 6d 65 61 6e 73  s true, it means
340c0 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20   that we do not 
340d0 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20 63  care about the c
340e0 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 74 68  ontents.** of th
340f0 65 20 70 61 67 65 2e 20 54 68 69 73 20 6f 63 63  e page. This occ
34100 75 72 73 20 69 6e 20 74 77 6f 20 73 63 65 6e 61  urs in two scena
34110 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29  rios:.**.**   a)
34120 20 57 68 65 6e 20 72 65 61 64 69 6e 67 20 61 20   When reading a 
34130 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
34140 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74  age from the dat
34150 61 62 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a  abase, and.**.**
34160 20 20 20 62 29 20 57 68 65 6e 20 61 20 73 61 76     b) When a sav
34170 65 70 6f 69 6e 74 20 69 73 20 62 65 69 6e 67 20  epoint is being 
34180 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20  rolled back and 
34190 77 65 20 6e 65 65 64 20 74 6f 20 6c 6f 61 64 0a  we need to load.
341a0 2a 2a 20 20 20 20 20 20 61 20 6e 65 77 20 70 61  **      a new pa
341b0 67 65 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68  ge into the cach
341c0 65 20 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 77  e to be filled w
341d0 69 74 68 20 74 68 65 20 64 61 74 61 20 72 65 61  ith the data rea
341e0 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74  d.**      from t
341f0 68 65 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75  he savepoint jou
34200 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  rnal..**.** If n
34210 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65  oContent is true
34220 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 20  , then the data 
34230 72 65 74 75 72 6e 65 64 20 69 73 20 7a 65 72 6f  returned is zero
34240 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a  ed instead of.**
34250 20 62 65 69 6e 67 20 72 65 61 64 20 66 72 6f 6d   being read from
34260 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 41   the database. A
34270 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65  dditionally, the
34280 20 62 69 74 73 20 63 6f 72 72 65 73 70 6f 6e 64   bits correspond
34290 69 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20 69  ing.** to pgno i
342a0 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  n Pager.pInJourn
342b0 61 6c 20 28 62 69 74 76 65 63 20 6f 66 20 70 61  al (bitvec of pa
342c0 67 65 73 20 61 6c 72 65 61 64 79 20 77 72 69 74  ges already writ
342d0 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6a 6f  ten to the.** jo
342e0 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20  urnal file) and 
342f0 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69  the PagerSavepoi
34300 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20  nt.pInSavepoint 
34310 62 69 74 76 65 63 73 20 6f 66 20 61 6e 79 20 6f  bitvecs of any o
34320 70 65 6e 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74  pen.** savepoint
34330 73 20 61 72 65 20 73 65 74 2e 20 54 68 69 73 20  s are set. This 
34340 6d 65 61 6e 73 20 69 66 20 74 68 65 20 70 61 67  means if the pag
34350 65 20 69 73 20 6d 61 64 65 20 77 72 69 74 61 62  e is made writab
34360 6c 65 20 61 74 20 61 6e 79 0a 2a 2a 20 70 6f 69  le at any.** poi
34370 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  nt in the future
34380 2c 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74  , using a call t
34390 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  o sqlite3PagerWr
343a0 69 74 65 28 29 2c 20 69 74 73 20 63 6f 6e 74 65  ite(), its conte
343b0 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  nts.** will not 
343c0 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 54 68  be journaled. Th
343d0 69 73 20 73 61 76 65 73 20 49 4f 2e 0a 2a 2a 0a  is saves IO..**.
343e0 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69 74 69  ** The acquisiti
343f0 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f  on might fail fo
34400 72 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e  r several reason
34410 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73  s.  In all cases
34420 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69  ,.** an appropri
34430 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
34440 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
34450 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
34460 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65   NULL..**.** See
34470 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67   also sqlite3Pag
34480 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74  erLookup().  Bot
34490 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  h this routine a
344a0 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65  nd Lookup() atte
344b0 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61  mpt.** to find a
344c0 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d   page in the in-
344d0 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72  memory cache fir
344e0 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  st.  If the page
344f0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a   is not already.
34500 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68  ** in memory, th
34510 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20  is routine goes 
34520 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20  to disk to read 
34530 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c 6f  it in whereas Lo
34540 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72  okup().** just r
34550 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20  eturns 0.  This 
34560 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65 73  routine acquires
34570 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65   a read-lock the
34580 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a   first time it.*
34590 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64  * has to go to d
345a0 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61  isk, and could a
345b0 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20  lso playback an 
345c0 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e  old journal if n
345d0 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e  ecessary..** Sin
345e0 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65  ce Lookup() neve
345f0 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20  r goes to disk, 
34600 69 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20  it never has to 
34610 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a  deal with locks.
34620 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69  ** or journal fi
34630 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  les..*/.int sqli
34640 74 65 33 50 61 67 65 72 47 65 74 28 0a 20 20 50  te3PagerGet(.  P
34650 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
34660 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
34670 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  open on the data
34680 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50  base file */.  P
34690 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
346a0 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
346b0 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20  r to fetch */.  
346c0 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  DbPage **ppPage,
346d0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70      /* Write a p
346e0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
346f0 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  ge here */.  int
34700 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
34710 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 58 58   /* PAGER_GET_XX
34720 58 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20  X flags */.){.  
34730 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
34740 4f 4b 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  OK;.  PgHdr *pPg
34750 20 3d 20 30 3b 0a 20 20 75 33 32 20 69 46 72 61   = 0;.  u32 iFra
34760 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  me = 0;         
34770 20 20 20 20 20 20 20 20 2f 2a 20 46 72 61 6d 65          /* Frame
34780 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 57 41   to read from WA
34790 4c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73  L file */.  cons
347a0 74 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20  t int noContent 
347b0 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52  = (flags & PAGER
347c0 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 29 3b  _GET_NOCONTENT);
347d0 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 61 63 63  ..  /* It is acc
347e0 65 70 74 61 62 6c 65 20 74 6f 20 75 73 65 20 61  eptable to use a
347f0 20 72 65 61 64 2d 6f 6e 6c 79 20 28 6d 6d 61 70   read-only (mmap
34800 29 20 70 61 67 65 20 66 6f 72 20 61 6e 79 20 70  ) page for any p
34810 61 67 65 20 65 78 63 65 70 74 0a 20 20 2a 2a 20  age except.  ** 
34820 70 61 67 65 20 31 20 69 66 20 74 68 65 72 65 20  page 1 if there 
34830 69 73 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e  is no write-tran
34840 73 61 63 74 69 6f 6e 20 6f 70 65 6e 20 6f 72 20  saction open or 
34850 74 68 65 20 41 43 51 55 49 52 45 5f 52 45 41 44  the ACQUIRE_READ
34860 4f 4e 4c 59 0a 20 20 2a 2a 20 66 6c 61 67 20 77  ONLY.  ** flag w
34870 61 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20  as specified by 
34880 74 68 65 20 63 61 6c 6c 65 72 2e 20 41 6e 64 20  the caller. And 
34890 73 6f 20 6c 6f 6e 67 20 61 73 20 74 68 65 20 64  so long as the d
348a0 62 20 69 73 20 6e 6f 74 20 61 20 0a 20 20 2a 2a  b is not a .  **
348b0 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e   temporary or in
348c0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
348d0 2e 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e  .  */.  const in
348e0 74 20 62 4d 6d 61 70 4f 6b 20 3d 20 28 70 67 6e  t bMmapOk = (pgn
348f0 6f 3e 31 20 26 26 20 55 53 45 46 45 54 43 48 28  o>1 && USEFETCH(
34900 70 50 61 67 65 72 29 0a 20 20 20 26 26 20 28 70  pPager).   && (p
34910 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
34920 41 47 45 52 5f 52 45 41 44 45 52 20 7c 7c 20 28  AGER_READER || (
34930 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 47 45  flags & PAGER_GE
34940 54 5f 52 45 41 44 4f 4e 4c 59 29 29 0a 23 69 66  T_READONLY)).#if
34950 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
34960 4f 44 45 43 0a 20 20 20 26 26 20 70 50 61 67 65  ODEC.   && pPage
34970 72 2d 3e 78 43 6f 64 65 63 3d 3d 30 0a 23 65 6e  r->xCodec==0.#en
34980 64 69 66 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 4f  dif.  );..  /* O
34990 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6e 6f 74 65  ptimization note
349a0 3a 20 20 41 64 64 69 6e 67 20 74 68 65 20 22 70  :  Adding the "p
349b0 67 6e 6f 3c 3d 31 22 20 74 65 72 6d 20 62 65 66  gno<=1" term bef
349c0 6f 72 65 20 22 70 67 6e 6f 3d 3d 30 22 20 68 65  ore "pgno==0" he
349d0 72 65 0a 20 20 2a 2a 20 61 6c 6c 6f 77 73 20 74  re.  ** allows t
349e0 68 65 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69  he compiler opti
349f0 6d 69 7a 65 72 20 74 6f 20 72 65 75 73 65 20 74  mizer to reuse t
34a00 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
34a10 65 20 22 70 67 6e 6f 3e 31 22 0a 20 20 2a 2a 20  e "pgno>1".  ** 
34a20 74 65 73 74 20 69 6e 20 74 68 65 20 70 72 65 76  test in the prev
34a30 69 6f 75 73 20 73 74 61 74 65 6d 65 6e 74 2c 20  ious statement, 
34a40 61 6e 64 20 61 76 6f 69 64 20 74 65 73 74 69 6e  and avoid testin
34a50 67 20 70 67 6e 6f 3d 3d 30 20 69 6e 20 74 68 65  g pgno==0 in the
34a60 0a 20 20 2a 2a 20 63 6f 6d 6d 6f 6e 20 63 61 73  .  ** common cas
34a70 65 20 77 68 65 72 65 20 70 67 6e 6f 20 69 73 20  e where pgno is 
34a80 6c 61 72 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20  large. */.  if( 
34a90 70 67 6e 6f 3c 3d 31 20 26 26 20 70 67 6e 6f 3d  pgno<=1 && pgno=
34aa0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
34ab0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
34ac0 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65  BKPT;.  }.  asse
34ad0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
34ae0 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te>=PAGER_READER
34af0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
34b00 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
34b10 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
34b20 73 65 72 74 28 20 6e 6f 43 6f 6e 74 65 6e 74 3d  sert( noContent=
34b30 3d 30 20 7c 7c 20 62 4d 6d 61 70 4f 6b 3d 3d 30  =0 || bMmapOk==0
34b40 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
34b50 50 61 67 65 72 2d 3e 68 61 73 48 65 6c 64 53 68  Pager->hasHeldSh
34b60 61 72 65 64 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 0a  aredLock==1 );..
34b70 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
34b80 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 0a 20  MIT_CONCURRENT. 
34b90 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
34ba0 6e 20 43 4f 4e 43 55 52 52 45 4e 54 20 74 72 61  n CONCURRENT tra
34bb0 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 74 68 65  nsaction and the
34bc0 20 70 61 67 65 20 62 65 69 6e 67 20 72 65 61 64   page being read
34bd0 20 77 61 73 0a 20 20 2a 2a 20 70 72 65 73 65 6e   was.  ** presen
34be0 74 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  t in the databas
34bf0 65 20 66 69 6c 65 20 77 68 65 6e 20 74 68 65 20  e file when the 
34c00 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
34c10 6f 70 65 6e 65 64 2c 0a 20 20 2a 2a 20 6d 61 72  opened,.  ** mar
34c20 6b 20 69 74 20 61 73 20 72 65 61 64 20 69 6e 20  k it as read in 
34c30 74 68 65 20 70 41 6c 6c 52 65 61 64 20 76 65 63  the pAllRead vec
34c40 74 6f 72 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  tor.  */.  if( p
34c50 50 61 67 65 72 2d 3e 70 41 6c 6c 52 65 61 64 20  Pager->pAllRead 
34c60 26 26 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  && pgno<=pPager-
34c70 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20  >dbOrigSize ){. 
34c80 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
34c90 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d  itvecSet(pPager-
34ca0 3e 70 41 6c 6c 52 65 61 64 2c 20 70 67 6e 6f 29  >pAllRead, pgno)
34cb0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
34cc0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70  LITE_OK ) goto p
34cd0 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
34ce0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
34cf0 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
34d00 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  is in the error 
34d10 73 74 61 74 65 2c 20 72 65 74 75 72 6e 20 61 6e  state, return an
34d20 20 65 72 72 6f 72 20 69 6d 6d 65 64 69 61 74 65   error immediate
34d30 6c 79 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77  ly. .  ** Otherw
34d40 69 73 65 2c 20 72 65 71 75 65 73 74 20 74 68 65  ise, request the
34d50 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 50   page from the P
34d60 43 61 63 68 65 20 6c 61 79 65 72 2e 20 2a 2f 0a  Cache layer. */.
34d70 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
34d80 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b  rCode!=SQLITE_OK
34d90 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61   ){.    rc = pPa
34da0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
34db0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 62  }else{.    if( b
34dc0 4d 6d 61 70 4f 6b 20 26 26 20 70 61 67 65 72 55  MmapOk && pagerU
34dd0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
34de0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
34df0 74 65 33 57 61 6c 46 69 6e 64 46 72 61 6d 65 28  te3WalFindFrame(
34e00 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67  pPager->pWal, pg
34e10 6e 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20 20  no, &iFrame);.  
34e20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
34e30 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67  TE_OK ) goto pag
34e40 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
34e50 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 62      }..    if( b
34e60 4d 6d 61 70 4f 6b 20 26 26 20 69 46 72 61 6d 65  MmapOk && iFrame
34e70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 76 6f 69  ==0 ){.      voi
34e80 64 20 2a 70 44 61 74 61 20 3d 20 30 3b 0a 0a 20  d *pData = 0;.. 
34e90 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
34ea0 33 4f 73 46 65 74 63 68 28 70 50 61 67 65 72 2d  3OsFetch(pPager-
34eb0 3e 66 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20  >fd, .          
34ec0 28 69 36 34 29 28 70 67 6e 6f 2d 31 29 20 2a 20  (i64)(pgno-1) * 
34ed0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
34ee0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
34ef0 7a 65 2c 20 26 70 44 61 74 61 0a 20 20 20 20 20  ze, &pData.     
34f00 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 72   );..      if( r
34f10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
34f20 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20  pData ){.       
34f30 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
34f40 61 74 65 3e 50 41 47 45 52 5f 52 45 41 44 45 52  ate>PAGER_READER
34f50 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
34f60 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  File ){.        
34f70 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50    pPg = sqlite3P
34f80 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65  agerLookup(pPage
34f90 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  r, pgno);.      
34fa0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
34fb0 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pPg==0 ){.      
34fc0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 41 63      rc = pagerAc
34fd0 71 75 69 72 65 4d 61 70 50 61 67 65 28 70 50 61  quireMapPage(pPa
34fe0 67 65 72 2c 20 70 67 6e 6f 2c 20 70 44 61 74 61  ger, pgno, pData
34ff0 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 20 20 20  , &pPg);.       
35000 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
35010 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74    sqlite3OsUnfet
35020 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28  ch(pPager->fd, (
35030 69 36 34 29 28 70 67 6e 6f 2d 31 29 2a 70 50 61  i64)(pgno-1)*pPa
35040 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70  ger->pageSize, p
35050 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 7d  Data);.        }
35060 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 67  .        if( pPg
35070 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
35080 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
35090 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 20  _OK );.         
350a0 20 2a 70 70 50 61 67 65 20 3d 20 70 50 67 3b 0a   *ppPage = pPg;.
350b0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
350c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
350d0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
350e0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
350f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
35100 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75   goto pager_acqu
35110 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d  ire_err;.      }
35120 0a 20 20 20 20 7d 0a 0a 20 20 20 20 7b 0a 20 20  .    }..    {.  
35130 20 20 20 20 73 71 6c 69 74 65 33 5f 70 63 61 63      sqlite3_pcac
35140 68 65 5f 70 61 67 65 20 2a 70 42 61 73 65 3b 0a  he_page *pBase;.
35150 20 20 20 20 20 20 70 42 61 73 65 20 3d 20 73 71        pBase = sq
35160 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
35170 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
35180 2c 20 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 20 20  , pgno, 3);.    
35190 20 20 69 66 28 20 70 42 61 73 65 3d 3d 30 20 29    if( pBase==0 )
351a0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
351b0 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
351c0 68 53 74 72 65 73 73 28 70 50 61 67 65 72 2d 3e  hStress(pPager->
351d0 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 26  pPCache, pgno, &
351e0 70 42 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20  pBase);.        
351f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
35200 4b 20 29 20 67 6f 74 6f 20 70 61 67 65 72 5f 61  K ) goto pager_a
35210 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20  cquire_err;.    
35220 20 20 20 20 69 66 28 20 70 42 61 73 65 3d 3d 30      if( pBase==0
35230 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50   ){.          pP
35240 67 20 3d 20 2a 70 70 50 61 67 65 20 3d 20 30 3b  g = *ppPage = 0;
35250 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
35260 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
35270 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  T;.          got
35280 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
35290 65 72 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  err;.        }. 
352a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67       }.      pPg
352b0 20 3d 20 2a 70 70 50 61 67 65 20 3d 20 73 71 6c   = *ppPage = sql
352c0 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 46  ite3PcacheFetchF
352d0 69 6e 69 73 68 28 70 50 61 67 65 72 2d 3e 70 50  inish(pPager->pP
352e0 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 70 42 61  Cache, pgno, pBa
352f0 73 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  se);.      asser
35300 74 28 20 70 50 67 21 3d 30 20 29 3b 0a 20 20 20  t( pPg!=0 );.   
35310 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
35320 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
35330 20 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65     /* Either the
35340 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
35350 50 63 61 63 68 65 46 65 74 63 68 28 29 20 72 65  PcacheFetch() re
35360 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20  turned an error 
35370 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61  or the.    ** pa
35380 67 65 72 20 77 61 73 20 61 6c 72 65 61 64 79 20  ger was already 
35390 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61  in the error-sta
353a0 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  te when this fun
353b0 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64  ction was called
353c0 2e 0a 20 20 20 20 2a 2a 20 53 65 74 20 70 50 67  ..    ** Set pPg
353d0 20 74 6f 20 30 20 61 6e 64 20 6a 75 6d 70 20 74   to 0 and jump t
353e0 6f 20 74 68 65 20 65 78 63 65 70 74 69 6f 6e 20  o the exception 
353f0 68 61 6e 64 6c 65 72 2e 20 20 2a 2f 0a 20 20 20  handler.  */.   
35400 20 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 67 6f   pPg = 0;.    go
35410 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65  to pager_acquire
35420 5f 65 72 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65  _err;.  }.  asse
35430 72 74 28 20 70 50 67 3d 3d 28 2a 70 70 50 61 67  rt( pPg==(*ppPag
35440 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
35450 70 50 67 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20  pPg->pgno==pgno 
35460 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  );.  assert( pPg
35470 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72  ->pPager==pPager
35480 20 7c 7c 20 70 50 67 2d 3e 70 50 61 67 65 72 3d   || pPg->pPager=
35490 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 67  =0 );..  if( pPg
354a0 2d 3e 70 50 61 67 65 72 20 26 26 20 21 6e 6f 43  ->pPager && !noC
354b0 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 2f 2a  ontent ){.    /*
354c0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
354d0 65 20 70 63 61 63 68 65 20 61 6c 72 65 61 64 79  e pcache already
354e0 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 69   contains an ini
354f0 74 69 61 6c 69 7a 65 64 20 63 6f 70 79 20 6f 66  tialized copy of
35500 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65  .    ** the page
35510 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74  . Return without
35520 20 66 75 72 74 68 65 72 20 61 64 6f 2e 20 20 2a   further ado.  *
35530 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67  /.    assert( pg
35540 6e 6f 3c 3d 50 41 47 45 52 5f 4d 41 58 5f 50 47  no<=PAGER_MAX_PG
35550 4e 4f 20 26 26 20 70 67 6e 6f 21 3d 50 41 47 45  NO && pgno!=PAGE
35560 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
35570 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ) );.    pPager-
35580 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41  >aStat[PAGER_STA
35590 54 5f 48 49 54 5d 2b 2b 3b 0a 20 20 20 20 72 65  T_HIT]++;.    re
355a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
355b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
355c0 20 54 68 65 20 70 61 67 65 72 20 63 61 63 68 65   The pager cache
355d0 20 68 61 73 20 63 72 65 61 74 65 64 20 61 20 6e   has created a n
355e0 65 77 20 70 61 67 65 2e 20 49 74 73 20 63 6f 6e  ew page. Its con
355f0 74 65 6e 74 20 6e 65 65 64 73 20 74 6f 20 0a 20  tent needs to . 
35600 20 20 20 2a 2a 20 62 65 20 69 6e 69 74 69 61 6c     ** be initial
35610 69 7a 65 64 2e 20 20 2a 2f 0a 0a 20 20 20 20 70  ized.  */..    p
35620 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61  Pg->pPager = pPa
35630 67 65 72 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  ger;..    /* The
35640 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 6e 75   maximum page nu
35650 6d 62 65 72 20 69 73 20 32 5e 33 31 2e 20 52 65  mber is 2^31. Re
35660 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
35670 55 50 54 20 69 66 20 61 20 70 61 67 65 0a 20 20  UPT if a page.  
35680 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65 61    ** number grea
35690 74 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 6f  ter than this, o
356a0 72 20 74 68 65 20 75 6e 75 73 65 64 20 6c 6f 63  r the unused loc
356b0 6b 69 6e 67 2d 70 61 67 65 2c 20 69 73 20 72 65  king-page, is re
356c0 71 75 65 73 74 65 64 2e 20 2a 2f 0a 20 20 20 20  quested. */.    
356d0 69 66 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d  if( pgno>PAGER_M
356e0 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d  AX_PGNO || pgno=
356f0 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
35700 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
35710 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
35720 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
35730 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
35740 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20  re_err;.    }.. 
35750 20 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70     assert( !isOp
35760 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
35770 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20  | !MEMDB );.    
35780 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  if( !isOpen(pPag
35790 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65  er->fd) || pPage
357a0 72 2d 3e 64 62 53 69 7a 65 3c 70 67 6e 6f 20 7c  r->dbSize<pgno |
357b0 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20  | noContent ){. 
357c0 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50       if( pgno>pP
357d0 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a  ager->mxPgno ){.
357e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
357f0 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20  ITE_FULL;.      
35800 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71    goto pager_acq
35810 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20  uire_err;.      
35820 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43 6f  }.      if( noCo
35830 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  ntent ){.       
35840 20 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f 20 73   /* Failure to s
35850 65 74 20 74 68 65 20 62 69 74 73 20 69 6e 20 74  et the bits in t
35860 68 65 20 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74  he InJournal bit
35870 2d 76 65 63 74 6f 72 73 20 69 73 20 62 65 6e 69  -vectors is beni
35880 67 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49  gn..        ** I
35890 74 20 6d 65 72 65 6c 79 20 6d 65 61 6e 73 20 74  t merely means t
358a0 68 61 74 20 77 65 20 6d 69 67 68 74 20 64 6f 20  hat we might do 
358b0 73 6f 6d 65 20 65 78 74 72 61 20 77 6f 72 6b 20  some extra work 
358c0 74 6f 20 6a 6f 75 72 6e 61 6c 20 61 20 0a 20 20  to journal a .  
358d0 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 74 68        ** page th
358e0 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  at does not need
358f0 20 74 6f 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64   to be journaled
35900 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c  .  Nevertheless,
35910 20 62 65 20 73 75 72 65 20 0a 20 20 20 20 20 20   be sure .      
35920 20 20 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65    ** to test the
35930 20 63 61 73 65 20 77 68 65 72 65 20 61 20 6d 61   case where a ma
35940 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72  lloc error occur
35950 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74  s while trying t
35960 6f 20 73 65 74 20 0a 20 20 20 20 20 20 20 20 2a  o set .        *
35970 2a 20 61 20 62 69 74 20 69 6e 20 61 20 62 69 74  * a bit in a bit
35980 20 76 65 63 74 6f 72 2e 0a 20 20 20 20 20 20 20   vector..       
35990 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
359a0 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
359b0 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20  lloc();.        
359c0 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72  if( pgno<=pPager
359d0 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a  ->dbOrigSize ){.
359e0 20 20 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e            TESTON
359f0 4c 59 28 20 72 63 20 3d 20 29 20 73 71 6c 69 74  LY( rc = ) sqlit
35a00 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67  e3BitvecSet(pPag
35a10 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
35a20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  pgno);.         
35a30 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53   testcase( rc==S
35a40 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
35a50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
35a60 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20   TESTONLY( rc = 
35a70 29 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74  ) addToSavepoint
35a80 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20  Bitvecs(pPager, 
35a90 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74  pgno);.        t
35aa0 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c  estcase( rc==SQL
35ab0 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
35ac0 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42       sqlite3EndB
35ad0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
35ae0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d       }.      mem
35af0 73 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20  set(pPg->pData, 
35b00 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  0, pPager->pageS
35b10 69 7a 65 29 3b 0a 20 20 20 20 20 20 49 4f 54 52  ize);.      IOTR
35b20 41 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25 64  ACE(("ZERO %p %d
35b30 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e  \n", pPager, pgn
35b40 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  o));.    }else{.
35b50 20 20 20 20 20 20 69 66 28 20 70 61 67 65 72 55        if( pagerU
35b60 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 26 26  seWal(pPager) &&
35b70 20 62 4d 6d 61 70 4f 6b 3d 3d 30 20 29 7b 0a 20   bMmapOk==0 ){. 
35b80 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
35b90 74 65 33 57 61 6c 46 69 6e 64 46 72 61 6d 65 28  te3WalFindFrame(
35ba0 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67  pPager->pWal, pg
35bb0 6e 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20 20  no, &iFrame);.  
35bc0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
35bd0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70  LITE_OK ) goto p
35be0 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
35bf0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
35c00 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61  assert( pPg->pPa
35c10 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20  ger==pPager );. 
35c20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74       pPager->aSt
35c30 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 4d 49  at[PAGER_STAT_MI
35c40 53 53 5d 2b 2b 3b 0a 20 20 20 20 20 20 72 63 20  SS]++;.      rc 
35c50 3d 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67  = readDbPage(pPg
35c60 2c 20 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20  , iFrame);.     
35c70 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
35c80 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
35c90 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65  to pager_acquire
35ca0 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _err;.      }.  
35cb0 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65    }.    pager_se
35cc0 74 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  t_pagehash(pPg);
35cd0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
35ce0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72  QLITE_OK;..pager
35cf0 5f 61 63 71 75 69 72 65 5f 65 72 72 3a 0a 20 20  _acquire_err:.  
35d00 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
35d10 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70  TE_OK );.  if( p
35d20 50 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  Pg ){.    sqlite
35d30 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29  3PcacheDrop(pPg)
35d40 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c  ;.  }.  pagerUnl
35d50 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67  ockIfUnused(pPag
35d60 65 72 29 3b 0a 0a 20 20 2a 70 70 50 61 67 65 20  er);..  *ppPage 
35d70 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
35d80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  ;.}../*.** Acqui
35d90 72 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20  re a page if it 
35da0 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
35db0 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
35dc0 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65  e.  Do.** not re
35dd0 61 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  ad the page from
35de0 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61   disk.  Return a
35df0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
35e00 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66  page,.** or 0 if
35e10 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
35e20 20 69 6e 20 63 61 63 68 65 2e 20 0a 2a 2a 0a 2a   in cache. .**.*
35e30 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74  * See also sqlit
35e40 65 33 50 61 67 65 72 47 65 74 28 29 2e 20 20 54  e3PagerGet().  T
35e50 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
35e60 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69  tween this routi
35e70 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65  ne.** and sqlite
35e80 33 50 61 67 65 72 47 65 74 28 29 20 69 73 20 74  3PagerGet() is t
35e90 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20  hat _get() will 
35ea0 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61  go to the disk a
35eb0 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68  nd read.** in th
35ec0 65 20 70 61 67 65 20 69 66 20 74 68 65 20 70 61  e page if the pa
35ed0 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
35ee0 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69  y in cache.  Thi
35ef0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74  s routine.** ret
35f00 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65  urns NULL if the
35f10 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
35f20 63 61 63 68 65 20 6f 72 20 69 66 20 61 20 64 69  cache or if a di
35f30 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a  sk I/O error .**
35f40 20 68 61 73 20 65 76 65 72 20 68 61 70 70 65 6e   has ever happen
35f50 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73  ed..*/.DbPage *s
35f60 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
35f70 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  p(Pager *pPager,
35f80 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 73   Pgno pgno){.  s
35f90 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 70 61  qlite3_pcache_pa
35fa0 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 61 73 73  ge *pPage;.  ass
35fb0 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
35fc0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f  ;.  assert( pgno
35fd0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
35fe0 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65   pPager->pPCache
35ff0 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 20 3d  !=0 );.  pPage =
36000 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
36010 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61  tch(pPager->pPCa
36020 63 68 65 2c 20 70 67 6e 6f 2c 20 30 29 3b 0a 20  che, pgno, 0);. 
36030 20 61 73 73 65 72 74 28 20 70 50 61 67 65 3d 3d   assert( pPage==
36040 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 68 61 73  0 || pPager->has
36050 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b 20 29  HeldSharedLock )
36060 3b 0a 20 20 69 66 28 20 70 50 61 67 65 3d 3d 30  ;.  if( pPage==0
36070 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
36080 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 63 61  eturn sqlite3Pca
36090 63 68 65 46 65 74 63 68 46 69 6e 69 73 68 28 70  cheFetchFinish(p
360a0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
360b0 70 67 6e 6f 2c 20 70 50 61 67 65 29 3b 0a 7d 0a  pgno, pPage);.}.
360c0 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
360d0 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e   page reference.
360e0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75  .**.** If the nu
360f0 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
36100 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64  es to the page d
36110 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65  rop to zero, the
36120 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73  n the.** page is
36130 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52   added to the LR
36140 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c  U list.  When al
36150 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  l references to 
36160 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65  all pages.** are
36170 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c   released, a rol
36180 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64  lback occurs and
36190 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
361a0 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20   database is.** 
361b0 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64  removed..*/.void
361c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
361d0 65 66 4e 6f 74 4e 75 6c 6c 28 44 62 50 61 67 65  efNotNull(DbPage
361e0 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
361f0 2a 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72  *pPager;.  asser
36200 74 28 20 70 50 67 21 3d 30 20 29 3b 0a 20 20 70  t( pPg!=0 );.  p
36210 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
36220 67 65 72 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e  ger;.  if( pPg->
36230 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4d 4d  flags & PGHDR_MM
36240 41 50 20 29 7b 0a 20 20 20 20 70 61 67 65 72 52  AP ){.    pagerR
36250 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28 70 50  eleaseMapPage(pP
36260 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  g);.  }else{.   
36270 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
36280 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a  lease(pPg);.  }.
36290 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55    pagerUnlockIfU
362a0 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 7d  nused(pPager);.}
362b0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
362c0 65 72 55 6e 72 65 66 28 44 62 50 61 67 65 20 2a  erUnref(DbPage *
362d0 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 20  pPg){.  if( pPg 
362e0 29 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  ) sqlite3PagerUn
362f0 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 67 29 3b  refNotNull(pPg);
36300 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
36310 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
36320 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  d at the start o
36330 66 20 65 76 65 72 79 20 77 72 69 74 65 20 74 72  f every write tr
36340 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  ansaction..** Th
36350 65 72 65 20 6d 75 73 74 20 61 6c 72 65 61 64 79  ere must already
36360 20 62 65 20 61 20 52 45 53 45 52 56 45 44 20 6f   be a RESERVED o
36370 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
36380 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
36390 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20 74   .** file when t
363a0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
363b0 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65  alled..**.** Ope
363c0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
363d0 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61  le for pager pPa
363e0 67 65 72 20 61 6e 64 20 77 72 69 74 65 20 61 20  ger and write a 
363f0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a  journal header.*
36400 2a 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  * to the start o
36410 66 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 61  f it. If there a
36420 72 65 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  re active savepo
36430 69 6e 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 73  ints, open the s
36440 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73  ub-journal.** as
36450 20 77 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63   well. This func
36460 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65  tion is only use
36470 64 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  d when the journ
36480 61 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67  al file is being
36490 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 74 6f 20 77   .** opened to w
364a0 72 69 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20  rite a rollback 
364b0 6c 6f 67 20 66 6f 72 20 61 20 74 72 61 6e 73 61  log for a transa
364c0 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 6e 6f 74  ction. It is not
364d0 20 75 73 65 64 20 0a 2a 2a 20 77 68 65 6e 20 6f   used .** when o
364e0 70 65 6e 69 6e 67 20 61 20 68 6f 74 20 6a 6f 75  pening a hot jou
364f0 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 72 6f 6c  rnal file to rol
36500 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  l it back..**.**
36510 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
36520 66 69 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20  file is already 
36530 6f 70 65 6e 20 28 61 73 20 69 74 20 6d 61 79 20  open (as it may 
36540 62 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  be in exclusive 
36550 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68 65 6e 20 74  mode),.** then t
36560 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6a 75 73  his function jus
36570 74 20 77 72 69 74 65 73 20 61 20 6a 6f 75 72 6e  t writes a journ
36580 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68 65  al header to the
36590 20 73 74 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a   start of the.**
365a0 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 66 69   already open fi
365b0 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68  le. .**.** Wheth
365c0 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f  er or not the jo
365d0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
365e0 65 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ened by this fun
365f0 63 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50 61  ction, the.** Pa
36600 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62  ger.pInJournal b
36610 69 74 76 65 63 20 73 74 72 75 63 74 75 72 65 20  itvec structure 
36620 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a  is allocated..**
36630 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
36640 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69  E_OK if everythi
36650 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ng is successful
36660 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  . Otherwise, ret
36670 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e  urn .** SQLITE_N
36680 4f 4d 45 4d 20 69 66 20 74 68 65 20 61 74 74 65  OMEM if the atte
36690 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  mpt to allocate 
366a0 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
366b0 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61   fails, or .** a
366c0 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
366d0 69 66 20 6f 70 65 6e 69 6e 67 20 6f 72 20 77 72  if opening or wr
366e0 69 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  iting the journa
366f0 6c 20 66 69 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f  l file fails..*/
36700 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
36710 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50  r_open_journal(P
36720 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
36730 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
36740 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
36750 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
36760 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
36770 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f  sqlite3_vfs * co
36780 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65  nst pVfs = pPage
36790 72 2d 3e 70 56 66 73 3b 20 20 20 2f 2a 20 4c 6f  r->pVfs;   /* Lo
367a0 63 61 6c 20 63 61 63 68 65 20 6f 66 20 76 66 73  cal cache of vfs
367b0 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20 20 61   pointer */..  a
367c0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
367d0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
367e0 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20  TER_LOCKED );.  
367f0 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
36800 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
36810 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
36820 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
36830 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 2f 2a  al==0 );.  .  /*
36840 20 49 66 20 61 6c 72 65 61 64 79 20 69 6e 20 74   If already in t
36850 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  he error state, 
36860 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
36870 20 61 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 6f   a no-op.  But o
36880 6e 0a 20 20 2a 2a 20 74 68 65 20 6f 74 68 65 72  n.  ** the other
36890 20 68 61 6e 64 2c 20 74 68 69 73 20 72 6f 75 74   hand, this rout
368a0 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c  ine is never cal
368b0 6c 65 64 20 69 66 20 77 65 20 61 72 65 20 61 6c  led if we are al
368c0 72 65 61 64 79 20 69 6e 0a 20 20 2a 2a 20 61 6e  ready in.  ** an
368d0 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 2a 2f   error state. */
368e0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61  .  if( NEVER(pPa
368f0 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20  ger->errCode) ) 
36900 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
36910 72 72 43 6f 64 65 3b 0a 0a 20 20 69 66 28 20 21  rrCode;..  if( !
36920 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
36930 65 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  er) && pPager->j
36940 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
36950 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
36960 46 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  F ){.    pPager-
36970 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71  >pInJournal = sq
36980 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
36990 65 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  e(pPager->dbSize
369a0 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
369b0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
369c0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
369d0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
369e0 50 54 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  PT;.    }.  .   
369f0 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75   /* Open the jou
36a00 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 69 74 20  rnal file if it 
36a10 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f  is not already o
36a20 70 65 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  pen. */.    if( 
36a30 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
36a40 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66  jfd) ){.      if
36a50 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
36a60 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
36a70 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
36a80 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
36a90 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e  e3MemJournalOpen
36aa0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
36ab0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
36ac0 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
36ad0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
36ae0 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
36af0 4e 5f 43 52 45 41 54 45 3b 0a 20 20 20 20 20 20  N_CREATE;.      
36b00 20 20 69 6e 74 20 6e 53 70 69 6c 6c 3b 0a 0a 20    int nSpill;.. 
36b10 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
36b20 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
36b30 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c           flags |
36b40 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44  = (SQLITE_OPEN_D
36b50 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c  ELETEONCLOSE|SQL
36b60 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f  ITE_OPEN_TEMP_JO
36b70 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 20 20  URNAL);.        
36b80 20 20 6e 53 70 69 6c 6c 20 3d 20 73 71 6c 69 74    nSpill = sqlit
36b90 65 33 43 6f 6e 66 69 67 2e 6e 53 74 6d 74 53 70  e3Config.nStmtSp
36ba0 69 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ill;.        }el
36bb0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c  se{.          fl
36bc0 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50  ags |= SQLITE_OP
36bd0 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b  EN_MAIN_JOURNAL;
36be0 0a 20 20 20 20 20 20 20 20 20 20 6e 53 70 69 6c  .          nSpil
36bf0 6c 20 3d 20 6a 72 6e 6c 42 75 66 66 65 72 53 69  l = jrnlBufferSi
36c00 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ze(pPager);.    
36c10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
36c20 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 65 72 69  .        /* Veri
36c30 66 79 20 74 68 61 74 20 74 68 65 20 64 61 74 61  fy that the data
36c40 62 61 73 65 20 73 74 69 6c 6c 20 68 61 73 20 74  base still has t
36c50 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20  he same name as 
36c60 69 74 20 64 69 64 20 77 68 65 6e 0a 20 20 20 20  it did when.    
36c70 20 20 20 20 2a 2a 20 69 74 20 77 61 73 20 6f 72      ** it was or
36c80 69 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65 64 2e  iginally opened.
36c90 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
36ca0 20 64 61 74 61 62 61 73 65 49 73 55 6e 6d 6f 76   databaseIsUnmov
36cb0 65 64 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ed(pPager);.    
36cc0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
36cd0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
36ce0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a     rc = sqlite3J
36cf0 6f 75 72 6e 61 6c 4f 70 65 6e 20 28 0a 20 20 20  ournalOpen (.   
36d00 20 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2c             pVfs,
36d10 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
36d20 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
36d30 66 6c 61 67 73 2c 20 6e 53 70 69 6c 6c 0a 20 20  flags, nSpill.  
36d40 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
36d50 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
36d60 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
36d70 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70  QLITE_OK || isOp
36d80 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
36d90 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 0a 20  );.    }.  .  . 
36da0 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
36db0 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
36dc0 61 64 65 72 20 74 6f 20 74 68 65 20 6a 6f 75 72  ader to the jour
36dd0 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 6f 70 65  nal file and ope
36de0 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75  n .    ** the su
36df0 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63  b-journal if nec
36e00 65 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a 20  essary..    */. 
36e10 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
36e20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  E_OK ){.      /*
36e30 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 69 66 20   TODO: Check if 
36e40 61 6c 6c 20 6f 66 20 74 68 65 73 65 20 61 72 65  all of these are
36e50 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64   really required
36e60 2e 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65  . */.      pPage
36e70 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20  r->nRec = 0;.   
36e80 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
36e90 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20  alOff = 0;.     
36ea0 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
36eb0 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  er = 0;.      pP
36ec0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
36ed0 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
36ee0 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
36ef0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
36f00 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53    }..  if( rc!=S
36f10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
36f20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
36f30 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e  troy(pPager->pIn
36f40 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50  Journal);.    pP
36f50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
36f60 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
36f70 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
36f80 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
36f90 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29  _WRITER_LOCKED )
36fa0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53  ;.    pPager->eS
36fb0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49  tate = PAGER_WRI
36fc0 54 45 52 5f 43 41 43 48 45 4d 4f 44 3b 0a 20 20  TER_CACHEMOD;.  
36fd0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
36fe0 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61  }../*.** Begin a
36ff0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
37000 6f 6e 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  on on the specif
37010 69 65 64 20 70 61 67 65 72 20 6f 62 6a 65 63 74  ied pager object
37020 2e 20 49 66 20 61 20 0a 2a 2a 20 77 72 69 74 65  . If a .** write
37030 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73  -transaction has
37040 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70   already been op
37050 65 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  ened, this funct
37060 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
37070 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 46  **.** If the exF
37080 6c 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20  lag argument is 
37090 30 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20  0, then acquire 
370a0 61 74 20 6c 65 61 73 74 20 61 20 52 45 53 45 52  at least a RESER
370b0 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74  VED.** lock on t
370c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
370d0 2e 20 49 66 20 65 78 46 6c 61 67 20 69 73 20 3e  . If exFlag is >
370e0 30 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20  0, then acquire 
370f0 61 74 20 6c 65 61 73 74 0a 2a 2a 20 61 6e 20 45  at least.** an E
37100 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49  XCLUSIVE lock. I
37110 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
37120 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6e   already held, n
37130 6f 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 66 75  o locking .** fu
37140 6e 63 74 69 6f 6e 73 20 6e 65 65 64 20 62 65 20  nctions need be 
37150 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  called..**.** If
37160 20 28 65 78 46 6c 61 67 3c 30 29 20 61 6e 64 20   (exFlag<0) and 
37170 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
37180 69 6e 20 57 41 4c 20 6d 6f 64 65 2c 20 64 6f 20  in WAL mode, do 
37190 6e 6f 74 20 74 61 6b 65 20 61 6e 79 20 6c 6f 63  not take any loc
371a0 6b 73 2e 0a 2a 2a 20 54 68 65 20 74 72 61 6e 73  ks..** The trans
371b0 61 63 74 69 6f 6e 20 77 69 6c 6c 20 72 75 6e 20  action will run 
371c0 69 6e 20 43 4f 4e 43 55 52 52 45 4e 54 20 6d 6f  in CONCURRENT mo
371d0 64 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  de instead..**.*
371e0 2a 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d  * If the subjInM
371f0 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69  emory argument i
37200 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
37210 20 61 6e 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   any sub-journal
37220 20 6f 70 65 6e 65 64 0a 2a 2a 20 77 69 74 68 69   opened.** withi
37230 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  n this transacti
37240 6f 6e 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65  on will be opene
37250 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  d as an in-memor
37260 79 20 66 69 6c 65 2e 20 54 68 69 73 0a 2a 2a 20  y file. This.** 
37270 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20 69 66  has no effect if
37280 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
37290 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
372a0 65 64 20 28 61 73 20 69 74 20 6d 61 79 20 62 65  ed (as it may be
372b0 20 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e 69 6e 67   when.** running
372c0 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
372d0 64 65 29 20 6f 72 20 69 66 20 74 68 65 20 74 72  de) or if the tr
372e0 61 6e 73 61 63 74 69 6f 6e 20 64 6f 65 73 20 6e  ansaction does n
372f0 6f 74 20 72 65 71 75 69 72 65 20 61 0a 2a 2a 20  ot require a.** 
37300 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49 66 20  sub-journal. If 
37310 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  the subjInMemory
37320 20 61 72 67 75 6d 65 6e 74 20 69 73 20 7a 65 72   argument is zer
37330 6f 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71 75  o, then any requ
37340 69 72 65 64 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72  ired.** sub-jour
37350 6e 61 6c 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  nal is implement
37360 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 66 20  ed in-memory if 
37370 70 50 61 67 65 72 20 69 73 20 61 6e 20 69 6e 2d  pPager is an in-
37380 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
37390 20 0a 2a 2a 20 6f 72 20 75 73 69 6e 67 20 61 20   .** or using a 
373a0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6f  temporary file o
373b0 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74  therwise..*/.int
373c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67   sqlite3PagerBeg
373d0 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  in(Pager *pPager
373e0 2c 20 69 6e 74 20 65 78 46 6c 61 67 2c 20 69 6e  , int exFlag, in
373f0 74 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29 7b  t subjInMemory){
37400 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
37410 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 50  TE_OK;..  if( pP
37420 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 20  ager->errCode ) 
37430 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
37440 72 72 43 6f 64 65 3b 0a 20 20 61 73 73 65 72 74  rrCode;.  assert
37450 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
37460 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 26  >=PAGER_READER &
37470 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  & pPager->eState
37480 3c 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a  <PAGER_ERROR );.
37490 20 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e    pPager->subjIn
374a0 4d 65 6d 6f 72 79 20 3d 20 28 75 38 29 73 75 62  Memory = (u8)sub
374b0 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 0a 20 20 69 66  jInMemory;..  if
374c0 28 20 41 4c 57 41 59 53 28 70 50 61 67 65 72 2d  ( ALWAYS(pPager-
374d0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
374e0 45 41 44 45 52 29 20 29 7b 0a 20 20 20 20 61 73  EADER) ){.    as
374f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
37500 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
37510 20 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57     if( pagerUseW
37520 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
37530 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61      /* If the pa
37540 67 65 72 20 69 73 20 63 6f 6e 66 69 67 75 72 65  ger is configure
37550 64 20 74 6f 20 75 73 65 20 6c 6f 63 6b 69 6e 67  d to use locking
37560 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 2c  _mode=exclusive,
37570 20 61 6e 64 20 61 6e 0a 20 20 20 20 20 20 2a 2a   and an.      **
37580 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
37590 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
375a0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 68  is not already h
375b0 65 6c 64 2c 20 6f 62 74 61 69 6e 20 69 74 20 6e  eld, obtain it n
375c0 6f 77 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ow..      */.   
375d0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
375e0 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20  xclusiveMode && 
375f0 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73  sqlite3WalExclus
37600 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e  iveMode(pPager->
37610 70 57 61 6c 2c 20 2d 31 29 20 29 7b 0a 20 20 20  pWal, -1) ){.   
37620 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c       rc = pagerL
37630 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 45 58  ockDb(pPager, EX
37640 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
37650 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
37660 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
37670 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
37680 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
37690 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33     (void)sqlite3
376a0 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65  WalExclusiveMode
376b0 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 31  (pPager->pWal, 1
376c0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
376d0 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20 77 72    /* Grab the wr
376e0 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
376f0 6c 6f 67 20 66 69 6c 65 2e 20 49 66 20 73 75 63  log file. If suc
37700 63 65 73 73 66 75 6c 2c 20 75 70 67 72 61 64 65  cessful, upgrade
37710 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 50 41 47   to.      ** PAG
37720 45 52 5f 52 45 53 45 52 56 45 44 20 73 74 61 74  ER_RESERVED stat
37730 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  e. Otherwise, re
37740 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
37750 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  de to the caller
37760 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 62  ..      ** The b
37770 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 73 20 6e  usy-handler is n
37780 6f 74 20 69 6e 76 6f 6b 65 64 20 69 66 20 61 6e  ot invoked if an
37790 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
377a0 20 61 6c 72 65 61 64 79 0a 20 20 20 20 20 20 2a   already.      *
377b0 2a 20 68 6f 6c 64 73 20 74 68 65 20 77 72 69 74  * holds the writ
377c0 65 2d 6c 6f 63 6b 2e 20 49 66 20 70 6f 73 73 69  e-lock. If possi
377d0 62 6c 65 2c 20 74 68 65 20 75 70 70 65 72 20 6c  ble, the upper l
377e0 61 79 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 69  ayer will call i
377f0 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  t.  */.      if(
37800 20 65 78 46 6c 61 67 3e 3d 30 20 29 7b 0a 20 20   exFlag>=0 ){.  
37810 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
37820 65 33 57 61 6c 42 65 67 69 6e 57 72 69 74 65 54  e3WalBeginWriteT
37830 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
37840 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 20 20  r->pWal);.      
37850 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
37860 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20 52     /* Obtain a R
37870 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
37880 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
37890 65 2e 20 49 66 20 74 68 65 20 65 78 46 6c 61 67  e. If the exFlag
378a0 20 70 61 72 61 6d 65 74 65 72 0a 20 20 20 20 20   parameter.     
378b0 20 2a 2a 20 69 73 20 74 72 75 65 2c 20 74 68 65   ** is true, the
378c0 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 75 70  n immediately up
378d0 67 72 61 64 65 20 74 68 69 73 20 74 6f 20 61 6e  grade this to an
378e0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
378f0 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 62 75   The.      ** bu
37900 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62  sy-handler callb
37910 61 63 6b 20 63 61 6e 20 62 65 20 75 73 65 64 20  ack can be used 
37920 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 74  when upgrading t
37930 6f 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 0a  o the EXCLUSIVE.
37940 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20 62        ** lock, b
37950 75 74 20 6e 6f 74 20 77 68 65 6e 20 6f 62 74 61  ut not when obta
37960 69 6e 69 6e 67 20 74 68 65 20 52 45 53 45 52 56  ining the RESERV
37970 45 44 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 2a  ED lock..      *
37980 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  /.      rc = pag
37990 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  erLockDb(pPager,
379a0 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b   RESERVED_LOCK);
379b0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
379c0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 46 6c  QLITE_OK && exFl
379d0 61 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ag>0 ){.        
379e0 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
379f0 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
37a00 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
37a10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
37a20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
37a30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
37a40 2a 20 43 68 61 6e 67 65 20 74 6f 20 57 52 49 54  * Change to WRIT
37a50 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65 2e  ER_LOCKED state.
37a60 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
37a70 2a 2a 20 57 41 4c 20 6d 6f 64 65 20 73 65 74 73  ** WAL mode sets
37a80 20 50 61 67 65 72 2e 65 53 74 61 74 65 20 74 6f   Pager.eState to
37a90 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f   PAGER_WRITER_LO
37aa0 43 4b 45 44 20 6f 72 20 43 41 43 48 45 4d 4f 44  CKED or CACHEMOD
37ab0 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 69  .      ** when i
37ac0 74 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 74 72  t has an open tr
37ad0 61 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74 20 6e  ansaction, but n
37ae0 65 76 65 72 20 74 6f 20 44 42 4d 4f 44 20 6f 72  ever to DBMOD or
37af0 20 46 49 4e 49 53 48 45 44 2e 0a 20 20 20 20 20   FINISHED..     
37b00 20 2a 2a 20 54 68 69 73 20 69 73 20 62 65 63 61   ** This is beca
37b10 75 73 65 20 69 6e 20 74 68 6f 73 65 20 73 74 61  use in those sta
37b20 74 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20  tes the code to 
37b30 72 6f 6c 6c 20 62 61 63 6b 20 73 61 76 65 70 6f  roll back savepo
37b40 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74 72  int .      ** tr
37b50 61 6e 73 61 63 74 69 6f 6e 73 20 6d 61 79 20 63  ansactions may c
37b60 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 74 68  opy data from th
37b70 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 6e  e sub-journal in
37b80 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
37b90 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 61  .      ** file a
37ba0 73 20 77 65 6c 6c 20 61 73 20 69 6e 74 6f 20 74  s well as into t
37bb0 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 57  he page cache. W
37bc0 68 69 63 68 20 77 6f 75 6c 64 20 62 65 20 69 6e  hich would be in
37bd0 63 6f 72 72 65 63 74 20 69 6e 20 0a 20 20 20 20  correct in .    
37be0 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 2e 0a 20    ** WAL mode.. 
37bf0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 50       */.      pP
37c00 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
37c10 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
37c20 45 44 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  ED;.      pPager
37c30 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d 20 70  ->dbHintSize = p
37c40 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
37c50 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46       pPager->dbF
37c60 69 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72  ileSize = pPager
37c70 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20  ->dbSize;.      
37c80 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
37c90 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
37ca0 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ize;.      pPage
37cb0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
37cc0 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73  0;.    }..    as
37cd0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
37ce0 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  _OK || pPager->e
37cf0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
37d00 44 45 52 20 29 3b 0a 20 20 20 20 61 73 73 65 72  DER );.    asser
37d10 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
37d20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
37d30 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
37d40 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 61  _LOCKED );.    a
37d50 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
37d60 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
37d70 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45  ) );.  }..  PAGE
37d80 52 54 52 41 43 45 28 28 22 54 52 41 4e 53 41 43  RTRACE(("TRANSAC
37d90 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45  TION %d\n", PAGE
37da0 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
37db0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
37dc0 2a 0a 2a 2a 20 57 72 69 74 65 20 70 61 67 65 20  *.** Write page 
37dd0 70 50 67 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  pPg onto the end
37de0 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   of the rollback
37df0 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61   journal..*/.sta
37e00 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
37e10 49 4e 45 20 69 6e 74 20 70 61 67 65 72 41 64 64  INE int pagerAdd
37e20 50 61 67 65 54 6f 52 6f 6c 6c 62 61 63 6b 4a 6f  PageToRollbackJo
37e30 75 72 6e 61 6c 28 50 67 48 64 72 20 2a 70 50 67  urnal(PgHdr *pPg
37e40 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
37e50 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
37e60 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33  ;.  int rc;.  u3
37e70 32 20 63 6b 73 75 6d 3b 0a 20 20 63 68 61 72 20  2 cksum;.  char 
37e80 2a 70 44 61 74 61 32 3b 0a 20 20 69 36 34 20 69  *pData2;.  i64 i
37e90 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Off = pPager->jo
37ea0 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20  urnalOff;..  /* 
37eb0 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  We should never 
37ec0 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75  write to the jou
37ed0 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61  rnal file the pa
37ee0 67 65 20 74 68 61 74 0a 20 20 2a 2a 20 63 6f 6e  ge that.  ** con
37ef0 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 62 61  tains the databa
37f00 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66  se locks.  The f
37f10 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20  ollowing assert 
37f20 76 65 72 69 66 69 65 73 0a 20 20 2a 2a 20 74 68  verifies.  ** th
37f30 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f  at we do not. */
37f40 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
37f50 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno!=PAGER_MJ_P
37f60 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  GNO(pPager) );..
37f70 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
37f80 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 3c 3d 70 50  ->journalHdr<=pP
37f90 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
37fa0 20 29 3b 0a 20 20 43 4f 44 45 43 32 28 70 50 61   );.  CODEC2(pPa
37fb0 67 65 72 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c  ger, pPg->pData,
37fc0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72   pPg->pgno, 7, r
37fd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
37fe0 45 4d 5f 42 4b 50 54 2c 20 70 44 61 74 61 32 29  EM_BKPT, pData2)
37ff0 3b 0a 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65  ;.  cksum = page
38000 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20  r_cksum(pPager, 
38010 28 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 0a 20  (u8*)pData2);.. 
38020 20 2f 2a 20 45 76 65 6e 20 69 66 20 61 6e 20 49   /* Even if an I
38030 4f 20 6f 72 20 64 69 73 6b 66 75 6c 6c 20 65 72  O or diskfull er
38040 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
38050 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 74 68 65   journalling the
38060 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68  .  ** page in th
38070 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65 2c 20 73  e block above, s
38080 65 74 20 74 68 65 20 6e 65 65 64 2d 73 79 6e 63  et the need-sync
38090 20 66 6c 61 67 20 66 6f 72 20 74 68 65 20 70 61   flag for the pa
380a0 67 65 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69  ge..  ** Otherwi
380b0 73 65 2c 20 77 68 65 6e 20 74 68 65 20 74 72 61  se, when the tra
380c0 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
380d0 65 64 20 62 61 63 6b 2c 20 74 68 65 20 6c 6f 67  ed back, the log
380e0 69 63 20 69 6e 0a 20 20 2a 2a 20 70 6c 61 79 62  ic in.  ** playb
380f0 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 77  ack_one_page() w
38100 69 6c 6c 20 74 68 69 6e 6b 20 74 68 61 74 20 74  ill think that t
38110 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f  he page needs to
38120 20 62 65 20 72 65 73 74 6f 72 65 64 0a 20 20 2a   be restored.  *
38130 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  * in the databas
38140 65 20 66 69 6c 65 2e 20 41 6e 64 20 69 66 20 61  e file. And if a
38150 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
38160 73 20 77 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f  s while doing so
38170 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63 6f 72 72  ,.  ** then corr
38180 75 70 74 69 6f 6e 20 6d 61 79 20 66 6f 6c 6c 6f  uption may follo
38190 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 66  w..  */.  pPg->f
381a0 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45  lags |= PGHDR_NE
381b0 45 44 5f 53 59 4e 43 3b 0a 0a 20 20 72 63 20 3d  ED_SYNC;..  rc =
381c0 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
381d0 67 65 72 2d 3e 6a 66 64 2c 20 69 4f 66 66 2c 20  ger->jfd, iOff, 
381e0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 69 66  pPg->pgno);.  if
381f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
38200 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
38210 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
38220 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
38230 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e  pData2, pPager->
38240 70 61 67 65 53 69 7a 65 2c 20 69 4f 66 66 2b 34  pageSize, iOff+4
38250 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
38260 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
38270 72 63 3b 0a 20 20 72 63 20 3d 20 77 72 69 74 65  rc;.  rc = write
38280 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
38290 66 64 2c 20 69 4f 66 66 2b 70 50 61 67 65 72 2d  fd, iOff+pPager-
382a0 3e 70 61 67 65 53 69 7a 65 2b 34 2c 20 63 6b 73  >pageSize+4, cks
382b0 75 6d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  um);.  if( rc!=S
382c0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
382d0 6e 20 72 63 3b 0a 0a 20 20 49 4f 54 52 41 43 45  n rc;..  IOTRACE
382e0 28 28 22 4a 4f 55 54 20 25 70 20 25 64 20 25 6c  (("JOUT %p %d %l
382f0 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  ld %d\n", pPager
38300 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20  , pPg->pgno, .  
38310 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
38320 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50 61  >journalOff, pPa
38330 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 29 3b  ger->pageSize));
38340 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71  .  PAGER_INCR(sq
38350 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
38360 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47  ej_count);.  PAG
38370 45 52 54 52 41 43 45 28 28 22 4a 4f 55 52 4e 41  ERTRACE(("JOURNA
38380 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65  L %d page %d nee
38390 64 53 79 6e 63 3d 25 64 20 68 61 73 68 28 25 30  dSync=%d hash(%0
383a0 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 50  8x)\n",.       P
383b0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
383c0 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20  pPg->pgno, .    
383d0 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26     ((pPg->flags&
383e0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
383f0 3f 31 3a 30 29 2c 20 70 61 67 65 72 5f 70 61 67  ?1:0), pager_pag
38400 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20  ehash(pPg)));.. 
38410 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
38420 4f 66 66 20 2b 3d 20 38 20 2b 20 70 50 61 67 65  Off += 8 + pPage
38430 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 70  r->pageSize;.  p
38440 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20  Pager->nRec++;. 
38450 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
38460 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29  >pInJournal!=0 )
38470 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
38480 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72  BitvecSet(pPager
38490 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50  ->pInJournal, pP
384a0 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 74 65 73 74  g->pgno);.  test
384b0 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  case( rc==SQLITE
384c0 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 61 73 73 65  _NOMEM );.  asse
384d0 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
384e0 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  K || rc==SQLITE_
384f0 4e 4f 4d 45 4d 20 29 3b 0a 20 20 72 63 20 7c 3d  NOMEM );.  rc |=
38500 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42   addToSavepointB
38510 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70  itvecs(pPager, p
38520 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 61 73 73  Pg->pgno);.  ass
38530 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
38540 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  OK || rc==SQLITE
38550 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 72 65 74 75  _NOMEM );.  retu
38560 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
38570 4d 61 72 6b 20 61 20 73 69 6e 67 6c 65 20 64 61  Mark a single da
38580 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74 65  ta page as write
38590 61 62 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69  able. The page i
385a0 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
385b0 68 65 20 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75 72  he .** main jour
385c0 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e  nal or sub-journ
385d0 61 6c 20 61 73 20 72 65 71 75 69 72 65 64 2e 20  al as required. 
385e0 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 77  If the page is w
385f0 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 6f  ritten into.** o
38600 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ne of the journa
38610 6c 73 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f  ls, the correspo
38620 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73 65 74  nding bit is set
38630 20 69 6e 20 74 68 65 20 0a 2a 2a 20 50 61 67 65   in the .** Page
38640 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74  r.pInJournal bit
38650 76 65 63 20 61 6e 64 20 74 68 65 20 50 61 67 65  vec and the Page
38660 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61  rSavepoint.pInSa
38670 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73 0a  vepoint bitvecs.
38680 2a 2a 20 6f 66 20 61 6e 79 20 6f 70 65 6e 20 73  ** of any open s
38690 61 76 65 70 6f 69 6e 74 73 20 61 73 20 61 70 70  avepoints as app
386a0 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61  ropriate..*/.sta
386b0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72  tic int pager_wr
386c0 69 74 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ite(PgHdr *pPg){
386d0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
386e0 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
386f0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
38700 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  E_OK;..  /* This
38710 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74 20   routine is not 
38720 63 61 6