/ Hex Artifact Content
Login

Artifact 694caffb16891a96608193968d7c9a8fa9a71240:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 63 6f 6e  rticular the con
0d50: 74 65 6e 74 20 6f 66 20 66 72 65 65 6c 69 73 74  tent of freelist
0d60: 20 6c 65 61 66 0a 2a 2a 20 70 61 67 65 73 20 63   leaf.** pages c
0d70: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 72  an be changed ar
0d80: 62 69 74 72 61 72 69 6c 79 20 77 69 74 68 6f 75  bitrarily withou
0d90: 74 20 61 66 66 65 63 74 69 6e 67 20 74 68 65 20  t affecting the 
0da0: 6c 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65  logical equivale
0db0: 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  nce.** of the da
0dc0: 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28  tabase..** .** (
0dd0: 37 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20  7) At any time, 
0de0: 69 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69  if any subset, i
0df0: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70  ncluding the emp
0e00: 74 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74  ty set and the t
0e10: 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20  otal set,.**    
0e20: 20 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64   of the unsynced
0e30: 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f   changes to a ro
0e40: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
0e50: 72 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74  re removed and t
0e60: 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  he .**     journ
0e70: 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  al is rolled bac
0e80: 6b 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  k, the resulting
0e90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
0ea0: 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 6c 79  ill be logically
0eb0: 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c 65  .**     equivale
0ec0: 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  nt to the databa
0ed0: 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 62  se file at the b
0ee0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0ef0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
0f00: 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20 74  .** (8) When a t
0f10: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
0f20: 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 78  lled back, the x
0f30: 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64 20  Truncate method 
0f40: 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20 20  of the VFS.**   
0f50: 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72    is called to r
0f60: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
0f70: 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  ase file to the 
0f80: 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61 73  same size it was
0f90: 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20 62   at.**     the b
0fa0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0fb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49  transaction.  (I
0fc0: 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74 68  n some VFSes, th
0fd0: 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20  e xTruncate.**  
0fe0: 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20 6e     method is a n
0ff0: 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20 64  o-op, but that d
1000: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74  oes not change t
1010: 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c 69  he fact the SQLi
1020: 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69  te will.**     i
1030: 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a  nvoke it.).** .*
1040: 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20 74  * (9) Whenever t
1050: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1060: 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61 74   is modified, at
1070: 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20 69   least one bit i
1080: 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20  n the range.**  
1090: 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f 6d     of bytes from
10a0: 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 69   24 through 39 i
10b0: 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62 65  nclusive will be
10c0: 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
10d0: 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20  o releasing.**  
10e0: 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56 45     the EXCLUSIVE
10f0: 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67 6e   lock, thus sign
1100: 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e  aling other conn
1110: 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73  ections on the s
1120: 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61 62  ame.**     datab
1130: 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68 65  ase to flush the
1140: 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a  ir caches..**.**
1150: 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65 72   (10) The patter
1160: 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79 74  n of bits in byt
1170: 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33 39  es 24 through 39
1180: 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61   shall not repea
1190: 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20  t in less.**    
11a0: 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69    than one billi
11b0: 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  on transactions.
11c0: 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64 61  .**.** (11) A da
11d0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 77  tabase file is w
11e0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74 68  ell-formed at th
11f0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20  e beginning and 
1200: 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
1210: 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76 65  n.**      of eve
1220: 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ry transaction..
1230: 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45 58  **.** (12) An EX
1240: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
1250: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1260: 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 77  base file when w
1270: 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20  riting to.**    
1280: 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66    the database f
1290: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20  ile..**.** (13) 
12a0: 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73  A SHARED lock is
12b0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
12c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c 65  abase file while
12d0: 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20   reading any.** 
12e0: 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74       content out
12f0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1300: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   file..**.******
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
1360: 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f 75   Macros for trou
1370: 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f  bleshooting.  No
1380: 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66  rmally turned of
1390: 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73  f.*/.#if 0.int s
13a0: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
13b0: 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =1;  /* True to 
13c0: 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a  enable tracing *
13d0: 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65  /.#define sqlite
13e0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72 69  3DebugPrintf pri
13f0: 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47 45  ntf.#define PAGE
1400: 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69 66  RTRACE(X)     if
1410: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  ( sqlite3PagerTr
1420: 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44 65  ace ){ sqlite3De
1430: 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23  bugPrintf X; }.#
1440: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47  else.#define PAG
1450: 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  ERTRACE(X).#endi
1460: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
1470: 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f  lowing two macro
1480: 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69  s are used withi
1490: 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43 45  n the PAGERTRACE
14a0: 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a  () macros above.
14b0: 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ** to print out 
14c0: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
14d0: 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44  . .**.** PAGERID
14e0: 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  () takes a point
14f0: 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73 74  er to a Pager st
1500: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1510: 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73  ment. The.** ass
1520: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65 73  ociated file-des
1530: 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75 72  criptor is retur
1540: 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49  ned. FILEHANDLEI
1550: 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71 6c  D() takes an sql
1560: 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72  ite3_file.** str
1570: 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75 6d  uct as its argum
1580: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
1590: 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e 74  PAGERID(p) ((int
15a0: 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e  )(p->fd)).#defin
15b0: 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66  e FILEHANDLEID(f
15c0: 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a  d) ((int)fd)../*
15d0: 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 65 53  .** The Pager.eS
15e0: 74 61 74 65 20 76 61 72 69 61 62 6c 65 20 73 74  tate variable st
15f0: 6f 72 65 73 20 74 68 65 20 63 75 72 72 65 6e 74  ores the current
1600: 20 27 73 74 61 74 65 27 20 6f 66 20 61 20 70 61   'state' of a pa
1610: 67 65 72 2e 20 41 0a 2a 2a 20 70 61 67 65 72 20  ger. A.** pager 
1620: 6d 61 79 20 62 65 20 69 6e 20 61 6e 79 20 6f 6e  may be in any on
1630: 65 20 6f 66 20 74 68 65 20 73 65 76 65 6e 20 73  e of the seven s
1640: 74 61 74 65 73 20 73 68 6f 77 6e 20 69 6e 20 74  tates shown in t
1650: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
1660: 73 74 61 74 65 20 64 69 61 67 72 61 6d 2e 0a 2a  state diagram..*
1670: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  *.**            
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 4f 50 45 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d  OPEN <------+---
16a0: 2d 2d 2d 2b 0a 2a 2a 20 20 20 20 20 20 20 20 20  ---+.**         
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c       |         |
16d0: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
1700: 20 20 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20    |      |.**   
1710: 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d              +---
1720: 2d 2d 2d 2d 2d 2d 3e 20 52 45 41 44 45 52 2d 2d  ------> READER--
1730: 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a 2a  -----+      |.**
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1770: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1780: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1790: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
17a0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
17b0: 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52       |<-------WR
17c0: 49 54 45 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d 2d  ITER_LOCKED-----
17d0: 2d 3e 20 45 52 52 4f 52 0a 2a 2a 20 20 20 20 20  -> ERROR.**     
17e0: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
17f0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1800: 20 20 20 20 20 20 20 20 20 20 5e 20 20 0a 2a 2a            ^  .**
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20                V 
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1840: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1850: 20 20 7c 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52    |<------WRITER
1860: 5f 43 41 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d 2d  _CACHEMOD-------
1870: 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ->|.**          
1880: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
1890: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20      |           
18a0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
18b0: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
18c0: 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20 20         V        
18d0: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
18e0: 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d             |<---
18f0: 2d 2d 2d 2d 57 52 49 54 45 52 5f 44 42 4d 4f 44  ----WRITER_DBMOD
1900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a 20  ---------->|.** 
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
1940: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1950: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   |              
1960: 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  V               
1970: 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
1980: 20 20 20 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49 54      +<------WRIT
1990: 45 52 5f 46 49 4e 49 53 48 45 44 2d 2d 2d 2d 2d  ER_FINISHED-----
19a0: 2d 2d 2d 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c  --->+.**.**.** L
19b0: 69 73 74 20 6f 66 20 73 74 61 74 65 20 74 72 61  ist of state tra
19c0: 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
19d0: 20 43 20 5b 66 75 6e 63 74 69 6f 6e 5d 20 74 68   C [function] th
19e0: 61 74 20 70 65 72 66 6f 72 6d 73 20 65 61 63 68  at performs each
19f0: 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e 20  :.** .**   OPEN 
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e 20               -> 
1a10: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
1a20: 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67 65      [sqlite3Page
1a30: 72 53 68 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a 20  rSharedLock].** 
1a40: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a50: 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20      -> OPEN     
1a60: 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67 65             [page
1a70: 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a 20  r_unlock].**.** 
1a80: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a90: 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 4c 4f      -> WRITER_LO
1aa0: 43 4b 45 44 20 20 20 20 20 20 20 5b 73 71 6c 69  CKED       [sqli
1ab0: 74 65 33 50 61 67 65 72 42 65 67 69 6e 5d 0a 2a  te3PagerBegin].*
1ac0: 2a 20 20 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  *   WRITER_LOCKE
1ad0: 44 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f  D     -> WRITER_
1ae0: 43 41 43 48 45 4d 4f 44 20 20 20 20 20 5b 70 61  CACHEMOD     [pa
1af0: 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
1b00: 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 43 41  ].**   WRITER_CA
1b10: 43 48 45 4d 4f 44 20 20 20 2d 3e 20 57 52 49 54  CHEMOD   -> WRIT
1b20: 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 20 20  ER_DBMOD        
1b30: 5b 73 79 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a 2a  [syncJournal].**
1b40: 20 20 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20     WRITER_DBMOD 
1b50: 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 46       -> WRITER_F
1b60: 49 4e 49 53 48 45 44 20 20 20 20 20 5b 73 71 6c  INISHED     [sql
1b70: 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
1b80: 68 61 73 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57 52  haseOne].**   WR
1b90: 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20 20 20 20  ITER_***        
1ba0: 2d 3e 20 52 45 41 44 45 52 20 20 20 20 20 20 20  -> READER       
1bb0: 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 65 6e         [pager_en
1bc0: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 5d 0a 2a  d_transaction].*
1bd0: 2a 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a 2a  *.**   WRITER_**
1be0: 2a 20 20 20 20 20 20 20 20 2d 3e 20 45 52 52 4f  *        -> ERRO
1bf0: 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R               
1c00: 5b 70 61 67 65 72 5f 65 72 72 6f 72 5d 0a 2a 2a  [pager_error].**
1c10: 20 20 20 45 52 52 4f 52 20 20 20 20 20 20 20 20     ERROR        
1c20: 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20       -> OPEN    
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67              [pag
1c40: 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a 2a  er_unlock].** .*
1c50: 2a 0a 2a 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a 2a  *.**  OPEN:.**.*
1c60: 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20 73  *    The pager s
1c70: 74 61 72 74 73 20 75 70 20 69 6e 20 74 68 69 73  tarts up in this
1c80: 20 73 74 61 74 65 2e 20 4e 6f 74 68 69 6e 67 20   state. Nothing 
1c90: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 69 6e  is guaranteed in
1ca0: 20 74 68 69 73 0a 2a 2a 20 20 20 20 73 74 61 74   this.**    stat
1cb0: 65 20 2d 20 74 68 65 20 66 69 6c 65 20 6d 61 79  e - the file may
1cc0: 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6c   or may not be l
1cd0: 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 64 61  ocked and the da
1ce0: 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 0a 2a  tabase size is.*
1cf0: 2a 20 20 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54 68  *    unknown. Th
1d00: 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 6e  e database may n
1d10: 6f 74 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  ot be read or wr
1d20: 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  itten..**.**    
1d30: 2a 20 4e 6f 20 72 65 61 64 20 6f 72 20 77 72 69  * No read or wri
1d40: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
1d50: 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20  s active..**    
1d60: 2a 20 41 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20 6e  * Any lock, or n
1d70: 6f 20 6c 6f 63 6b 20 61 74 20 61 6c 6c 2c 20 6d  o lock at all, m
1d80: 61 79 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68  ay be held on th
1d90: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1da0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62 53  .**    * The dbS
1db0: 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 20  ize, dbOrigSize 
1dc0: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76  and dbFileSize v
1dd0: 61 72 69 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74  ariables may not
1de0: 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2a 0a   be trusted..**.
1df0: 2a 2a 20 20 52 45 41 44 45 52 3a 0a 2a 2a 0a 2a  **  READER:.**.*
1e00: 2a 20 20 20 20 49 6e 20 74 68 69 73 20 73 74 61  *    In this sta
1e10: 74 65 20 61 6c 6c 20 74 68 65 20 72 65 71 75 69  te all the requi
1e20: 72 65 6d 65 6e 74 73 20 66 6f 72 20 72 65 61 64  rements for read
1e30: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1e40: 20 69 6e 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c 62   in .**    rollb
1e50: 61 63 6b 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d 6f  ack (non-WAL) mo
1e60: 64 65 20 61 72 65 20 6d 65 74 2e 20 55 6e 6c 65  de are met. Unle
1e70: 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ss the pager is 
1e80: 28 6f 72 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20  (or recently.** 
1e90: 20 20 20 77 61 73 29 20 69 6e 20 65 78 63 6c 75     was) in exclu
1ea0: 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64  sive-locking mod
1eb0: 65 2c 20 61 20 75 73 65 72 2d 6c 65 76 65 6c 20  e, a user-level 
1ec0: 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
1ed0: 20 69 73 20 0a 2a 2a 20 20 20 20 6f 70 65 6e 2e   is .**    open.
1ee0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69   The database si
1ef0: 7a 65 20 69 73 20 6b 6e 6f 77 6e 20 69 6e 20 74  ze is known in t
1f00: 68 69 73 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  his state..**.**
1f10: 20 20 20 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e      A connection
1f20: 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f   running with lo
1f30: 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61  cking_mode=norma
1f40: 6c 20 65 6e 74 65 72 73 20 74 68 69 73 20 73 74  l enters this st
1f50: 61 74 65 20 77 68 65 6e 0a 2a 2a 20 20 20 20 69  ate when.**    i
1f60: 74 20 6f 70 65 6e 73 20 61 20 72 65 61 64 2d 74  t opens a read-t
1f70: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
1f80: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72  e database and r
1f90: 65 74 75 72 6e 73 20 74 6f 20 73 74 61 74 65 0a  eturns to state.
1fa0: 2a 2a 20 20 20 20 4f 50 45 4e 20 61 66 74 65 72  **    OPEN after
1fb0: 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61   the read-transa
1fc0: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74  ction is complet
1fd0: 65 64 2e 20 48 6f 77 65 76 65 72 20 61 20 63 6f  ed. However a co
1fe0: 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 72  nnection.**    r
1ff0: 75 6e 6e 69 6e 67 20 69 6e 20 6c 6f 63 6b 69 6e  unning in lockin
2000: 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
2010: 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 65 6d 70   (including temp
2020: 20 64 61 74 61 62 61 73 65 73 29 20 72 65 6d 61   databases) rema
2030: 69 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 74 68 69  ins in.**    thi
2040: 73 20 73 74 61 74 65 20 65 76 65 6e 20 61 66 74  s state even aft
2050: 65 72 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e  er the read-tran
2060: 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65  saction is close
2070: 64 2e 20 54 68 65 20 6f 6e 6c 79 20 77 61 79 0a  d. The only way.
2080: 2a 2a 20 20 20 20 61 20 6c 6f 63 6b 69 6e 67 5f  **    a locking_
2090: 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 63  mode=exclusive c
20a0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 74 72  onnection can tr
20b0: 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 52 45  ansition from RE
20c0: 41 44 45 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a 20  ADER to OPEN.** 
20d0: 20 20 20 69 73 20 76 69 61 20 74 68 65 20 45 52     is via the ER
20e0: 52 4f 52 20 73 74 61 74 65 20 28 73 65 65 20 62  ROR state (see b
20f0: 65 6c 6f 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20 20  elow)..** .**   
2100: 20 2a 20 41 20 72 65 61 64 20 74 72 61 6e 73 61   * A read transa
2110: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63 74  ction may be act
2120: 69 76 65 20 28 62 75 74 20 61 20 77 72 69 74 65  ive (but a write
2130: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  -transaction can
2140: 6e 6f 74 29 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  not)..**    * A 
2150: 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65  SHARED or greate
2160: 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  r lock is held o
2170: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2180: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  ile..**    * The
2190: 20 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65   dbSize variable
21a0: 20 6d 61 79 20 62 65 20 74 72 75 73 74 65 64 20   may be trusted 
21b0: 28 65 76 65 6e 20 69 66 20 61 20 75 73 65 72 2d  (even if a user-
21c0: 6c 65 76 65 6c 20 72 65 61 64 20 0a 2a 2a 20 20  level read .**  
21d0: 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20      transaction 
21e0: 69 73 20 6e 6f 74 20 61 63 74 69 76 65 29 2e 20  is not active). 
21f0: 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20 61  The dbOrigSize a
2200: 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61  nd dbFileSize va
2210: 72 69 61 62 6c 65 73 0a 2a 2a 20 20 20 20 20 20  riables.**      
2220: 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73 74  may not be trust
2230: 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ed at this point
2240: 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65  ..**    * If the
2250: 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20 57   database is a W
2260: 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  AL database, the
2270: 6e 20 74 68 65 20 57 41 4c 20 63 6f 6e 6e 65 63  n the WAL connec
2280: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a 2a  tion is open..**
2290: 20 20 20 20 2a 20 45 76 65 6e 20 69 66 20 61 20      * Even if a 
22a0: 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
22b0: 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 69 74   is not open, it
22c0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
22d0: 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 74 68 65  hat .**      the
22e0: 72 65 20 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f 75  re is no hot-jou
22f0: 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69 6c 65  rnal in the file
2300: 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20  -system..**.**  
2310: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 2a  WRITER_LOCKED:.*
2320: 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65  *.**    The page
2330: 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73 20  r moves to this 
2340: 73 74 61 74 65 20 66 72 6f 6d 20 52 45 41 44 45  state from READE
2350: 52 20 77 68 65 6e 20 61 20 77 72 69 74 65 2d 74  R when a write-t
2360: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20  ransaction.**   
2370: 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64   is first opened
2380: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2390: 2e 20 49 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b  . In WRITER_LOCK
23a0: 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 6c 6f  ED state, all lo
23b0: 63 6b 73 20 0a 2a 2a 20 20 20 20 72 65 71 75 69  cks .**    requi
23c0: 72 65 64 20 74 6f 20 73 74 61 72 74 20 61 20 77  red to start a w
23d0: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
23e0: 20 61 72 65 20 68 65 6c 64 2c 20 62 75 74 20 6e   are held, but n
23f0: 6f 20 61 63 74 75 61 6c 20 0a 2a 2a 20 20 20 20  o actual .**    
2400: 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f  modifications to
2410: 20 74 68 65 20 63 61 63 68 65 20 6f 72 20 64 61   the cache or da
2420: 74 61 62 61 73 65 20 68 61 76 65 20 74 61 6b 65  tabase have take
2430: 6e 20 70 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 20  n place..**.**  
2440: 20 20 49 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f    In rollback mo
2450: 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f  de, a RESERVED o
2460: 72 20 28 69 66 20 74 68 65 20 74 72 61 6e 73 61  r (if the transa
2470: 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
2480: 20 77 69 74 68 20 0a 2a 2a 20 20 20 20 42 45 47   with .**    BEG
2490: 49 4e 20 45 58 43 4c 55 53 49 56 45 29 20 45 58  IN EXCLUSIVE) EX
24a0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
24b0: 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
24c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
24d0: 65 6e 0a 2a 2a 20 20 20 20 6d 6f 76 69 6e 67 20  en.**    moving 
24e0: 74 6f 20 74 68 69 73 20 73 74 61 74 65 2c 20 62  to this state, b
24f0: 75 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ut the journal f
2500: 69 6c 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74  ile is not writt
2510: 65 6e 20 74 6f 20 6f 72 20 6f 70 65 6e 65 64 20  en to or opened 
2520: 0a 2a 2a 20 20 20 20 74 6f 20 69 6e 20 74 68 69  .**    to in thi
2530: 73 20 73 74 61 74 65 2e 20 49 66 20 74 68 65 20  s state. If the 
2540: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
2550: 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
2560: 65 64 20 62 61 63 6b 20 77 68 69 6c 65 20 0a 2a  ed back while .*
2570: 2a 20 20 20 20 69 6e 20 57 52 49 54 45 52 5f 4c  *    in WRITER_L
2580: 4f 43 4b 45 44 20 73 74 61 74 65 2c 20 61 6c 6c  OCKED state, all
2590: 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65   that is require
25a0: 64 20 69 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  d is to unlock t
25b0: 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
25c0: 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20     file..**.**  
25d0: 20 20 49 4e 20 57 41 4c 20 6d 6f 64 65 2c 20 57    IN WAL mode, W
25e0: 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e  alBeginWriteTran
25f0: 73 61 63 74 69 6f 6e 28 29 20 69 73 20 63 61 6c  saction() is cal
2600: 6c 65 64 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20  led to lock the 
2610: 6c 6f 67 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20  log file..**    
2620: 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  If the connectio
2630: 6e 20 69 73 20 72 75 6e 6e 69 6e 67 20 77 69 74  n is running wit
2640: 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  h locking_mode=e
2650: 78 63 6c 75 73 69 76 65 2c 20 61 6e 20 61 74 74  xclusive, an att
2660: 65 6d 70 74 0a 2a 2a 20 20 20 20 69 73 20 6d 61  empt.**    is ma
2670: 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20  de to obtain an 
2680: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
2690: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
26a0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  ile..**.**    * 
26b0: 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  A write transact
26c0: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
26d0: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63 6f  *    * If the co
26e0: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
26f0: 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64   in rollback-mod
2700: 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  e, a RESERVED or
2710: 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 20 20 20   greater .**    
2720: 20 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f    lock is held o
2730: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2740: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20  ile..**    * If 
2750: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
2760: 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 2d 6d 6f  s open in WAL-mo
2770: 64 65 2c 20 61 20 57 41 4c 20 77 72 69 74 65 20  de, a WAL write 
2780: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
2790: 20 20 20 20 69 73 20 6f 70 65 6e 20 28 69 2e 65      is open (i.e
27a0: 2e 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69  . sqlite3WalBegi
27b0: 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
27c0: 6e 28 29 20 68 61 73 20 62 65 65 6e 20 73 75 63  n() has been suc
27d0: 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 20 20 20  cessfully.**    
27e0: 20 20 63 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20 20    called)..**   
27f0: 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20 64   * The dbSize, d
2800: 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62  bOrigSize and db
2810: 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c  FileSize variabl
2820: 65 73 20 61 72 65 20 61 6c 6c 20 76 61 6c 69 64  es are all valid
2830: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63 6f  ..**    * The co
2840: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2850: 67 65 72 20 63 61 63 68 65 20 68 61 76 65 20 6e  ger cache have n
2860: 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ot been modified
2870: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f  ..**    * The jo
2880: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f  urnal file may o
2890: 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65  r may not be ope
28a0: 6e 2e 0a 2a 2a 20 20 20 20 2a 20 4e 6f 74 68 69  n..**    * Nothi
28b0: 6e 67 20 28 6e 6f 74 20 65 76 65 6e 20 74 68 65  ng (not even the
28c0: 20 66 69 72 73 74 20 68 65 61 64 65 72 29 20 68   first header) h
28d0: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
28e0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
28f0: 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 43 41  **.**  WRITER_CA
2900: 43 48 45 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20  CHEMOD:.**.**   
2910: 20 41 20 70 61 67 65 72 20 6d 6f 76 65 73 20 66   A pager moves f
2920: 72 6f 6d 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  rom WRITER_LOCKE
2930: 44 20 73 74 61 74 65 20 74 6f 20 74 68 69 73 20  D state to this 
2940: 73 74 61 74 65 20 77 68 65 6e 20 61 20 70 61 67  state when a pag
2950: 65 20 69 73 0a 2a 2a 20 20 20 20 66 69 72 73 74  e is.**    first
2960: 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68 65   modified by the
2970: 20 75 70 70 65 72 20 6c 61 79 65 72 2e 20 49 6e   upper layer. In
2980: 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74   rollback mode t
2990: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
29a0: 2a 2a 20 20 20 20 69 73 20 6f 70 65 6e 65 64 20  **    is opened 
29b0: 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
29c0: 72 65 61 64 79 20 6f 70 65 6e 29 20 61 6e 64 20  ready open) and 
29d0: 61 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  a header written
29e0: 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 73 74   to the.**    st
29f0: 61 72 74 20 6f 66 20 69 74 2e 20 54 68 65 20 64  art of it. The d
2a00: 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
2a10: 64 69 73 6b 20 68 61 73 20 6e 6f 74 20 62 65 65  disk has not bee
2a20: 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  n modified..**.*
2a30: 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65 20 74  *    * A write t
2a40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
2a50: 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  tive..**    * A 
2a60: 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61  RESERVED or grea
2a70: 74 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ter lock is held
2a80: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2a90: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54   file..**    * T
2aa0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2ab0: 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
2ac0: 66 69 72 73 74 20 68 65 61 64 65 72 20 68 61 73  first header has
2ad0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 0a 2a   been written .*
2ae0: 2a 20 20 20 20 20 20 74 6f 20 69 74 2c 20 62 75  *      to it, bu
2af0: 74 20 74 68 65 20 68 65 61 64 65 72 20 68 61 73  t the header has
2b00: 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e 63 65 64   not been synced
2b10: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 20   to disk..**    
2b20: 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * The contents o
2b30: 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  f the page cache
2b40: 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66   have been modif
2b50: 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54  ied..**.**  WRIT
2b60: 45 52 5f 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20  ER_DBMOD:.**.** 
2b70: 20 20 20 54 68 65 20 70 61 67 65 72 20 74 72 61     The pager tra
2b80: 6e 73 69 74 69 6f 6e 73 20 66 72 6f 6d 20 57 52  nsitions from WR
2b90: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 69 6e  ITER_CACHEMOD in
2ba0: 74 6f 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  to WRITER_DBMOD 
2bb0: 73 74 61 74 65 0a 2a 2a 20 20 20 20 77 68 65 6e  state.**    when
2bc0: 20 69 74 20 6d 6f 64 69 66 69 65 73 20 74 68 65   it modifies the
2bd0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2be0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2bf0: 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a  WAL connections.
2c00: 2a 2a 20 20 20 20 6e 65 76 65 72 20 65 6e 74 65  **    never ente
2c10: 72 20 74 68 69 73 20 73 74 61 74 65 20 28 73 69  r this state (si
2c20: 6e 63 65 20 74 68 65 79 20 64 6f 20 6e 6f 74 20  nce they do not 
2c30: 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62  modify the datab
2c40: 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 20 20 20  ase file,.**    
2c50: 6a 75 73 74 20 74 68 65 20 6c 6f 67 20 66 69 6c  just the log fil
2c60: 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41  e)..**.**    * A
2c70: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2c80: 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
2c90: 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53 49      * An EXCLUSI
2ca0: 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  VE or greater lo
2cb0: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
2cc0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2cd0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75  .**    * The jou
2ce0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
2cf0: 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  n and the first 
2d00: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
2d10: 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20  written .**     
2d20: 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
2d30: 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  isk..**    * The
2d40: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2d50: 20 70 61 67 65 20 63 61 63 68 65 20 68 61 76 65   page cache have
2d60: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 28   been modified (
2d70: 61 6e 64 20 70 6f 73 73 69 62 6c 79 0a 2a 2a 20  and possibly.** 
2d80: 20 20 20 20 20 77 72 69 74 74 65 6e 20 74 6f 20       written to 
2d90: 64 69 73 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57 52  disk)..**.**  WR
2da0: 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 2a  ITER_FINISHED:.*
2db0: 2a 0a 2a 2a 20 20 20 20 49 74 20 69 73 20 6e 6f  *.**    It is no
2dc0: 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61  t possible for a
2dd0: 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   WAL connection 
2de0: 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 73 74  to enter this st
2df0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  ate..**.**    A 
2e00: 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 20 70 61  rollback-mode pa
2e10: 67 65 72 20 63 68 61 6e 67 65 73 20 74 6f 20 57  ger changes to W
2e20: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 73  RITER_FINISHED s
2e30: 74 61 74 65 20 66 72 6f 6d 20 57 52 49 54 45 52  tate from WRITER
2e40: 5f 44 42 4d 4f 44 0a 2a 2a 20 20 20 20 73 74 61  _DBMOD.**    sta
2e50: 74 65 20 61 66 74 65 72 20 74 68 65 20 65 6e 74  te after the ent
2e60: 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ire transaction 
2e70: 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73 73  has been success
2e80: 66 75 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e  fully written in
2e90: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 64 61 74  to the.**    dat
2ea0: 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 74  abase file. In t
2eb0: 68 69 73 20 73 74 61 74 65 20 74 68 65 20 74 72  his state the tr
2ec0: 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62 65  ansaction may be
2ed0: 20 63 6f 6d 6d 69 74 74 65 64 20 73 69 6d 70 6c   committed simpl
2ee0: 79 0a 2a 2a 20 20 20 20 62 79 20 66 69 6e 61 6c  y.**    by final
2ef0: 69 7a 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  izing the journa
2f00: 6c 20 66 69 6c 65 2e 20 4f 6e 63 65 20 69 6e 20  l file. Once in 
2f10: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
2f20: 73 74 61 74 65 2c 20 69 74 20 69 73 20 0a 2a 2a  state, it is .**
2f30: 20 20 20 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65      not possible
2f40: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 64   to modify the d
2f50: 61 74 61 62 61 73 65 20 66 75 72 74 68 65 72 2e  atabase further.
2f60: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
2f70: 74 68 65 20 75 70 70 65 72 20 0a 2a 2a 20 20 20  the upper .**   
2f80: 20 6c 61 79 65 72 20 6d 75 73 74 20 65 69 74 68   layer must eith
2f90: 65 72 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c  er commit or rol
2fa0: 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
2fb0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ction..**.**    
2fc0: 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61  * A write transa
2fd0: 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e  ction is active.
2fe0: 0a 2a 2a 20 20 20 20 2a 20 41 6e 20 45 58 43 4c  .**    * An EXCL
2ff0: 55 53 49 56 45 20 6f 72 20 67 72 65 61 74 65 72  USIVE or greater
3000: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
3010: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3020: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c 20  le..**    * All 
3030: 77 72 69 74 69 6e 67 20 61 6e 64 20 73 79 6e 63  writing and sync
3040: 69 6e 67 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61  ing of journal a
3050: 6e 64 20 64 61 74 61 62 61 73 65 20 64 61 74 61  nd database data
3060: 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 0a 2a   has finished..*
3070: 2a 20 20 20 20 20 20 49 66 20 6e 6f 20 65 72 72  *      If no err
3080: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 61 6c 6c  or occurred, all
3090: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 69 73   that remains is
30a0: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
30b0: 20 6a 6f 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20   journal to.**  
30c0: 20 20 20 20 63 6f 6d 6d 69 74 20 74 68 65 20 74      commit the t
30d0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 61  ransaction. If a
30e0: 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75  n error did occu
30f0: 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  r, the caller wi
3100: 6c 6c 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20  ll need.**      
3110: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
3120: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a  transaction. .**
3130: 0a 2a 2a 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a  .**  ERROR:.**.*
3140: 2a 20 20 20 20 54 68 65 20 45 52 52 4f 52 20 73  *    The ERROR s
3150: 74 61 74 65 20 69 73 20 65 6e 74 65 72 65 64 20  tate is entered 
3160: 77 68 65 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69  when an IO or di
3170: 73 6b 2d 66 75 6c 6c 20 65 72 72 6f 72 20 28 69  sk-full error (i
3180: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53  ncluding.**    S
3190: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
31a0: 4d 29 20 6f 63 63 75 72 73 20 61 74 20 61 20 70  M) occurs at a p
31b0: 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
31c0: 20 74 68 61 74 20 6d 61 6b 65 73 20 69 74 20 0a   that makes it .
31d0: 2a 2a 20 20 20 20 64 69 66 66 69 63 75 6c 74 20  **    difficult 
31e0: 74 6f 20 62 65 20 73 75 72 65 20 74 68 61 74 20  to be sure that 
31f0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
3200: 67 65 72 20 73 74 61 74 65 20 28 63 61 63 68 65  ger state (cache
3210: 20 63 6f 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20   contents, .**  
3220: 20 20 64 62 20 73 69 7a 65 20 65 74 63 2e 29 20    db size etc.) 
3230: 61 72 65 20 63 6f 6e 73 69 73 74 65 6e 74 20 77  are consistent w
3240: 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ith the contents
3250: 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
3260: 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65  tem..**.**    Te
3270: 6d 70 6f 72 61 72 79 20 70 61 67 65 72 20 66 69  mporary pager fi
3280: 6c 65 73 20 6d 61 79 20 65 6e 74 65 72 20 74 68  les may enter th
3290: 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
32a0: 75 74 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ut in-memory pag
32b0: 65 72 73 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74  ers.**    cannot
32c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65  ..**.**    For e
32d0: 78 61 6d 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f  xample, if an IO
32e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
32f0: 69 6c 65 20 70 65 72 66 6f 72 6d 69 6e 67 20 61  ile performing a
3300: 20 72 6f 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20   rollback, .**  
3310: 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f    the contents o
3320: 66 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  f the page-cache
3330: 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
3340: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
3350: 73 74 61 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20  state..**    At 
3360: 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f  this point it wo
3370: 75 6c 64 20 62 65 20 64 61 6e 67 65 72 6f 75 73  uld be dangerous
3380: 20 74 6f 20 63 68 61 6e 67 65 20 62 61 63 6b 20   to change back 
3390: 74 6f 20 52 45 41 44 45 52 20 73 74 61 74 65 0a  to READER state.
33a0: 2a 2a 20 20 20 20 28 61 73 20 75 73 75 61 6c 6c  **    (as usuall
33b0: 79 20 68 61 70 70 65 6e 73 20 61 66 74 65 72 20  y happens after 
33c0: 61 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79  a rollback). Any
33d0: 20 73 75 62 73 65 71 75 65 6e 74 20 72 65 61 64   subsequent read
33e0: 65 72 73 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20  ers might.**    
33f0: 72 65 70 6f 72 74 20 64 61 74 61 62 61 73 65 20  report database 
3400: 63 6f 72 72 75 70 74 69 6f 6e 20 28 64 75 65 20  corruption (due 
3410: 74 6f 20 74 68 65 20 69 6e 63 6f 6e 73 69 73 74  to the inconsist
3420: 65 6e 74 20 63 61 63 68 65 29 2c 20 61 6e 64 20  ent cache), and 
3430: 69 66 0a 2a 2a 20 20 20 20 74 68 65 79 20 75 70  if.**    they up
3440: 67 72 61 64 65 20 74 6f 20 77 72 69 74 65 72 73  grade to writers
3450: 2c 20 74 68 65 79 20 6d 61 79 20 69 6e 61 64 76  , they may inadv
3460: 65 72 74 65 6e 74 6c 79 20 63 6f 72 72 75 70 74  ertently corrupt
3470: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
3480: 20 20 20 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f      file. To avo
3490: 69 64 20 74 68 69 73 20 68 61 7a 61 72 64 2c 20  id this hazard, 
34a0: 74 68 65 20 70 61 67 65 72 20 73 77 69 74 63 68  the pager switch
34b0: 65 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  es into the ERRO
34c0: 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e  R state.**    in
34d0: 73 74 65 61 64 20 6f 66 20 52 45 41 44 45 52 20  stead of READER 
34e0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 75 63 68 20 61  following such a
34f0: 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  n error..**.**  
3500: 20 20 4f 6e 63 65 20 69 74 20 68 61 73 20 65 6e    Once it has en
3510: 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
3520: 73 74 61 74 65 2c 20 61 6e 79 20 61 74 74 65 6d  state, any attem
3530: 70 74 20 74 6f 20 75 73 65 20 74 68 65 20 70 61  pt to use the pa
3540: 67 65 72 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61  ger.**    to rea
3550: 64 20 6f 72 20 77 72 69 74 65 20 64 61 74 61 20  d or write data 
3560: 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
3570: 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e  . Eventually, on
3580: 63 65 20 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75  ce all .**    ou
3590: 74 73 74 61 6e 64 69 6e 67 20 74 72 61 6e 73 61  tstanding transa
35a0: 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e  ctions have been
35b0: 20 61 62 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20   abandoned, the 
35c0: 70 61 67 65 72 20 69 73 20 61 62 6c 65 20 74 6f  pager is able to
35d0: 0a 2a 2a 20 20 20 20 74 72 61 6e 73 69 74 69 6f  .**    transitio
35e0: 6e 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  n back to OPEN s
35f0: 74 61 74 65 2c 20 64 69 73 63 61 72 64 69 6e 67  tate, discarding
3600: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3610: 20 74 68 65 20 0a 2a 2a 20 20 20 20 70 61 67 65   the .**    page
3620: 2d 63 61 63 68 65 20 61 6e 64 20 61 6e 79 20 6f  -cache and any o
3630: 74 68 65 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73  ther in-memory s
3640: 74 61 74 65 20 61 74 20 74 68 65 20 73 61 6d 65  tate at the same
3650: 20 74 69 6d 65 2e 20 45 76 65 72 79 74 68 69 6e   time. Everythin
3660: 67 0a 2a 2a 20 20 20 20 69 73 20 72 65 6c 6f 61  g.**    is reloa
3670: 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 28 61  ded from disk (a
3680: 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
3690: 2c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  , hot-journal ro
36a0: 6c 6c 62 61 63 6b 20 70 65 66 6f 72 6d 65 64 29  llback peformed)
36b0: 0a 2a 2a 20 20 20 20 77 68 65 6e 20 61 20 72 65  .**    when a re
36c0: 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
36d0: 73 20 6e 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e  s next opened on
36e0: 20 74 68 65 20 70 61 67 65 72 20 28 74 72 61 6e   the pager (tran
36f0: 73 69 74 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20  sitioning.**    
3700: 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 52  the pager into R
3710: 45 41 44 45 52 20 73 74 61 74 65 29 2e 20 41 74  EADER state). At
3720: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20   that point the 
3730: 73 79 73 74 65 6d 20 68 61 73 20 72 65 63 6f 76  system has recov
3740: 65 72 65 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d  ered .**    from
3750: 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a   the error..**.*
3760: 2a 20 20 20 20 53 70 65 63 69 66 69 63 61 6c 6c  *    Specificall
3770: 79 2c 20 74 68 65 20 70 61 67 65 72 20 6a 75 6d  y, the pager jum
3780: 70 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ps into the ERRO
3790: 52 20 73 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a  R state if:.**.*
37a0: 2a 20 20 20 20 20 20 31 2e 20 41 6e 20 65 72 72  *      1. An err
37b0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
37c0: 61 74 74 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c  attempting a rol
37d0: 6c 62 61 63 6b 2e 20 54 68 69 73 20 68 61 70 70  lback. This happ
37e0: 65 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20  ens in.**       
37f0: 20 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74    function sqlit
3800: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
3810: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e  )..**.**      2.
3820: 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   An error occurs
3830: 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e   while attemptin
3840: 67 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20  g to finalize a 
3850: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
3860: 20 20 20 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e          followin
3870: 67 20 61 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75  g a commit in fu
3880: 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61  nction sqlite3Pa
3890: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
38a0: 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  o()..**.**      
38b0: 33 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  3. An error occu
38c0: 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74  rs while attempt
38d0: 69 6e 67 20 74 6f 20 77 72 69 74 65 20 74 6f 20  ing to write to 
38e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a  the journal or.*
38f0: 2a 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61  *         databa
3900: 73 65 20 66 69 6c 65 20 69 6e 20 66 75 6e 63 74  se file in funct
3910: 69 6f 6e 20 70 61 67 65 72 53 74 72 65 73 73 28  ion pagerStress(
3920: 29 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  ) in order to fr
3930: 65 65 20 75 70 0a 2a 2a 20 20 20 20 20 20 20 20  ee up.**        
3940: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20   memory..**.**  
3950: 20 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73    In other cases
3960: 2c 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 72  , the error is r
3970: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 62  eturned to the b
3980: 2d 74 72 65 65 20 6c 61 79 65 72 2e 20 54 68 65  -tree layer. The
3990: 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61   b-tree.**    la
39a0: 79 65 72 20 74 68 65 6e 20 61 74 74 65 6d 70 74  yer then attempt
39b0: 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  s a rollback ope
39c0: 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65  ration. If the e
39d0: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a  rror condition .
39e0: 2a 2a 20 20 20 20 70 65 72 73 69 73 74 73 2c 20  **    persists, 
39f0: 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73  the pager enters
3a00: 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
3a10: 20 76 69 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28   via condition (
3a20: 31 29 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  1) above..**.** 
3a30: 20 20 20 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29     Condition (3)
3a40: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
3a50: 63 61 75 73 65 20 69 74 20 63 61 6e 20 62 65 20  cause it can be 
3a60: 74 72 69 67 67 65 72 65 64 20 62 79 20 61 20 72  triggered by a r
3a70: 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73  ead-only.**    s
3a80: 74 61 74 65 6d 65 6e 74 20 65 78 65 63 75 74 65  tatement execute
3a90: 64 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  d within a trans
3aa0: 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  action. In this 
3ab0: 63 61 73 65 2c 20 69 66 20 74 68 65 20 65 72 72  case, if the err
3ac0: 6f 72 0a 2a 2a 20 20 20 20 63 6f 64 65 20 77 65  or.**    code we
3ad0: 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  re simply return
3ae0: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2c 20  ed to the user, 
3af0: 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
3b00: 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
3b10: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
3b20: 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63  ttempt a rollbac
3b30: 6b 2c 20 61 73 20 69 74 20 61 73 73 75 6d 65 73  k, as it assumes
3b40: 20 74 68 61 74 20 61 6e 20 65 72 72 6f 72 20 69   that an error i
3b50: 6e 20 61 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f  n a.**    read-o
3b60: 6e 6c 79 20 73 74 61 74 65 6d 65 6e 74 20 63 61  nly statement ca
3b70: 6e 6e 6f 74 20 6c 65 61 76 65 20 74 68 65 20 70  nnot leave the p
3b80: 61 67 65 72 20 69 6e 20 61 6e 20 69 6e 74 65 72  ager in an inter
3b90: 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65  nally inconsiste
3ba0: 6e 74 20 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e  nt .**    state.
3bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  .**.**    * The 
3bc0: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61  Pager.errCode va
3bd0: 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  riable is set to
3be0: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
3bf0: 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e   than SQLITE_OK.
3c00: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 72 65 20 61  .**    * There a
3c10: 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  re one or more o
3c20: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
3c30: 65 6e 63 65 73 20 74 6f 20 70 61 67 65 73 20 28  ences to pages (
3c40: 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 20 20 20  after the.**    
3c50: 20 20 6c 61 73 74 20 72 65 66 65 72 65 6e 63 65    last reference
3c60: 20 69 73 20 64 72 6f 70 70 65 64 20 74 68 65 20   is dropped the 
3c70: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76  pager should mov
3c80: 65 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  e back to OPEN s
3c90: 74 61 74 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54  tate)..**    * T
3ca0: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
3cb0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
3cc0: 65 72 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a  er..**    .**.**
3cd0: 20 4e 6f 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   Notes:.**.**   
3ce0: 2a 20 41 20 70 61 67 65 72 20 69 73 20 6e 65 76  * A pager is nev
3cf0: 65 72 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  er in WRITER_DBM
3d00: 4f 44 20 6f 72 20 57 52 49 54 45 52 5f 46 49 4e  OD or WRITER_FIN
3d10: 49 53 48 45 44 20 73 74 61 74 65 20 69 66 20 74  ISHED state if t
3d20: 68 65 0a 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63  he.**     connec
3d30: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20  tion is open in 
3d40: 57 41 4c 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20  WAL mode. A WAL 
3d50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c  connection is al
3d60: 77 61 79 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20  ways in one.**  
3d70: 20 20 20 6f 66 20 74 68 65 20 66 69 72 73 74 20     of the first 
3d80: 66 6f 75 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a  four states..**.
3d90: 2a 2a 20 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  **   * Normally,
3da0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70   a connection op
3db0: 65 6e 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  en in exclusive 
3dc0: 6d 6f 64 65 20 69 73 20 6e 65 76 65 72 20 69 6e  mode is never in
3dd0: 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20   PAGER_OPEN.**  
3de0: 20 20 20 73 74 61 74 65 2e 20 54 68 65 72 65 20     state. There 
3df0: 61 72 65 20 74 77 6f 20 65 78 63 65 70 74 69 6f  are two exceptio
3e00: 6e 73 3a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ns: immediately 
3e10: 61 66 74 65 72 20 65 78 63 6c 75 73 69 76 65 2d  after exclusive-
3e20: 6d 6f 64 65 20 68 61 73 0a 2a 2a 20 20 20 20 20  mode has.**     
3e30: 62 65 65 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28  been turned on (
3e40: 61 6e 64 20 62 65 66 6f 72 65 20 61 6e 79 20 72  and before any r
3e50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
3e60: 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a  nsactions are .*
3e70: 2a 20 20 20 20 20 65 78 65 63 75 74 65 64 29 2c  *     executed),
3e80: 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 70 61   and when the pa
3e90: 67 65 72 20 69 73 20 6c 65 61 76 69 6e 67 20 74  ger is leaving t
3ea0: 68 65 20 22 65 72 72 6f 72 20 73 74 61 74 65 22  he "error state"
3eb0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20  ..**.**   * See 
3ec0: 61 6c 73 6f 3a 20 61 73 73 65 72 74 5f 70 61 67  also: assert_pag
3ed0: 65 72 5f 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23  er_state()..*/.#
3ee0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4f 50 45  define PAGER_OPE
3ef0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N               
3f00: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
3f10: 45 52 5f 52 45 41 44 45 52 20 20 20 20 20 20 20  ER_READER       
3f20: 20 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69           1.#defi
3f30: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f40: 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 20 20 32  LOCKED         2
3f50: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3f60: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 20  RITER_CACHEMOD  
3f70: 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 50       3.#define P
3f80: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
3f90: 44 20 20 20 20 20 20 20 20 20 20 34 0a 23 64 65  D          4.#de
3fa0: 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45  fine PAGER_WRITE
3fb0: 52 5f 46 49 4e 49 53 48 45 44 20 20 20 20 20 20  R_FINISHED      
3fc0: 20 35 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   5.#define PAGER
3fd0: 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20  _ERROR          
3fe0: 20 20 20 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20         6../*.** 
3ff0: 54 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  The Pager.eLock 
4000: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f  variable is almo
4010: 73 74 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  st always set to
4020: 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20   one of the .** 
4030: 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e  following lockin
4040: 67 2d 73 74 61 74 65 73 2c 20 61 63 63 6f 72 64  g-states, accord
4050: 69 6e 67 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20  ing to the lock 
4060: 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f  currently held o
4070: 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
4080: 65 20 66 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c  e file: NO_LOCK,
4090: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
40a0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
40b0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
40c0: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
40d0: 69 73 20 6b 65 70 74 20 75 70 20 74 6f 20 64 61  is kept up to da
40e0: 74 65 20 61 73 20 6c 6f 63 6b 73 20 61 72 65 20  te as locks are 
40f0: 74 61 6b 65 6e 20 61 6e 64 20 72 65 6c 65 61 73  taken and releas
4100: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 70 61 67  ed by.** the pag
4110: 65 72 4c 6f 63 6b 44 62 28 29 20 61 6e 64 20 70  erLockDb() and p
4120: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77  agerUnlockDb() w
4130: 72 61 70 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49  rappers..**.** I
4140: 66 20 74 68 65 20 56 46 53 20 78 4c 6f 63 6b 28  f the VFS xLock(
4150: 29 20 6f 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72  ) or xUnlock() r
4160: 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
4170: 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
4180: 45 5f 42 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20  E_BUSY.** (i.e. 
4190: 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  one of the SQLIT
41a0: 45 5f 49 4f 45 52 52 20 73 75 62 74 79 70 65 73  E_IOERR subtypes
41b0: 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 63 6c 65  ), it is not cle
41c0: 61 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ar whether or no
41d0: 74 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 74 69  t.** the operati
41e0: 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75  on was successfu
41f0: 6c 2e 20 49 6e 20 74 68 65 73 65 20 63 69 72 63  l. In these circ
4200: 75 6d 73 74 61 6e 63 65 73 20 70 61 67 65 72 4c  umstances pagerL
4210: 6f 63 6b 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70  ockDb() and.** p
4220: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74  agerUnlockDb() t
4230: 61 6b 65 20 61 20 63 6f 6e 73 65 72 76 61 74 69  ake a conservati
4240: 76 65 20 61 70 70 72 6f 61 63 68 20 2d 20 65 4c  ve approach - eL
4250: 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 75 70  ock is always up
4260: 64 61 74 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e  dated.** when un
4270: 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69 6c 65  locking the file
4280: 2c 20 61 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74  , and only updat
4290: 65 64 20 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20  ed when locking 
42a0: 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 0a  the file if the.
42b0: 2a 2a 20 56 46 53 20 63 61 6c 6c 20 69 73 20 73  ** VFS call is s
42c0: 75 63 63 65 73 73 66 75 6c 2e 20 54 68 69 73 20  uccessful. This 
42d0: 77 61 79 2c 20 74 68 65 20 50 61 67 65 72 2e 65  way, the Pager.e
42e0: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 6d 61  Lock variable ma
42f0: 79 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61  y be set.** to a
4300: 20 6c 65 73 73 20 65 78 63 6c 75 73 69 76 65 20   less exclusive 
4310: 28 6c 6f 77 65 72 29 20 76 61 6c 75 65 20 74 68  (lower) value th
4320: 61 6e 20 74 68 65 20 6c 6f 63 6b 20 74 68 61 74  an the lock that
4330: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 68 65 6c   is actually hel
4340: 64 0a 2a 2a 20 61 74 20 74 68 65 20 73 79 73 74  d.** at the syst
4350: 65 6d 20 6c 65 76 65 6c 2c 20 62 75 74 20 69 74  em level, but it
4360: 20 69 73 20 6e 65 76 65 72 20 73 65 74 20 74 6f   is never set to
4370: 20 61 20 6d 6f 72 65 20 65 78 63 6c 75 73 69 76   a more exclusiv
4380: 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  e value..**.** T
4390: 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 73  his is usually s
43a0: 61 66 65 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f  afe. If an xUnlo
43b0: 63 6b 20 66 61 69 6c 73 20 6f 72 20 61 70 70 65  ck fails or appe
43c0: 61 72 73 20 74 6f 20 66 61 69 6c 2c 20 74 68 65  ars to fail, the
43d0: 72 65 20 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20  re may .** be a 
43e0: 66 65 77 20 72 65 64 75 6e 64 61 6e 74 20 78 4c  few redundant xL
43f0: 6f 63 6b 28 29 20 63 61 6c 6c 73 20 6f 72 20 61  ock() calls or a
4400: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 68 65 6c   lock may be hel
4410: 64 20 66 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61  d for longer tha
4420: 6e 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 62  n.** required, b
4430: 75 74 20 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c  ut nothing reall
4440: 79 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  y goes wrong..**
4450: 0a 2a 2a 20 54 68 65 20 65 78 63 65 70 74 69 6f  .** The exceptio
4460: 6e 20 69 73 20 77 68 65 6e 20 74 68 65 20 64 61  n is when the da
4470: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75  tabase file is u
4480: 6e 6c 6f 63 6b 65 64 20 61 73 20 74 68 65 20 70  nlocked as the p
4490: 61 67 65 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72  ager moves.** fr
44a0: 6f 6d 20 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e  om ERROR to OPEN
44b0: 20 73 74 61 74 65 2e 20 41 74 20 74 68 69 73 20   state. At this 
44c0: 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
44d0: 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  be a hot-journal
44e0: 20 66 69 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65   file .** in the
44f0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 74 68 61   file-system tha
4500: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
4510: 6c 6c 65 64 20 62 61 63 6b 20 28 61 73 20 70 61  lled back (as pa
4520: 72 74 20 6f 66 20 61 6e 20 4f 50 45 4e 2d 3e 53  rt of an OPEN->S
4530: 48 41 52 45 44 0a 2a 2a 20 74 72 61 6e 73 69 74  HARED.** transit
4540: 69 6f 6e 2c 20 62 79 20 74 68 65 20 73 61 6d 65  ion, by the same
4550: 20 70 61 67 65 72 20 6f 72 20 61 6e 79 20 6f 74   pager or any ot
4560: 68 65 72 29 2e 20 49 66 20 74 68 65 20 63 61 6c  her). If the cal
4570: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a  l to xUnlock().*
4580: 2a 20 66 61 69 6c 73 20 61 74 20 74 68 69 73 20  * fails at this 
4590: 70 6f 69 6e 74 20 61 6e 64 20 74 68 65 20 70 61  point and the pa
45a0: 67 65 72 20 69 73 20 6c 65 66 74 20 68 6f 6c 64  ger is left hold
45b0: 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
45c0: 20 6c 6f 63 6b 2c 20 74 68 69 73 0a 2a 2a 20 63   lock, this.** c
45d0: 61 6e 20 63 6f 6e 66 75 73 65 20 74 68 65 20 63  an confuse the c
45e0: 61 6c 6c 20 74 6f 20 78 43 68 65 63 6b 52 65 73  all to xCheckRes
45f0: 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c  ervedLock() call
4600: 20 6d 61 64 65 20 6c 61 74 65 72 20 61 73 20 70   made later as p
4610: 61 72 74 0a 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f  art.** of hot-jo
4620: 75 72 6e 61 6c 20 64 65 74 65 63 74 69 6f 6e 2e  urnal detection.
4630: 0a 2a 2a 0a 2a 2a 20 78 43 68 65 63 6b 52 65 73  .**.** xCheckRes
4640: 65 72 76 65 64 4c 6f 63 6b 28 29 20 69 73 20 64  ervedLock() is d
4650: 65 66 69 6e 65 64 20 61 73 20 72 65 74 75 72 6e  efined as return
4660: 69 6e 67 20 74 72 75 65 20 22 69 66 20 74 68 65  ing true "if the
4670: 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
4680: 20 0a 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 62   .** lock held b
4690: 79 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f  y this process o
46a0: 72 20 61 6e 79 20 6f 74 68 65 72 73 22 2e 20 53  r any others". S
46b0: 6f 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  o xCheckReserved
46c0: 4c 6f 63 6b 20 6d 61 79 20 0a 2a 2a 20 72 65 74  Lock may .** ret
46d0: 75 72 6e 20 74 72 75 65 20 62 65 63 61 75 73 65  urn true because
46e0: 20 74 68 65 20 63 61 6c 6c 65 72 20 69 74 73 65   the caller itse
46f0: 6c 66 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e  lf is holding an
4700: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
4710: 28 62 75 74 0a 2a 2a 20 64 6f 65 73 6e 27 74 20  (but.** doesn't 
4720: 6b 6e 6f 77 20 69 74 20 62 65 63 61 75 73 65 20  know it because 
4730: 6f 66 20 61 20 70 72 65 76 69 6f 75 73 20 65 72  of a previous er
4740: 72 6f 72 20 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e  ror in xUnlock).
4750: 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   If this happens
4760: 0a 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  .** a hot-journa
4770: 6c 20 6d 61 79 20 62 65 20 6d 69 73 74 61 6b 65  l may be mistake
4780: 6e 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20  n for a journal 
4790: 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 62 79  being created by
47a0: 20 61 6e 20 61 63 74 69 76 65 0a 2a 2a 20 74 72   an active.** tr
47b0: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 61 6e 6f  ansaction in ano
47c0: 74 68 65 72 20 70 72 6f 63 65 73 73 2c 20 63 61  ther process, ca
47d0: 75 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f 20  using SQLite to 
47e0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
47f0: 74 61 62 61 73 65 0a 2a 2a 20 77 69 74 68 6f 75  tabase.** withou
4800: 74 20 72 6f 6c 6c 69 6e 67 20 69 74 20 62 61 63  t rolling it bac
4810: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b  k..**.** To work
4820: 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66   around this, if
4830: 20 61 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f   a call to xUnlo
4840: 63 6b 28 29 20 66 61 69 6c 73 20 77 68 65 6e 20  ck() fails when 
4850: 75 6e 6c 6f 63 6b 69 6e 67 20 74 68 65 0a 2a 2a  unlocking the.**
4860: 20 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65   database in the
4870: 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 50 61   ERROR state, Pa
4880: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
4890: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
48a0: 2e 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20  . It.** is only 
48b0: 63 68 61 6e 67 65 64 20 62 61 63 6b 20 74 6f 20  changed back to 
48c0: 61 20 72 65 61 6c 20 6c 6f 63 6b 69 6e 67 20 73  a real locking s
48d0: 74 61 74 65 20 61 66 74 65 72 20 61 20 73 75 63  tate after a suc
48e0: 63 65 73 73 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20  cessful call.** 
48f0: 74 6f 20 78 4c 6f 63 6b 28 45 58 43 4c 55 53 49  to xLock(EXCLUSI
4900: 56 45 29 2e 20 41 6c 73 6f 2c 20 74 68 65 20 63  VE). Also, the c
4910: 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 4f 50  ode to do the OP
4920: 45 4e 2d 3e 53 48 41 52 45 44 20 73 74 61 74 65  EN->SHARED state
4930: 20 74 72 61 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f   transition.** o
4940: 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 20 66  mits the check f
4950: 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
4960: 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20   if Pager.eLock 
4970: 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  is set to UNKNOW
4980: 4e 5f 4c 4f 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e  N_LOCK .** lock.
4990: 20 49 6e 73 74 65 61 64 2c 20 69 74 20 61 73 73   Instead, it ass
49a0: 75 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  umes a hot-journ
49b0: 61 6c 20 65 78 69 73 74 73 20 61 6e 64 20 6f 62  al exists and ob
49c0: 74 61 69 6e 73 20 61 6e 20 45 58 43 4c 55 53 49  tains an EXCLUSI
49d0: 56 45 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68  VE.** lock on th
49e0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
49f0: 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
4a00: 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  g to roll it bac
4a10: 6b 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a  k. See function.
4a20: 2a 2a 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f  ** PagerSharedLo
4a30: 63 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 64 65  ck() for more de
4a40: 74 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  tail..**.** Page
4a50: 72 2e 65 4c 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79  r.eLock may only
4a60: 20 62 65 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   be set to UNKNO
4a70: 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65  WN_LOCK when the
4a80: 20 70 61 67 65 72 20 69 73 20 69 6e 20 0a 2a 2a   pager is in .**
4a90: 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
4aa0: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  e..*/.#define UN
4ab0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 20 20  KNOWN_LOCK      
4ac0: 20 20 20 20 20 20 20 20 20 20 28 45 58 43 4c 55            (EXCLU
4ad0: 53 49 56 45 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a  SIVE_LOCK+1)../*
4ae0: 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64  .** A macro used
4af0: 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68   for invoking th
4b00: 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65  e codec if there
4b10: 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65   is one.*/.#ifde
4b20: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
4b30: 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  EC.# define CODE
4b40: 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a  C1(P,D,N,X,E) \.
4b50: 20 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64 65      if( P->xCode
4b60: 63 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28 50  c && P->xCodec(P
4b70: 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d  ->pCodec,D,N,X)=
4b80: 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65 66  =0 ){ E; }.# def
4b90: 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e  ine CODEC2(P,D,N
4ba0: 2c 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69 66  ,X,E,O) \.    if
4bb0: 28 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29  ( P->xCodec==0 )
4bc0: 7b 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d 65  { O=(char*)D; }e
4bd0: 6c 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28 4f  lse \.    if( (O
4be0: 3d 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64  =(char*)(P->xCod
4bf0: 65 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e  ec(P->pCodec,D,N
4c00: 2c 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20 7d  ,X)))==0 ){ E; }
4c10: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
4c20: 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45  CODEC1(P,D,N,X,E
4c30: 29 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a  )   /* NO-OP */.
4c40: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28  # define CODEC2(
4c50: 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28  P,D,N,X,E,O) O=(
4c60: 63 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a 0a  char*)D.#endif..
4c70: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
4c80: 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f 72  m allowed sector
4c90: 20 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49 66   size. 64KiB. If
4ca0: 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65   the xSectorsize
4cb0: 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65  () method .** re
4cc0: 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61  turns a value la
4cd0: 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20  rger than this, 
4ce0: 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f  then MAX_SECTOR_
4cf0: 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73  SIZE is used ins
4d00: 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f  tead..** This co
4d10: 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20  uld conceivably 
4d20: 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  cause corruption
4d30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77   following a pow
4d40: 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a  er failure on.**
4d50: 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20   such a system. 
4d60: 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c  This is currentl
4d70: 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65  y an undocumente
4d80: 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66  d limit..*/.#def
4d90: 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  ine MAX_SECTOR_S
4da0: 49 5a 45 20 30 78 31 30 30 30 30 0a 0a 2f 2a 0a  IZE 0x10000../*.
4db0: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
4dc0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
4dd0: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c  structure is all
4de0: 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20  ocated for each 
4df0: 61 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70 6f  active.** savepo
4e00: 69 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65 6e  int and statemen
4e10: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  t transaction in
4e20: 20 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c 6c   the system. All
4e30: 20 73 75 63 68 20 73 74 72 75 63 74 75 72 65 73   such structures
4e40: 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69  .** are stored i
4e50: 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76  n the Pager.aSav
4e60: 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c 20  epoint[] array, 
4e70: 77 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61 74  which is allocat
4e80: 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a 65  ed and.** resize
4e90: 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 52  d using sqlite3R
4ea0: 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20  ealloc()..**.** 
4eb0: 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74  When a savepoint
4ec0: 20 69 73 20 63 72 65 61 74 65 64 2c 20 74 68 65   is created, the
4ed0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
4ee0: 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64  iHdrOffset field
4ef0: 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2e   is.** set to 0.
4f00: 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65   If a journal-he
4f10: 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 20  ader is written 
4f20: 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a 6f  into the main jo
4f30: 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20 74  urnal while.** t
4f40: 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20  he savepoint is 
4f50: 61 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48 64  active, then iHd
4f60: 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74  rOffset is set t
4f70: 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65  o the byte offse
4f80: 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  t .** immediatel
4f90: 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  y following the 
4fa0: 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65 63  last journal rec
4fb0: 6f 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  ord written into
4fc0: 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75   the main.** jou
4fd0: 72 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65 20  rnal before the 
4fe0: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e 20  journal-header. 
4ff0: 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64  This is required
5000: 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e   during savepoin
5010: 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28 73  t.** rollback (s
5020: 65 65 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b  ee pagerPlayback
5030: 53 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f  Savepoint())..*/
5040: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
5050: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 50  PagerSavepoint P
5060: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a 73  agerSavepoint;.s
5070: 74 72 75 63 74 20 50 61 67 65 72 53 61 76 65 70  truct PagerSavep
5080: 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f 66  oint {.  i64 iOf
5090: 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
50a0: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69 6e        /* Startin
50b0: 67 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69 6e  g offset in main
50c0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36   journal */.  i6
50d0: 34 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20 20  4 iHdrOffset;   
50e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
50f0: 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69 74  e above */.  Bit
5100: 76 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69 6e  vec *pInSavepoin
5110: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74  t;        /* Set
5120: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 69   of pages in thi
5130: 73 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20  s savepoint */. 
5140: 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20   Pgno nOrig;    
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5160: 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65 72   Original number
5170: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69 6c   of pages in fil
5180: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75 62  e */.  Pgno iSub
5190: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
51a0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
51b0: 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e 20  first record in 
51c0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23  sub-journal */.#
51d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
51e0: 49 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57 61  IT_WAL.  u32 aWa
51f0: 6c 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50 4f  lData[WAL_SAVEPO
5200: 49 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20 20  INT_NDATA];     
5210: 20 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70 6f     /* WAL savepo
5220: 69 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23  int context */.#
5230: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
5240: 42 69 74 73 20 6f 66 20 74 68 65 20 50 61 67 65  Bits of the Page
5250: 72 2e 64 6f 4e 6f 74 53 70 69 6c 6c 20 66 6c 61  r.doNotSpill fla
5260: 67 2e 20 20 53 65 65 20 66 75 72 74 68 65 72 20  g.  See further 
5270: 64 65 73 63 72 69 70 74 69 6f 6e 20 62 65 6c 6f  description belo
5280: 77 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 50  w..*/.#define SP
5290: 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 20 20 20 20  ILLFLAG_OFF     
52a0: 20 20 20 20 30 78 30 31 20 20 20 20 20 20 2f 2a      0x01      /*
52b0: 20 4e 65 76 65 72 20 73 70 69 6c 6c 20 63 61 63   Never spill cac
52c0: 68 65 2e 20 20 53 65 74 20 76 69 61 20 70 72 61  he.  Set via pra
52d0: 67 6d 61 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53  gma */.#define S
52e0: 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43  PILLFLAG_ROLLBAC
52f0: 4b 20 20 20 20 30 78 30 32 20 20 20 20 20 20 2f  K    0x02      /
5300: 2a 20 43 75 72 72 65 6e 74 20 72 6f 6c 6c 69 6e  * Current rollin
5310: 67 20 62 61 63 6b 2c 20 73 6f 20 64 6f 20 6e 6f  g back, so do no
5320: 74 20 73 70 69 6c 6c 20 2a 2f 0a 23 64 65 66 69  t spill */.#defi
5330: 6e 65 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53  ne SPILLFLAG_NOS
5340: 59 4e 43 20 20 20 20 20 20 30 78 30 34 20 20 20  YNC      0x04   
5350: 20 20 20 2f 2a 20 53 70 69 6c 6c 20 69 73 20 6f     /* Spill is o
5360: 6b 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 73 79  k, but do not sy
5370: 6e 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  nc */../*.** An 
5380: 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68 65 20  open page cache 
5390: 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  is an instance o
53a0: 66 20 73 74 72 75 63 74 20 50 61 67 65 72 2e 20  f struct Pager. 
53b0: 41 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  A description of
53c0: 0a 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65 20  .** some of the 
53d0: 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 6d  more important m
53e0: 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73 20  ember variables 
53f0: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 65  follows:.**.** e
5400: 53 74 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  State.**.**   Th
5410: 65 20 63 75 72 72 65 6e 74 20 27 73 74 61 74 65  e current 'state
5420: 27 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 6f  ' of the pager o
5430: 62 6a 65 63 74 2e 20 53 65 65 20 74 68 65 20 63  bject. See the c
5440: 6f 6d 6d 65 6e 74 20 61 6e 64 20 73 74 61 74 65  omment and state
5450: 0a 2a 2a 20 20 20 64 69 61 67 72 61 6d 20 61 62  .**   diagram ab
5460: 6f 76 65 20 66 6f 72 20 61 20 64 65 73 63 72 69  ove for a descri
5470: 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67  ption of the pag
5480: 65 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  er state..**.** 
5490: 65 4c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20 46 6f  eLock.**.**   Fo
54a0: 72 20 61 20 72 65 61 6c 20 6f 6e 2d 64 69 73 6b  r a real on-disk
54b0: 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 63   database, the c
54c0: 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64  urrent lock held
54d0: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
54e0: 20 66 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e 4f 5f   file -.**   NO_
54f0: 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f 43  LOCK, SHARED_LOC
5500: 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  K, RESERVED_LOCK
5510: 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   or EXCLUSIVE_LO
5520: 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20  CK..**.**   For 
5530: 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20 69  a temporary or i
5540: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
5550: 65 20 28 6e 65 69 74 68 65 72 20 6f 66 20 77 68  e (neither of wh
5560: 69 63 68 20 72 65 71 75 69 72 65 20 61 6e 79 0a  ich require any.
5570: 2a 2a 20 20 20 6c 6f 63 6b 73 29 2c 20 74 68 69  **   locks), thi
5580: 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c  s variable is al
5590: 77 61 79 73 20 73 65 74 20 74 6f 20 45 58 43 4c  ways set to EXCL
55a0: 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 53 69 6e 63  USIVE_LOCK. Sinc
55b0: 65 20 73 75 63 68 0a 2a 2a 20 20 20 64 61 74 61  e such.**   data
55c0: 62 61 73 65 73 20 61 6c 77 61 79 73 20 68 61 76  bases always hav
55d0: 65 20 50 61 67 65 72 2e 65 78 63 6c 75 73 69 76  e Pager.exclusiv
55e0: 65 4d 6f 64 65 3d 3d 31 2c 20 74 68 69 73 20 74  eMode==1, this t
55f0: 72 69 63 6b 73 20 74 68 65 20 70 61 67 65 72 0a  ricks the pager.
5600: 2a 2a 20 20 20 6c 6f 67 69 63 20 69 6e 74 6f 20  **   logic into 
5610: 74 68 69 6e 6b 69 6e 67 20 74 68 61 74 20 69 74  thinking that it
5620: 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 6c 6c   already has all
5630: 20 74 68 65 20 6c 6f 63 6b 73 20 69 74 20 77 69   the locks it wi
5640: 6c 6c 20 65 76 65 72 0a 2a 2a 20 20 20 6e 65 65  ll ever.**   nee
5650: 64 20 28 61 6e 64 20 6e 6f 20 72 65 61 73 6f 6e  d (and no reason
5660: 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65 6d   to release them
5670: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 73 6f  )..**.**   In so
5680: 6d 65 20 28 6f 62 73 63 75 72 65 29 20 63 69 72  me (obscure) cir
5690: 63 75 6d 73 74 61 6e 63 65 73 2c 20 74 68 69 73  cumstances, this
56a0: 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 61 6c   variable may al
56b0: 73 6f 20 62 65 20 73 65 74 20 74 6f 0a 2a 2a 20  so be set to.** 
56c0: 20 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20    UNKNOWN_LOCK. 
56d0: 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  See the comment 
56e0: 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e  above the #defin
56f0: 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  e of UNKNOWN_LOC
5700: 4b 20 66 6f 72 0a 2a 2a 20 20 20 64 65 74 61 69  K for.**   detai
5710: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67 65  ls..**.** change
5720: 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20  CountDone.**.** 
5730: 20 20 54 68 69 73 20 62 6f 6f 6c 65 61 6e 20 76    This boolean v
5740: 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20  ariable is used 
5750: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
5760: 74 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  t the change-cou
5770: 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74 68 65 20  nter .**   (the 
5780: 34 2d 62 79 74 65 20 68 65 61 64 65 72 20 66 69  4-byte header fi
5790: 65 6c 64 20 61 74 20 62 79 74 65 20 6f 66 66 73  eld at byte offs
57a0: 65 74 20 32 34 20 6f 66 20 74 68 65 20 64 61 74  et 24 of the dat
57b0: 61 62 61 73 65 20 66 69 6c 65 29 20 69 73 20 0a  abase file) is .
57c0: 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61 74 65 64  **   not updated
57d0: 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68 61 6e   more often than
57e0: 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 2a 2a 0a   necessary. .**.
57f0: 2a 2a 20 20 20 49 74 20 69 73 20 73 65 74 20 74  **   It is set t
5800: 6f 20 74 72 75 65 20 77 68 65 6e 20 74 68 65 20  o true when the 
5810: 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66  change-counter f
5820: 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2c  ield is updated,
5830: 20 77 68 69 63 68 20 0a 2a 2a 20 20 20 63 61 6e   which .**   can
5840: 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20   only happen if 
5850: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
5860: 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65  k is held on the
5870: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
5880: 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65 61 72  **   It is clear
5890: 65 64 20 28 73 65 74 20 74 6f 20 66 61 6c 73 65  ed (set to false
58a0: 29 20 77 68 65 6e 65 76 65 72 20 61 6e 20 65 78  ) whenever an ex
58b0: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20  clusive lock is 
58c0: 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75 69 73 68  .**   relinquish
58d0: 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ed on the databa
58e0: 73 65 20 66 69 6c 65 2e 20 45 61 63 68 20 74 69  se file. Each ti
58f0: 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  me a transaction
5900: 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c 0a 2a   is committed,.*
5910: 2a 20 20 20 54 68 65 20 63 68 61 6e 67 65 43 6f  *   The changeCo
5920: 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73 20  untDone flag is 
5930: 69 6e 73 70 65 63 74 65 64 2e 20 49 66 20 69 74  inspected. If it
5940: 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 77 6f   is true, the wo
5950: 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70 64 61 74  rk of.**   updat
5960: 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ing the change-c
5970: 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69 74 74 65  ounter is omitte
5980: 64 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  d for the curren
5990: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  t transaction..*
59a0: 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65 63 68  *.**   This mech
59b0: 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68 61 74  anism means that
59c0: 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e   when running in
59d0: 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c   exclusive mode,
59e0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a   a connection .*
59f0: 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20 75 70  *   need only up
5a00: 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d  date the change-
5a10: 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20 66 6f  counter once, fo
5a20: 72 20 74 68 65 20 66 69 72 73 74 20 74 72 61 6e  r the first tran
5a30: 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f 6d  saction.**   com
5a40: 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 73 65  mitted..**.** se
5a50: 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20  tMaster.**.**   
5a60: 57 68 65 6e 20 50 61 67 65 72 43 6f 6d 6d 69 74  When PagerCommit
5a70: 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20 63 61  PhaseOne() is ca
5a80: 6c 6c 65 64 20 74 6f 20 63 6f 6d 6d 69 74 20 61  lled to commit a
5a90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74   transaction, it
5aa0: 20 6d 61 79 0a 2a 2a 20 20 20 28 6f 72 20 6d 61   may.**   (or ma
5ab0: 79 20 6e 6f 74 29 20 73 70 65 63 69 66 79 20 61  y not) specify a
5ac0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
5ad0: 6e 61 6d 65 20 74 6f 20 62 65 20 77 72 69 74 74  name to be writt
5ae0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20  en into the .** 
5af0: 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62    journal file b
5b00: 65 66 6f 72 65 20 69 74 20 69 73 20 73 79 6e 63  efore it is sync
5b10: 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  ed to disk..**.*
5b20: 2a 20 20 20 57 68 65 74 68 65 72 20 6f 72 20 6e  *   Whether or n
5b30: 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ot a journal fil
5b40: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61 73  e contains a mas
5b50: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter-journal poin
5b60: 74 65 72 20 61 66 66 65 63 74 73 20 0a 2a 2a 20  ter affects .** 
5b70: 20 20 74 68 65 20 77 61 79 20 69 6e 20 77 68 69    the way in whi
5b80: 63 68 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ch the journal f
5b90: 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  ile is finalized
5ba0: 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e 73   after the trans
5bb0: 61 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 20 20  action is .**   
5bc0: 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c  committed or rol
5bd0: 6c 65 64 20 62 61 63 6b 20 77 68 65 6e 20 72 75  led back when ru
5be0: 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61  nning in "journa
5bf0: 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 22 20  l_mode=PERSIST" 
5c00: 6d 6f 64 65 2e 0a 2a 2a 20 20 20 49 66 20 61 20  mode..**   If a 
5c10: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65  journal file doe
5c20: 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20  s not contain a 
5c30: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70  master-journal p
5c40: 6f 69 6e 74 65 72 2c 20 69 74 20 69 73 0a 2a 2a  ointer, it is.**
5c50: 20 20 20 66 69 6e 61 6c 69 7a 65 64 20 62 79 20     finalized by 
5c60: 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65 20  overwriting the 
5c70: 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
5c80: 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65 73  ader with zeroes
5c90: 2e 20 49 66 0a 2a 2a 20 20 20 69 74 20 64 6f 65  . If.**   it doe
5ca0: 73 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73 74  s contain a mast
5cb0: 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er-journal point
5cc0: 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  er the journal f
5cd0: 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  ile is finalized
5ce0: 20 0a 2a 2a 20 20 20 62 79 20 74 72 75 6e 63 61   .**   by trunca
5cf0: 74 69 6e 67 20 69 74 20 74 6f 20 7a 65 72 6f 20  ting it to zero 
5d00: 62 79 74 65 73 2c 20 6a 75 73 74 20 61 73 20 69  bytes, just as i
5d10: 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
5d20: 20 77 65 72 65 20 0a 2a 2a 20 20 20 72 75 6e 6e   were .**   runn
5d30: 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f  ing in "journal_
5d40: 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 22 20 6d  mode=truncate" m
5d50: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f 75  ode..**.**   Jou
5d60: 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61 74 20  rnal files that 
5d70: 63 6f 6e 74 61 69 6e 20 6d 61 73 74 65 72 20 6a  contain master j
5d80: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20  ournal pointers 
5d90: 63 61 6e 6e 6f 74 20 62 65 20 66 69 6e 61 6c 69  cannot be finali
5da0: 7a 65 64 0a 2a 2a 20 20 20 73 69 6d 70 6c 79 20  zed.**   simply 
5db0: 62 79 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74  by overwriting t
5dc0: 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
5dd0: 2d 68 65 61 64 65 72 20 77 69 74 68 20 7a 65 72  -header with zer
5de0: 6f 65 73 2c 20 61 73 20 74 68 65 0a 2a 2a 20 20  oes, as the.**  
5df0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
5e00: 70 6f 69 6e 74 65 72 20 63 6f 75 6c 64 20 69 6e  pointer could in
5e10: 74 65 72 66 65 72 65 20 77 69 74 68 20 68 6f 74  terfere with hot
5e20: 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
5e30: 6b 20 6f 66 20 61 6e 79 0a 2a 2a 20 20 20 73 75  k of any.**   su
5e40: 62 73 65 71 75 65 6e 74 6c 79 20 69 6e 74 65 72  bsequently inter
5e50: 72 75 70 74 65 64 20 74 72 61 6e 73 61 63 74 69  rupted transacti
5e60: 6f 6e 20 74 68 61 74 20 72 65 75 73 65 73 20 74  on that reuses t
5e70: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
5e80: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66 6c 61  .**.**   The fla
5e90: 67 20 69 73 20 63 6c 65 61 72 65 64 20 61 73 20  g is cleared as 
5ea0: 73 6f 6f 6e 20 61 73 20 74 68 65 20 6a 6f 75 72  soon as the jour
5eb0: 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 69 6e 61  nal file is fina
5ec0: 6c 69 7a 65 64 20 28 65 69 74 68 65 72 0a 2a 2a  lized (either.**
5ed0: 20 20 20 62 79 20 50 61 67 65 72 43 6f 6d 6d 69     by PagerCommi
5ee0: 74 50 68 61 73 65 54 77 6f 20 6f 72 20 50 61 67  tPhaseTwo or Pag
5ef0: 65 72 52 6f 6c 6c 62 61 63 6b 29 2e 20 49 66 20  erRollback). If 
5f00: 61 6e 20 49 4f 20 65 72 72 6f 72 20 70 72 65 76  an IO error prev
5f10: 65 6e 74 73 20 74 68 65 0a 2a 2a 20 20 20 6a 6f  ents the.**   jo
5f20: 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20  urnal file from 
5f30: 62 65 69 6e 67 20 73 75 63 63 65 73 73 66 75 6c  being successful
5f40: 6c 79 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68  ly finalized, th
5f50: 65 20 73 65 74 4d 61 73 74 65 72 20 66 6c 61 67  e setMaster flag
5f60: 0a 2a 2a 20 20 20 69 73 20 63 6c 65 61 72 65 64  .**   is cleared
5f70: 20 61 6e 79 77 61 79 20 28 61 6e 64 20 74 68 65   anyway (and the
5f80: 20 70 61 67 65 72 20 77 69 6c 6c 20 6d 6f 76 65   pager will move
5f90: 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65 29   to ERROR state)
5fa0: 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 70 69  ..**.** doNotSpi
5fb0: 6c 6c 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20  ll.**.**   This 
5fc0: 76 61 72 69 61 62 6c 65 73 20 63 6f 6e 74 72 6f  variables contro
5fd0: 6c 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f  l the behavior o
5fe0: 66 20 63 61 63 68 65 2d 73 70 69 6c 6c 73 20 20  f cache-spills  
5ff0: 28 63 61 6c 6c 73 20 6d 61 64 65 20 62 79 0a 2a  (calls made by.*
6000: 2a 20 20 20 74 68 65 20 70 63 61 63 68 65 20 6d  *   the pcache m
6010: 6f 64 75 6c 65 20 74 6f 20 74 68 65 20 70 61 67  odule to the pag
6020: 65 72 53 74 72 65 73 73 28 29 20 72 6f 75 74 69  erStress() routi
6030: 6e 65 20 74 6f 20 77 72 69 74 65 20 63 61 63 68  ne to write cach
6040: 65 64 20 64 61 74 61 0a 2a 2a 20 20 20 74 6f 20  ed data.**   to 
6050: 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
6060: 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65  in order to free
6070: 20 75 70 20 6d 65 6d 6f 72 79 29 2e 0a 2a 2a 0a   up memory)..**.
6080: 2a 2a 20 20 20 57 68 65 6e 20 62 69 74 73 20 53  **   When bits S
6090: 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 6f 72 20  PILLFLAG_OFF or 
60a0: 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41  SPILLFLAG_ROLLBA
60b0: 43 4b 20 6f 66 20 64 6f 4e 6f 74 53 70 69 6c 6c  CK of doNotSpill
60c0: 20 61 72 65 20 73 65 74 2c 0a 2a 2a 20 20 20 77   are set,.**   w
60d0: 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
60e0: 74 61 62 61 73 65 20 66 72 6f 6d 20 70 61 67 65  tabase from page
60f0: 72 53 74 72 65 73 73 28 29 20 69 73 20 64 69 73  rStress() is dis
6100: 61 62 6c 65 64 20 61 6c 74 6f 67 65 74 68 65 72  abled altogether
6110: 2e 0a 2a 2a 20 20 20 54 68 65 20 53 50 49 4c 4c  ..**   The SPILL
6120: 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 63 61  FLAG_ROLLBACK ca
6130: 73 65 20 69 73 20 64 6f 6e 65 20 69 6e 20 61 20  se is done in a 
6140: 76 65 72 79 20 6f 62 73 63 75 72 65 20 63 61 73  very obscure cas
6150: 65 20 74 68 61 74 0a 2a 2a 20 20 20 63 6f 6d 65  e that.**   come
6160: 73 20 75 70 20 64 75 72 69 6e 67 20 73 61 76 65  s up during save
6170: 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 74  point rollback t
6180: 68 61 74 20 72 65 71 75 69 72 65 73 20 74 68 65  hat requires the
6190: 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 0a 2a   pcache module.*
61a0: 2a 20 20 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  *   to allocate 
61b0: 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 70 72  a new page to pr
61c0: 65 76 65 6e 74 20 74 68 65 20 6a 6f 75 72 6e 61  event the journa
61d0: 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69 6e  l file from bein
61e0: 67 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20 20 77  g written.**   w
61f0: 68 69 6c 65 20 69 74 20 69 73 20 62 65 69 6e 67  hile it is being
6200: 20 74 72 61 76 65 72 73 65 64 20 62 79 20 63 6f   traversed by co
6210: 64 65 20 69 6e 20 70 61 67 65 72 5f 70 6c 61 79  de in pager_play
6220: 62 61 63 6b 28 29 2e 20 20 54 68 65 20 53 50 49  back().  The SPI
6230: 4c 4c 46 4c 41 47 5f 4f 46 46 0a 2a 2a 20 20 20  LLFLAG_OFF.**   
6240: 63 61 73 65 20 69 73 20 61 20 75 73 65 72 20 70  case is a user p
6250: 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 20 0a 2a  reference..** .*
6260: 2a 20 20 20 49 66 20 74 68 65 20 53 50 49 4c 4c  *   If the SPILL
6270: 46 4c 41 47 5f 4e 4f 53 59 4e 43 20 62 69 74 20  FLAG_NOSYNC bit 
6280: 69 73 20 73 65 74 2c 20 77 72 69 74 69 6e 67 20  is set, writing 
6290: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
62a0: 66 72 6f 6d 20 70 61 67 65 72 53 74 72 65 73 73  from pagerStress
62b0: 28 29 0a 2a 2a 20 20 20 69 73 20 70 65 72 6d 69  ().**   is permi
62c0: 74 74 65 64 2c 20 62 75 74 20 73 79 6e 63 69 6e  tted, but syncin
62d0: 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  g the journal fi
62e0: 6c 65 20 69 73 20 6e 6f 74 2e 20 54 68 69 73 20  le is not. This 
62f0: 66 6c 61 67 20 69 73 20 73 65 74 0a 2a 2a 20 20  flag is set.**  
6300: 20 62 79 20 73 71 6c 69 74 65 33 50 61 67 65 72   by sqlite3Pager
6310: 57 72 69 74 65 28 29 20 77 68 65 6e 20 74 68 65  Write() when the
6320: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 65 63   file-system sec
6330: 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61 72 67  tor-size is larg
6340: 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20 74 68 65  er than.**   the
6350: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2d 73   database page-s
6360: 69 7a 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ize in order to 
6370: 70 72 65 76 65 6e 74 20 61 20 6a 6f 75 72 6e 61  prevent a journa
6380: 6c 20 73 79 6e 63 20 66 72 6f 6d 20 68 61 70 70  l sync from happ
6390: 65 6e 69 6e 67 20 0a 2a 2a 20 20 20 69 6e 20 62  ening .**   in b
63a0: 65 74 77 65 65 6e 20 74 68 65 20 6a 6f 75 72 6e  etween the journ
63b0: 61 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20 70 61  alling of two pa
63c0: 67 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ges on the same 
63d0: 73 65 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a 20 73  sector. .**.** s
63e0: 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a  ubjInMemory.**.*
63f0: 2a 20 20 20 54 68 69 73 20 69 73 20 61 20 62 6f  *   This is a bo
6400: 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65 2e 20  olean variable. 
6410: 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e  If true, then an
6420: 79 20 72 65 71 75 69 72 65 64 20 73 75 62 2d 6a  y required sub-j
6430: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20 6f  ournal.**   is o
6440: 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d  pened as an in-m
6450: 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69  emory journal fi
6460: 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20 74 68  le. If false, th
6470: 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  en in-memory.** 
6480: 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 61    sub-journals a
6490: 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72  re only used for
64a0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
64b0: 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   files..**.**   
64c0: 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73  This variable is
64d0: 20 75 70 64 61 74 65 64 20 62 79 20 74 68 65 20   updated by the 
64e0: 75 70 70 65 72 20 6c 61 79 65 72 20 65 61 63 68  upper layer each
64f0: 20 74 69 6d 65 20 61 20 6e 65 77 20 0a 2a 2a 20   time a new .** 
6500: 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74    write-transact
6510: 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2e 0a 2a  ion is opened..*
6520: 2a 0a 2a 2a 20 64 62 53 69 7a 65 2c 20 64 62 4f  *.** dbSize, dbO
6530: 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c 65 53  rigSize, dbFileS
6540: 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69  ize.**.**   Vari
6550: 61 62 6c 65 20 64 62 53 69 7a 65 20 69 73 20 73  able dbSize is s
6560: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
6570: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
6580: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
6590: 2a 2a 20 20 20 49 74 20 69 73 20 76 61 6c 69 64  **   It is valid
65a0: 20 69 6e 20 50 41 47 45 52 5f 52 45 41 44 45 52   in PAGER_READER
65b0: 20 61 6e 64 20 68 69 67 68 65 72 20 73 74 61 74   and higher stat
65c0: 65 73 20 28 61 6c 6c 20 73 74 61 74 65 73 20 65  es (all states e
65d0: 78 63 65 70 74 20 66 6f 72 0a 2a 2a 20 20 20 4f  xcept for.**   O
65e0: 50 45 4e 20 61 6e 64 20 45 52 52 4f 52 29 2e 20  PEN and ERROR). 
65f0: 0a 2a 2a 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20  .**.**   dbSize 
6600: 69 73 20 73 65 74 20 62 61 73 65 64 20 6f 6e 20  is set based on 
6610: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
6620: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77  database file, w
6630: 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20  hich may be .** 
6640: 20 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68    larger than th
6650: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
6660: 74 61 62 61 73 65 20 28 74 68 65 20 76 61 6c 75  tabase (the valu
6670: 65 20 73 74 6f 72 65 64 20 61 74 20 6f 66 66 73  e stored at offs
6680: 65 74 0a 2a 2a 20 20 20 32 38 20 6f 66 20 74 68  et.**   28 of th
6690: 65 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65  e database heade
66a0: 72 20 62 79 20 74 68 65 20 62 74 72 65 65 29 2e  r by the btree).
66b0: 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20   If the size of 
66c0: 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20 69 73  the file.**   is
66d0: 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20   not an integer 
66e0: 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20  multiple of the 
66f0: 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65 20 76  page-size, the v
6700: 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a  alue stored in.*
6710: 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 72 6f  *   dbSize is ro
6720: 75 6e 64 65 64 20 64 6f 77 6e 20 28 69 2e 65 2e  unded down (i.e.
6730: 20 61 20 35 4b 42 20 66 69 6c 65 20 77 69 74 68   a 5KB file with
6740: 20 32 4b 20 70 61 67 65 2d 73 69 7a 65 20 68 61   2K page-size ha
6750: 73 20 64 62 53 69 7a 65 3d 3d 32 29 2e 0a 2a 2a  s dbSize==2)..**
6760: 20 20 20 45 78 63 65 70 74 2c 20 61 6e 79 20 66     Except, any f
6770: 69 6c 65 20 74 68 61 74 20 69 73 20 67 72 65 61  ile that is grea
6780: 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65 73  ter than 0 bytes
6790: 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e 73   in size is cons
67a0: 69 64 65 72 65 64 0a 2a 2a 20 20 20 74 6f 20 68  idered.**   to h
67b0: 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  ave at least one
67c0: 20 70 61 67 65 2e 20 28 69 2e 65 2e 20 61 20 31   page. (i.e. a 1
67d0: 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20  KB file with 2K 
67e0: 70 61 67 65 2d 73 69 7a 65 20 6c 65 61 64 73 0a  page-size leads.
67f0: 2a 2a 20 20 20 74 6f 20 64 62 53 69 7a 65 3d 3d  **   to dbSize==
6800: 31 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75 72 69  1)..**.**   Duri
6810: 6e 67 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  ng a write-trans
6820: 61 63 74 69 6f 6e 2c 20 69 66 20 70 61 67 65 73  action, if pages
6830: 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65   with page-numbe
6840: 72 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a  rs greater than.
6850: 2a 2a 20 20 20 64 62 53 69 7a 65 20 61 72 65 20  **   dbSize are 
6860: 6d 6f 64 69 66 69 65 64 20 69 6e 20 74 68 65 20  modified in the 
6870: 63 61 63 68 65 2c 20 64 62 53 69 7a 65 20 69 73  cache, dbSize is
6880: 20 75 70 64 61 74 65 64 20 61 63 63 6f 72 64 69   updated accordi
6890: 6e 67 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d 69 6c  ngly..**   Simil
68a0: 61 72 6c 79 2c 20 69 66 20 74 68 65 20 64 61 74  arly, if the dat
68b0: 61 62 61 73 65 20 69 73 20 74 72 75 6e 63 61 74  abase is truncat
68c0: 65 64 20 75 73 69 6e 67 20 50 61 67 65 72 54 72  ed using PagerTr
68d0: 75 6e 63 61 74 65 49 6d 61 67 65 28 29 2c 20 0a  uncateImage(), .
68e0: 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 75  **   dbSize is u
68f0: 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  pdated..**.**   
6900: 56 61 72 69 61 62 6c 65 73 20 64 62 4f 72 69 67  Variables dbOrig
6910: 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c 65 53  Size and dbFileS
6920: 69 7a 65 20 61 72 65 20 76 61 6c 69 64 20 69 6e  ize are valid in
6930: 20 73 74 61 74 65 73 20 0a 2a 2a 20 20 20 50 41   states .**   PA
6940: 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
6950: 44 20 61 6e 64 20 68 69 67 68 65 72 2e 20 64 62  D and higher. db
6960: 4f 72 69 67 53 69 7a 65 20 69 73 20 61 20 63 6f  OrigSize is a co
6970: 70 79 20 6f 66 20 74 68 65 20 64 62 53 69 7a 65  py of the dbSize
6980: 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c 65 20 61  .**   variable a
6990: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
69a0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
69b0: 49 74 20 69 73 20 75 73 65 64 20 64 75 72 69 6e  It is used durin
69c0: 67 20 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a 20 20  g rollback,.**  
69d0: 20 61 6e 64 20 74 6f 20 64 65 74 65 72 6d 69 6e   and to determin
69e0: 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
69f0: 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62   pages need to b
6a00: 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 65 66  e journalled bef
6a10: 6f 72 65 0a 2a 2a 20 20 20 62 65 69 6e 67 20 6d  ore.**   being m
6a20: 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  odified..**.**  
6a30: 20 54 68 72 6f 75 67 68 6f 75 74 20 61 20 77 72   Throughout a wr
6a40: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite-transaction,
6a50: 20 64 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e 74   dbFileSize cont
6a60: 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 6f 66  ains the size of
6a70: 0a 2a 2a 20 20 20 74 68 65 20 66 69 6c 65 20 6f  .**   the file o
6a80: 6e 20 64 69 73 6b 20 69 6e 20 70 61 67 65 73 2e  n disk in pages.
6a90: 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 61 20   It is set to a 
6aa0: 63 6f 70 79 20 6f 66 20 64 62 53 69 7a 65 20 77  copy of dbSize w
6ab0: 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 77 72 69  hen the.**   wri
6ac0: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
6ad0: 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2c 20  s first opened, 
6ae0: 61 6e 64 20 75 70 64 61 74 65 64 20 77 68 65 6e  and updated when
6af0: 20 56 46 53 20 63 61 6c 6c 73 20 61 72 65 20 6d   VFS calls are m
6b00: 61 64 65 0a 2a 2a 20 20 20 74 6f 20 77 72 69 74  ade.**   to writ
6b10: 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 74 68  e or truncate th
6b20: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
6b30: 6f 6e 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a 2a 20  on disk. .**.** 
6b40: 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f    The only reaso
6b50: 6e 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65  n the dbFileSize
6b60: 20 76 61 72 69 61 62 6c 65 20 69 73 20 72 65 71   variable is req
6b70: 75 69 72 65 64 20 69 73 20 74 6f 20 73 75 70 70  uired is to supp
6b80: 72 65 73 73 20 0a 2a 2a 20 20 20 75 6e 6e 65 63  ress .**   unnec
6b90: 65 73 73 61 72 79 20 63 61 6c 6c 73 20 74 6f 20  essary calls to 
6ba0: 78 54 72 75 6e 63 61 74 65 28 29 20 61 66 74 65  xTruncate() afte
6bb0: 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  r committing a t
6bc0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 2c 20  ransaction. If, 
6bd0: 0a 2a 2a 20 20 20 77 68 65 6e 20 61 20 74 72 61  .**   when a tra
6be0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
6bf0: 69 74 74 65 64 2c 20 74 68 65 20 64 62 46 69 6c  itted, the dbFil
6c00: 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 69  eSize variable i
6c10: 6e 64 69 63 61 74 65 73 20 0a 2a 2a 20 20 20 74  ndicates .**   t
6c20: 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
6c30: 20 66 69 6c 65 20 69 73 20 6c 61 72 67 65 72 20   file is larger 
6c40: 74 68 61 6e 20 74 68 65 20 64 61 74 61 62 61 73  than the databas
6c50: 65 20 69 6d 61 67 65 20 28 50 61 67 65 72 2e 64  e image (Pager.d
6c60: 62 53 69 7a 65 29 2c 20 0a 2a 2a 20 20 20 70 61  bSize), .**   pa
6c70: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69  ger_truncate() i
6c80: 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 20 70 61  s called. The pa
6c90: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 63  ger_truncate() c
6ca0: 61 6c 6c 20 75 73 65 73 20 78 46 69 6c 65 73 69  all uses xFilesi
6cb0: 7a 65 28 29 0a 2a 2a 20 20 20 74 6f 20 6d 65 61  ze().**   to mea
6cc0: 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73  sure the databas
6cd0: 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2c 20  e file on disk, 
6ce0: 61 6e 64 20 74 68 65 6e 20 74 72 75 6e 63 61 74  and then truncat
6cf0: 65 73 20 69 74 20 69 66 20 72 65 71 75 69 72 65  es it if require
6d00: 64 2e 0a 2a 2a 20 20 20 64 62 46 69 6c 65 53 69  d..**   dbFileSi
6d10: 7a 65 20 69 73 20 6e 6f 74 20 75 73 65 64 20 77  ze is not used w
6d20: 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  hen rolling back
6d30: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
6d40: 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a 20  In this case.** 
6d50: 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
6d60: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 75 6e 63  () is called unc
6d70: 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 28 77 68  onditionally (wh
6d80: 69 63 68 20 6d 65 61 6e 73 20 74 68 65 72 65 20  ich means there 
6d90: 6d 61 79 20 62 65 0a 2a 2a 20 20 20 61 20 63 61  may be.**   a ca
6da0: 6c 6c 20 74 6f 20 78 46 69 6c 65 73 69 7a 65 28  ll to xFilesize(
6db0: 29 20 74 68 61 74 20 69 73 20 6e 6f 74 20 73 74  ) that is not st
6dc0: 72 69 63 74 6c 79 20 72 65 71 75 69 72 65 64 29  rictly required)
6dd0: 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65  . In either case
6de0: 2c 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74 72 75  ,.**   pager_tru
6df0: 6e 63 61 74 65 28 29 20 6d 61 79 20 63 61 75 73  ncate() may caus
6e00: 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  e the file to be
6e10: 63 6f 6d 65 20 73 6d 61 6c 6c 65 72 20 6f 72 20  come smaller or 
6e20: 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 64 62  larger..**.** db
6e30: 48 69 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20  HintSize.**.**  
6e40: 20 54 68 65 20 64 62 48 69 6e 74 53 69 7a 65 20   The dbHintSize 
6e50: 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
6e60: 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 6e 75   to limit the nu
6e70: 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 6d 61  mber of calls ma
6e80: 64 65 20 74 6f 0a 2a 2a 20 20 20 74 68 65 20 56  de to.**   the V
6e90: 46 53 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  FS xFileControl(
6ea0: 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 29  FCNTL_SIZE_HINT)
6eb0: 20 6d 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a 2a 20   method. .**.** 
6ec0: 20 20 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20    dbHintSize is 
6ed0: 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20 6f 66  set to a copy of
6ee0: 20 74 68 65 20 64 62 53 69 7a 65 20 76 61 72 69   the dbSize vari
6ef0: 61 62 6c 65 20 77 68 65 6e 20 61 0a 2a 2a 20 20  able when a.**  
6f00: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
6f10: 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 28 61 74  on is opened (at
6f20: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61   the same time a
6f30: 73 20 64 62 46 69 6c 65 53 69 7a 65 20 61 6e 64  s dbFileSize and
6f40: 0a 2a 2a 20 20 20 64 62 4f 72 69 67 53 69 7a 65  .**   dbOrigSize
6f50: 29 2e 20 49 66 20 74 68 65 20 78 46 69 6c 65 43  ). If the xFileC
6f60: 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f 53 49 5a  ontrol(FCNTL_SIZ
6f70: 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f 64 20 69  E_HINT) method i
6f80: 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20 64  s called,.**   d
6f90: 62 48 69 6e 74 53 69 7a 65 20 69 73 20 69 6e 63  bHintSize is inc
6fa0: 72 65 61 73 65 64 20 74 6f 20 74 68 65 20 6e 75  reased to the nu
6fb0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68  mber of pages th
6fc0: 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  at correspond to
6fd0: 20 74 68 65 0a 2a 2a 20 20 20 73 69 7a 65 2d 68   the.**   size-h
6fe0: 69 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68  int passed to th
6ff0: 65 20 6d 65 74 68 6f 64 20 63 61 6c 6c 2e 20 53  e method call. S
7000: 65 65 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70  ee pager_write_p
7010: 61 67 65 6c 69 73 74 28 29 20 66 6f 72 20 0a 2a  agelist() for .*
7020: 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a  *   details..**.
7030: 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a 2a  ** errCode.**.**
7040: 20 20 20 54 68 65 20 50 61 67 65 72 2e 65 72 72     The Pager.err
7050: 43 6f 64 65 20 76 61 72 69 61 62 6c 65 20 69 73  Code variable is
7060: 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65 64 20   only ever used 
7070: 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  in PAGER_ERROR s
7080: 74 61 74 65 2e 20 49 74 0a 2a 2a 20 20 20 69 73  tate. It.**   is
7090: 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 69 6e 20   set to zero in 
70a0: 61 6c 6c 20 6f 74 68 65 72 20 73 74 61 74 65 73  all other states
70b0: 2e 20 49 6e 20 50 41 47 45 52 5f 45 52 52 4f 52  . In PAGER_ERROR
70c0: 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65 72   state, Pager.er
70d0: 72 43 6f 64 65 20 0a 2a 2a 20 20 20 69 73 20 61  rCode .**   is a
70e0: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 53 51 4c  lways set to SQL
70f0: 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45  ITE_FULL, SQLITE
7100: 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66  _IOERR or one of
7110: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 45 52   the SQLITE_IOER
7120: 52 5f 58 58 58 20 0a 2a 2a 20 20 20 73 75 62 2d  R_XXX .**   sub-
7130: 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 72 75 63 74  codes..*/.struct
7140: 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69 74   Pager {.  sqlit
7150: 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20  e3_vfs *pVfs;   
7160: 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75 6e         /* OS fun
7170: 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66 6f  ctions to use fo
7180: 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78 63  r IO */.  u8 exc
7190: 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20 20  lusiveMode;     
71a0: 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e        /* Boolean
71b0: 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e  . True if lockin
71c0: 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56  g_mode==EXCLUSIV
71d0: 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61  E */.  u8 journa
71e0: 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  lMode;          
71f0: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
7200: 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
7210: 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20  DE_* values */. 
7220: 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20   u8 useJournal; 
7230: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7240: 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  Use a rollback j
7250: 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66  ournal on this f
7260: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53 79  ile */.  u8 noSy
7270: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
7280: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73       /* Do not s
7290: 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
72a0: 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20  if true */.  u8 
72b0: 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20  fullSync;       
72c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65           /* Do e
72d0: 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68  xtra syncs of th
72e0: 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f  e journal for ro
72f0: 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38  bustness */.  u8
7300: 20 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 3b 20   ckptSyncFlags; 
7310: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 59 4e            /* SYN
7320: 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43  C_NORMAL or SYNC
7330: 5f 46 55 4c 4c 20 66 6f 72 20 63 68 65 63 6b 70  _FULL for checkp
7340: 6f 69 6e 74 20 2a 2f 0a 20 20 75 38 20 77 61 6c  oint */.  u8 wal
7350: 53 79 6e 63 46 6c 61 67 73 3b 20 20 20 20 20 20  SyncFlags;      
7360: 20 20 20 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f        /* SYNC_NO
7370: 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c  RMAL or SYNC_FUL
7380: 4c 20 66 6f 72 20 77 61 6c 20 77 72 69 74 65 73  L for wal writes
7390: 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 46 6c 61   */.  u8 syncFla
73a0: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
73b0: 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c    /* SYNC_NORMAL
73c0: 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 6f 74   or SYNC_FULL ot
73d0: 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 75 38 20  herwise */.  u8 
73e0: 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20  tempFile;       
73f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c           /* zFil
7400: 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f  ename is a tempo
7410: 72 61 72 79 20 6f 72 20 69 6d 6d 75 74 61 62 6c  rary or immutabl
7420: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e  e file */.  u8 n
7430: 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  oLock;          
7440: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
7450: 74 20 6c 6f 63 6b 20 28 65 78 63 65 70 74 20 69  t lock (except i
7460: 6e 20 57 41 4c 20 6d 6f 64 65 29 20 2a 2f 0a 20  n WAL mode) */. 
7470: 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20   u8 readOnly;   
7480: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7490: 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d  True for a read-
74a0: 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f  only database */
74b0: 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20 20 20  .  u8 memDb;    
74c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
74d0: 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69 62 69  * True to inhibi
74e0: 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a  t all file I/O *
74f0: 2f 0a 0a 20 20 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /..  /**********
7500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7540: 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  ** The follow
7550: 69 6e 67 20 62 6c 6f 63 6b 20 63 6f 6e 74 61 69  ing block contai
7560: 6e 73 20 74 68 6f 73 65 20 63 6c 61 73 73 20 6d  ns those class m
7570: 65 6d 62 65 72 73 20 74 68 61 74 20 63 68 61 6e  embers that chan
7580: 67 65 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 72  ge during.  ** r
7590: 6f 75 74 69 6e 65 20 6f 70 65 72 61 74 69 6f 6e  outine operation
75a0: 2e 20 20 43 6c 61 73 73 20 6d 65 6d 62 65 72 73  .  Class members
75b0: 20 6e 6f 74 20 69 6e 20 74 68 69 73 20 62 6c 6f   not in this blo
75c0: 63 6b 20 61 72 65 20 65 69 74 68 65 72 20 66 69  ck are either fi
75d0: 78 65 64 0a 20 20 2a 2a 20 77 68 65 6e 20 74 68  xed.  ** when th
75e0: 65 20 70 61 67 65 72 20 69 73 20 66 69 72 73 74  e pager is first
75f0: 20 63 72 65 61 74 65 64 20 6f 72 20 65 6c 73 65   created or else
7600: 20 6f 6e 6c 79 20 63 68 61 6e 67 65 20 77 68 65   only change whe
7610: 6e 20 74 68 65 72 65 20 69 73 20 61 0a 20 20 2a  n there is a.  *
7620: 2a 20 73 69 67 6e 69 66 69 63 61 6e 74 20 6d 6f  * significant mo
7630: 64 65 20 63 68 61 6e 67 65 20 28 73 75 63 68 20  de change (such 
7640: 61 73 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  as changing the 
7650: 70 61 67 65 5f 73 69 7a 65 2c 20 6c 6f 63 6b 69  page_size, locki
7660: 6e 67 5f 6d 6f 64 65 2c 0a 20 20 2a 2a 20 6f 72  ng_mode,.  ** or
7670: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   the journal_mod
7680: 65 29 2e 20 20 46 72 6f 6d 20 61 6e 6f 74 68 65  e).  From anothe
7690: 72 20 76 69 65 77 2c 20 74 68 65 73 65 20 63 6c  r view, these cl
76a0: 61 73 73 20 6d 65 6d 62 65 72 73 20 64 65 73 63  ass members desc
76b0: 72 69 62 65 0a 20 20 2a 2a 20 74 68 65 20 22 73  ribe.  ** the "s
76c0: 74 61 74 65 22 20 6f 66 20 74 68 65 20 70 61 67  tate" of the pag
76d0: 65 72 2c 20 77 68 69 6c 65 20 6f 74 68 65 72 20  er, while other 
76e0: 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20 64 65  class members de
76f0: 73 63 72 69 62 65 20 74 68 65 0a 20 20 2a 2a 20  scribe the.  ** 
7700: 22 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 22 20  "configuration" 
7710: 6f 66 20 74 68 65 20 70 61 67 65 72 2e 0a 20 20  of the pager..  
7720: 2a 2f 0a 20 20 75 38 20 65 53 74 61 74 65 3b 20  */.  u8 eState; 
7730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7740: 20 2f 2a 20 50 61 67 65 72 20 73 74 61 74 65 20   /* Pager state 
7750: 28 4f 50 45 4e 2c 20 52 45 41 44 45 52 2c 20 57  (OPEN, READER, W
7760: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 2e 2e 29 20  RITER_LOCKED..) 
7770: 2a 2f 0a 20 20 75 38 20 65 4c 6f 63 6b 3b 20 20  */.  u8 eLock;  
7780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7790: 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 6f 63 6b   /* Current lock
77a0: 20 68 65 6c 64 20 6f 6e 20 64 61 74 61 62 61 73   held on databas
77b0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 63  e file */.  u8 c
77c0: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3b 20  hangeCountDone; 
77d0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 61          /* Set a
77e0: 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74 69 6e  fter incrementin
77f0: 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  g the change-cou
7800: 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 73 65 74  nter */.  u8 set
7810: 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20  Master;         
7820: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
7830: 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73 20   a m-j name has 
7840: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
7850: 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64 6f 4e  jrnl */.  u8 doN
7860: 6f 74 53 70 69 6c 6c 3b 20 20 20 20 20 20 20 20  otSpill;        
7870: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
7880: 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20  spill the cache 
7890: 77 68 65 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f  when non-zero */
78a0: 0a 20 20 75 38 20 73 75 62 6a 49 6e 4d 65 6d 6f  .  u8 subjInMemo
78b0: 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ry;            /
78c0: 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 69 6e  * True to use in
78d0: 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f 75 72  -memory sub-jour
78e0: 6e 61 6c 73 20 2a 2f 0a 20 20 75 38 20 62 55 73  nals */.  u8 bUs
78f0: 65 46 65 74 63 68 3b 20 20 20 20 20 20 20 20 20  eFetch;         
7900: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
7910: 20 75 73 65 20 78 46 65 74 63 68 28 29 20 2a 2f   use xFetch() */
7920: 0a 20 20 75 38 20 68 61 73 42 65 65 6e 55 73 65  .  u8 hasBeenUse
7930: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  d;             /
7940: 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20 63 6f  * True if any co
7950: 6e 74 65 6e 74 20 70 72 65 76 69 6f 75 73 6c 79  ntent previously
7960: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 69 73 20   read from this 
7970: 70 61 67 65 72 2a 2f 0a 20 20 50 67 6e 6f 20 64  pager*/.  Pgno d
7980: 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  bSize;          
7990: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
79a0: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
79b0: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50 67  database */.  Pg
79c0: 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20 20  no dbOrigSize;  
79d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53            /* dbS
79e0: 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63  ize before the c
79f0: 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
7a00: 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 46  on */.  Pgno dbF
7a10: 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  ileSize;        
7a20: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
7a30: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
7a40: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
7a50: 20 50 67 6e 6f 20 64 62 48 69 6e 74 53 69 7a 65   Pgno dbHintSize
7a60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
7a70: 56 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f 20  Value passed to 
7a80: 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20  FCNTL_SIZE_HINT 
7a90: 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 65 72  call */.  int er
7aa0: 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  rCode;          
7ab0: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
7ac0: 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66  several kinds of
7ad0: 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74   errors */.  int
7ae0: 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20   nRec;          
7af0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
7b00: 73 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69 6e  s journalled sin
7b10: 63 65 20 6c 61 73 74 20 6a 2d 68 65 61 64 65 72  ce last j-header
7b20: 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75 33   written */.  u3
7b30: 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20  2 cksumInit;    
7b40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61            /* Qua
7b50: 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  si-random value 
7b60: 61 64 64 65 64 20 74 6f 20 65 76 65 72 79 20 63  added to every c
7b70: 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33 32  hecksum */.  u32
7b80: 20 6e 53 75 62 52 65 63 3b 20 20 20 20 20 20 20   nSubRec;       
7b90: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
7ba0: 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 77 72  er of records wr
7bb0: 69 74 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f 75  itten to sub-jou
7bc0: 72 6e 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65 63  rnal */.  Bitvec
7bd0: 20 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20   *pInJournal;   
7be0: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74        /* One bit
7bf0: 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69   for each page i
7c00: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
7c10: 69 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ile */.  sqlite3
7c20: 5f 66 69 6c 65 20 2a 66 64 3b 20 20 20 20 20 20  _file *fd;      
7c30: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
7c40: 63 72 69 70 74 6f 72 20 66 6f 72 20 64 61 74 61  criptor for data
7c50: 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  base */.  sqlite
7c60: 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20  3_file *jfd;    
7c70: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
7c80: 73 63 72 69 70 74 6f 72 20 66 6f 72 20 6d 61 69  scriptor for mai
7c90: 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73  n journal */.  s
7ca0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a 66  qlite3_file *sjf
7cb0: 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  d;         /* Fi
7cc0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
7cd0: 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f  r sub-journal */
7ce0: 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66  .  i64 journalOf
7cf0: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  f;             /
7d00: 2a 20 43 75 72 72 65 6e 74 20 77 72 69 74 65 20  * Current write 
7d10: 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f  offset in the jo
7d20: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
7d30: 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20  i64 journalHdr; 
7d40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
7d50: 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72  yte offset to pr
7d60: 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68  evious journal h
7d70: 65 61 64 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  eader */.  sqlit
7d80: 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b  e3_backup *pBack
7d90: 75 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  up;    /* Pointe
7da0: 72 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e 67  r to list of ong
7db0: 6f 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f 63  oing backup proc
7dc0: 65 73 73 65 73 20 2a 2f 0a 20 20 50 61 67 65 72  esses */.  Pager
7dd0: 53 61 76 65 70 6f 69 6e 74 20 2a 61 53 61 76 65  Savepoint *aSave
7de0: 70 6f 69 6e 74 3b 20 2f 2a 20 41 72 72 61 79 20  point; /* Array 
7df0: 6f 66 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  of active savepo
7e00: 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  ints */.  int nS
7e10: 61 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20  avepoint;       
7e20: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7e30: 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61  of elements in a
7e40: 53 61 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a 20  Savepoint[] */. 
7e50: 20 75 33 32 20 69 44 61 74 61 56 65 72 73 69 6f   u32 iDataVersio
7e60: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  n;           /* 
7e70: 43 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72  Changes whenever
7e80: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65 6e   database conten
7e90: 74 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 63  t changes */.  c
7ea0: 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 31  har dbFileVers[1
7eb0: 36 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 68  6];        /* Ch
7ec0: 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20 64  anges whenever d
7ed0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61  atabase file cha
7ee0: 6e 67 65 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e  nges */..  int n
7ef0: 4d 6d 61 70 4f 75 74 3b 20 20 20 20 20 20 20 20  MmapOut;        
7f00: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
7f10: 20 6f 66 20 6d 6d 61 70 20 70 61 67 65 73 20 63   of mmap pages c
7f20: 75 72 72 65 6e 74 6c 79 20 6f 75 74 73 74 61 6e  urrently outstan
7f30: 64 69 6e 67 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ding */.  sqlite
7f40: 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 3b 20  3_int64 szMmap; 
7f50: 20 20 20 20 20 20 2f 2a 20 44 65 73 69 72 65 64        /* Desired
7f60: 20 6d 61 78 69 6d 75 6d 20 6d 6d 61 70 20 73 69   maximum mmap si
7f70: 7a 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  ze */.  PgHdr *p
7f80: 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 20 20 20  MmapFreelist;   
7f90: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66      /* List of f
7fa0: 72 65 65 20 6d 6d 61 70 20 70 61 67 65 20 68 65  ree mmap page he
7fb0: 61 64 65 72 73 20 28 70 44 69 72 74 79 29 20 2a  aders (pDirty) *
7fc0: 2f 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 6e 64 20  /.  /*.  ** End 
7fd0: 6f 66 20 74 68 65 20 72 6f 75 74 69 6e 65 6c 79  of the routinely
7fe0: 2d 63 68 61 6e 67 69 6e 67 20 63 6c 61 73 73 20  -changing class 
7ff0: 6d 65 6d 62 65 72 73 0a 20 20 2a 2a 2a 2a 2a 2a  members.  ******
8000: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8040: 2a 2a 2a 2a 2a 2f 0a 0a 20 20 75 31 36 20 6e 45  *****/..  u16 nE
8050: 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20  xtra;           
8060: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69        /* Add thi
8070: 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20  s many bytes to 
8080: 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  each in-memory p
8090: 61 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52 65  age */.  i16 nRe
80a0: 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20  serve;          
80b0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
80c0: 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61  f unused bytes a
80d0: 74 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70 61  t end of each pa
80e0: 67 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46  ge */.  u32 vfsF
80f0: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
8100: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72      /* Flags for
8110: 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70   sqlite3_vfs.xOp
8120: 65 6e 28 29 20 2a 2f 0a 20 20 75 33 32 20 73 65  en() */.  u32 se
8130: 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20  ctorSize;       
8140: 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64        /* Assumed
8150: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72   sector size dur
8160: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  ing rollback */.
8170: 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20    int pageSize; 
8180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8190: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
81a0: 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20   in a page */.  
81b0: 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20  Pgno mxPgno;    
81c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
81d0: 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73  aximum allowed s
81e0: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
81f0: 61 73 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  ase */.  i64 jou
8200: 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20  rnalSizeLimit;  
8210: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69 6d       /* Size lim
8220: 69 74 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e  it for persisten
8230: 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  t journal files 
8240: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  */.  char *zFile
8250: 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
8260: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
8270: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
8280: 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61  .  char *zJourna
8290: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
82a0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f  * Name of the jo
82b0: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
82c0: 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c  int (*xBusyHandl
82d0: 65 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20 46  er)(void*); /* F
82e0: 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20  unction to call 
82f0: 77 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20 76  when busy */.  v
8300: 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65  oid *pBusyHandle
8310: 72 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43 6f  rArg;      /* Co
8320: 6e 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20 66  ntext argument f
8330: 6f 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20  or xBusyHandler 
8340: 2a 2f 0a 20 20 69 6e 74 20 61 53 74 61 74 5b 33  */.  int aStat[3
8350: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ];              
8360: 20 2f 2a 20 54 6f 74 61 6c 20 63 61 63 68 65 20   /* Total cache 
8370: 68 69 74 73 2c 20 6d 69 73 73 65 73 20 61 6e 64  hits, misses and
8380: 20 77 72 69 74 65 73 20 2a 2f 0a 23 69 66 64 65   writes */.#ifde
8390: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
83a0: 69 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20 20  int nRead;      
83b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
83c0: 61 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65  atabase pages re
83d0: 61 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76  ad */.#endif.  v
83e0: 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29  oid (*xReiniter)
83f0: 28 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43 61  (DbPage*); /* Ca
8400: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ll this routine 
8410: 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70  when reloading p
8420: 61 67 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53  ages */.#ifdef S
8430: 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
8440: 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63    void *(*xCodec
8450: 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67  )(void*,void*,Pg
8460: 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74  no,int); /* Rout
8470: 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64  ine for en/decod
8480: 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f  ing data */.  vo
8490: 69 64 20 28 2a 78 43 6f 64 65 63 53 69 7a 65 43  id (*xCodecSizeC
84a0: 68 6e 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 69  hng)(void*,int,i
84b0: 6e 74 29 3b 20 2f 2a 20 4e 6f 74 69 66 79 20 6f  nt); /* Notify o
84c0: 66 20 70 61 67 65 20 73 69 7a 65 20 63 68 61 6e  f page size chan
84d0: 67 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ges */.  void (*
84e0: 78 43 6f 64 65 63 46 72 65 65 29 28 76 6f 69 64  xCodecFree)(void
84f0: 2a 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *);             
8500: 2f 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66 6f  /* Destructor fo
8510: 72 20 74 68 65 20 63 6f 64 65 63 20 2a 2f 0a 20  r the codec */. 
8520: 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 3b 20 20   void *pCodec;  
8530: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8540: 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  First argument t
8550: 6f 20 78 43 6f 64 65 63 2e 2e 2e 20 6d 65 74 68  o xCodec... meth
8560: 6f 64 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ods */.#endif.  
8570: 63 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b  char *pTmpSpace;
8580: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
8590: 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79  ager.pageSize by
85a0: 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72  tes of space for
85b0: 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 50 43   tmp use */.  PC
85c0: 61 63 68 65 20 2a 70 50 43 61 63 68 65 3b 20 20  ache *pPCache;  
85d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
85e0: 6e 74 65 72 20 74 6f 20 70 61 67 65 20 63 61 63  nter to page cac
85f0: 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 69 66  he object */.#if
8600: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
8610: 5f 57 41 4c 0a 20 20 57 61 6c 20 2a 70 57 61 6c  _WAL.  Wal *pWal
8620: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8630: 20 20 20 2f 2a 20 57 72 69 74 65 2d 61 68 65 61     /* Write-ahea
8640: 64 20 6c 6f 67 20 75 73 65 64 20 62 79 20 22 6a  d log used by "j
8650: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 22  ournal_mode=wal"
8660: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 57 61 6c   */.  char *zWal
8670: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8680: 20 20 2f 2a 20 46 69 6c 65 20 6e 61 6d 65 20 66    /* File name f
8690: 6f 72 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c  or write-ahead l
86a0: 6f 67 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  og */.#endif.};.
86b0: 0a 2f 2a 0a 2a 2a 20 49 6e 64 65 78 65 73 20 66  ./*.** Indexes f
86c0: 6f 72 20 75 73 65 20 77 69 74 68 20 50 61 67 65  or use with Page
86d0: 72 2e 61 53 74 61 74 5b 5d 2e 20 54 68 65 20 50  r.aStat[]. The P
86e0: 61 67 65 72 2e 61 53 74 61 74 5b 5d 20 61 72 72  ager.aStat[] arr
86f0: 61 79 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74  ay contains.** t
8700: 68 65 20 76 61 6c 75 65 73 20 61 63 63 65 73 73  he values access
8710: 65 64 20 62 79 20 70 61 73 73 69 6e 67 20 53 51  ed by passing SQ
8720: 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41  LITE_DBSTATUS_CA
8730: 43 48 45 5f 48 49 54 2c 20 43 41 43 48 45 5f 4d  CHE_HIT, CACHE_M
8740: 49 53 53 20 0a 2a 2a 20 6f 72 20 43 41 43 48 45  ISS .** or CACHE
8750: 5f 57 52 49 54 45 20 74 6f 20 73 71 6c 69 74 65  _WRITE to sqlite
8760: 33 5f 64 62 5f 73 74 61 74 75 73 28 29 2e 0a 2a  3_db_status()..*
8770: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
8780: 53 54 41 54 5f 48 49 54 20 20 20 30 0a 23 64 65  STAT_HIT   0.#de
8790: 66 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f  fine PAGER_STAT_
87a0: 4d 49 53 53 20 20 31 0a 23 64 65 66 69 6e 65 20  MISS  1.#define 
87b0: 50 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45  PAGER_STAT_WRITE
87c0: 20 32 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f   2../*.** The fo
87d0: 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76  llowing global v
87e0: 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63 6f  ariables hold co
87f0: 75 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72 0a  unters used for.
8800: 2a 2a 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f  ** testing purpo
8810: 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73 65  ses only.  These
8820: 20 76 61 72 69 61 62 6c 65 73 20 64 6f 20 6e 6f   variables do no
8830: 74 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61 20  t exist in.** a 
8840: 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75 69 6c  non-testing buil
8850: 64 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62  d.  These variab
8860: 6c 65 73 20 61 72 65 20 6e 6f 74 20 74 68 72 65  les are not thre
8870: 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66 64  ad-safe..*/.#ifd
8880: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
8890: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
88a0: 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d 20  _readdb_count = 
88b0: 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  0;    /* Number 
88c0: 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72 65  of full pages re
88d0: 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e  ad from DB */.in
88e0: 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
88f0: 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d 20  writedb_count = 
8900: 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  0;   /* Number o
8910: 66 20 66 75 6c 6c 20 70 61 67 65 73 20 77 72 69  f full pages wri
8920: 74 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69 6e  tten to DB */.in
8930: 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
8940: 77 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20 30  writej_count = 0
8950: 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ;    /* Number o
8960: 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20  f pages written 
8970: 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 20  to journal */.# 
8980: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43  define PAGER_INC
8990: 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a  R(v)  v++.#else.
89a0: 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49  # define PAGER_I
89b0: 4e 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a 0a  NCR(v).#endif...
89c0: 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66  ./*.** Journal f
89d0: 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68 20  iles begin with 
89e0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61  the following ma
89f0: 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68 65  gic string.  The
8a00: 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74   data.** was obt
8a10: 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f  ained from /dev/
8a20: 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75  random.  It is u
8a30: 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61  sed only as a sa
8a40: 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a  nity check..**.*
8a50: 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e 20  * Since version 
8a60: 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e  2.8.0, the journ
8a70: 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69  al format contai
8a80: 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61  ns additional sa
8a90: 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67  nity.** checking
8aa0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49   information.  I
8ab0: 66 20 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c  f the power fail
8ac0: 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  s while the jour
8ad0: 6e 61 6c 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20  nal is being.** 
8ae0: 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61  written, semi-ra
8af0: 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61 74  ndom garbage dat
8b00: 61 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 69  a might appear i
8b10: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  n the journal.**
8b20: 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77 65   file after powe
8b30: 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20 20  r is restored.  
8b40: 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  If an attempt is
8b50: 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f   then made.** to
8b60: 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61   roll the journa
8b70: 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61  l back, the data
8b80: 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63 6f  base could be co
8b90: 72 72 75 70 74 65 64 2e 20 20 54 68 65 20 61 64  rrupted.  The ad
8ba0: 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69  ditional.** sani
8bb0: 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74 61  ty checking data
8bc0: 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74   is an attempt t
8bd0: 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 67  o discover the g
8be0: 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a  arbage in the.**
8bf0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e   journal and ign
8c00: 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  ore it..**.** Th
8c10: 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  e sanity checkin
8c20: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  g information fo
8c30: 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61  r the new journa
8c40: 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74  l format consist
8c50: 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69 74  s.** of a 32-bit
8c60: 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63   checksum on eac
8c70: 68 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 20  h page of data. 
8c80: 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63 6f   The checksum co
8c90: 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65  vers both.** the
8ca0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64   page number and
8cb0: 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61 67   the pPager->pag
8cc0: 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64  eSize bytes of d
8cd0: 61 74 61 20 66 6f 72 20 74 68 65 20 70 61 67 65  ata for the page
8ce0: 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d 20  ..** This cksum 
8cf0: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
8d00: 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64 6f  o a 32-bit rando
8d10: 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61 70 70  m value that app
8d20: 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a  ears in the.** j
8d30: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67 68  ournal file righ
8d40: 74 20 61 66 74 65 72 20 74 68 65 20 68 65 61 64  t after the head
8d50: 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d 20  er.  The random 
8d60: 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20 69  initializer is i
8d70: 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63  mportant,.** bec
8d80: 61 75 73 65 20 67 61 72 62 61 67 65 20 64 61 74  ause garbage dat
8d90: 61 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61  a that appears a
8da0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a  t the end of a j
8db0: 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79  ournal is likely
8dc0: 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77 61  .** data that wa
8dd0: 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72 20  s once in other 
8de0: 66 69 6c 65 73 20 74 68 61 74 20 68 61 76 65 20  files that have 
8df0: 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65 64  now been deleted
8e00: 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61 72  .  If the.** gar
8e10: 62 61 67 65 20 64 61 74 61 20 63 61 6d 65 20 66  bage data came f
8e20: 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20  rom an obsolete 
8e30: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
8e40: 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67 68  e checksums migh
8e50: 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74 2e  t.** be correct.
8e60: 20 20 42 75 74 20 62 79 20 69 6e 69 74 69 61 6c    But by initial
8e70: 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73  izing the checks
8e80: 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c  um to random val
8e90: 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64  ue which.** is d
8ea0: 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65  ifferent for eve
8eb0: 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d  ry journal, we m
8ec0: 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69 73  inimize that ris
8ed0: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  k..*/.static con
8ee0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
8ef0: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
8f00: 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64   = {.  0xd9, 0xd
8f10: 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30  5, 0x05, 0xf9, 0
8f20: 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c  x20, 0xa1, 0x63,
8f30: 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a   0xd7,.};../*.**
8f40: 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   The size of the
8f50: 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 72 65   of each page re
8f60: 63 6f 72 64 20 69 6e 20 74 68 65 20 6a 6f 75 72  cord in the jour
8f70: 6e 61 6c 20 69 73 20 67 69 76 65 6e 20 62 79 0a  nal is given by.
8f80: 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** the following
8f90: 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65 66 69   macro..*/.#defi
8fa0: 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  ne JOURNAL_PG_SZ
8fb0: 28 70 50 61 67 65 72 29 20 20 28 28 70 50 61 67  (pPager)  ((pPag
8fc0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20  er->pageSize) + 
8fd0: 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  8)../*.** The jo
8fe0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a  urnal header siz
8ff0: 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  e for this pager
9000: 2e 20 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c  . This is usuall
9010: 79 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20 73  y the same .** s
9020: 69 7a 65 20 61 73 20 61 20 73 69 6e 67 6c 65 20  ize as a single 
9030: 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 53 65 65  disk sector. See
9040: 20 61 6c 73 6f 20 73 65 74 53 65 63 74 6f 72 53   also setSectorS
9050: 69 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ize()..*/.#defin
9060: 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  e JOURNAL_HDR_SZ
9070: 28 70 50 61 67 65 72 29 20 28 70 50 61 67 65 72  (pPager) (pPager
9080: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f  ->sectorSize)../
9090: 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d  *.** The macro M
90a0: 45 4d 44 42 20 69 73 20 74 72 75 65 20 69 66 20  EMDB is true if 
90b0: 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  we are dealing w
90c0: 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ith an in-memory
90d0: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65   database..** We
90e0: 20 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d 61   do this as a ma
90f0: 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20 74  cro so that if t
9100: 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  he SQLITE_OMIT_M
9110: 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69 73  EMORYDB macro is
9120: 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c   set,.** the val
9130: 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c  ue of MEMDB will
9140: 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20 61   be a constant a
9150: 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20  nd the compiler 
9160: 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a  will optimize.**
9170: 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20 77   out code that w
9180: 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63 75  ould never execu
9190: 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  te..*/.#ifdef SQ
91a0: 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
91b0: 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44  DB.# define MEMD
91c0: 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  B 0.#else.# defi
91d0: 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72 2d  ne MEMDB pPager-
91e0: 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f  >memDb.#endif../
91f0: 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 55  *.** The macro U
9200: 53 45 46 45 54 43 48 20 69 73 20 74 72 75 65 20  SEFETCH is true 
9210: 69 66 20 77 65 20 61 72 65 20 61 6c 6c 6f 77 65  if we are allowe
9220: 64 20 74 6f 20 75 73 65 20 74 68 65 20 78 46 65  d to use the xFe
9230: 74 63 68 20 61 6e 64 20 78 55 6e 66 65 74 63 68  tch and xUnfetch
9240: 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 73 20 74  .** interfaces t
9250: 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74  o access the dat
9260: 61 62 61 73 65 20 75 73 69 6e 67 20 6d 65 6d 6f  abase using memo
9270: 72 79 2d 6d 61 70 70 65 64 20 49 2f 4f 2e 0a 2a  ry-mapped I/O..*
9280: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  /.#if SQLITE_MAX
9290: 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 23 20 64  _MMAP_SIZE>0.# d
92a0: 65 66 69 6e 65 20 55 53 45 46 45 54 43 48 28 78  efine USEFETCH(x
92b0: 29 20 28 28 78 29 2d 3e 62 55 73 65 46 65 74 63  ) ((x)->bUseFetc
92c0: 68 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  h).#else.# defin
92d0: 65 20 55 53 45 46 45 54 43 48 28 78 29 20 30 0a  e USEFETCH(x) 0.
92e0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
92f0: 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20  e maximum legal 
9300: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28  page number is (
9310: 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64  2^31 - 1)..*/.#d
9320: 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f  efine PAGER_MAX_
9330: 50 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a  PGNO 2147483647.
9340: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d  ./*.** The argum
9350: 65 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72  ent to this macr
9360: 6f 20 69 73 20 61 20 66 69 6c 65 20 64 65 73 63  o is a file desc
9370: 72 69 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c  riptor (type sql
9380: 69 74 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20  ite3_file*)..** 
9390: 52 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69  Return 0 if it i
93a0: 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e  s not open, or n
93b0: 6f 6e 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74  on-zero (but not
93c0: 20 31 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a   1) if it is..**
93d0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74  .** This is so t
93e0: 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20  hat expressions 
93f0: 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61  can be written a
9400: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69  s:.**.**   if( i
9410: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
9420: 64 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20  d) ){ ....**.** 
9430: 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a  instead of.**.**
9440: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
9450: 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20  fd->pMethods ){ 
9460: 2e 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69  ....*/.#define i
9470: 73 4f 70 65 6e 28 70 46 64 29 20 28 28 70 46 64  sOpen(pFd) ((pFd
9480: 29 2d 3e 70 4d 65 74 68 6f 64 73 29 0a 0a 2f 2a  )->pMethods)../*
9490: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
94a0: 69 66 20 74 68 69 73 20 70 61 67 65 72 20 75 73  if this pager us
94b0: 65 73 20 61 20 77 72 69 74 65 2d 61 68 65 61 64  es a write-ahead
94c0: 20 6c 6f 67 20 69 6e 73 74 65 61 64 20 6f 66 20   log instead of 
94d0: 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20 72 6f 6c  the usual.** rol
94e0: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 4f  lback journal. O
94f0: 74 68 65 72 77 69 73 65 20 66 61 6c 73 65 2e 0a  therwise false..
9500: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
9510: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 73 74 61 74 69  E_OMIT_WAL.stati
9520: 63 20 69 6e 74 20 70 61 67 65 72 55 73 65 57 61  c int pagerUseWa
9530: 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
9540: 7b 0a 20 20 72 65 74 75 72 6e 20 28 70 50 61 67  {.  return (pPag
9550: 65 72 2d 3e 70 57 61 6c 21 3d 30 29 3b 0a 7d 0a  er->pWal!=0);.}.
9560: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70  #else.# define p
9570: 61 67 65 72 55 73 65 57 61 6c 28 78 29 20 30 0a  agerUseWal(x) 0.
9580: 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 52 6f  # define pagerRo
9590: 6c 6c 62 61 63 6b 57 61 6c 28 78 29 20 30 0a 23  llbackWal(x) 0.#
95a0: 20 64 65 66 69 6e 65 20 70 61 67 65 72 57 61 6c   define pagerWal
95b0: 46 72 61 6d 65 73 28 76 2c 77 2c 78 2c 79 29 20  Frames(v,w,x,y) 
95c0: 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  0.# define pager
95d0: 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74  OpenWalIfPresent
95e0: 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 20  (z) SQLITE_OK.# 
95f0: 64 65 66 69 6e 65 20 70 61 67 65 72 42 65 67 69  define pagerBegi
9600: 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  nReadTransaction
9610: 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65  (z) SQLITE_OK.#e
9620: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4e 44  ndif..#ifndef ND
9630: 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 55 73 61 67  EBUG ./*.** Usag
9640: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72  e:.**.**   asser
9650: 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
9660: 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
9670: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
9680: 74 69 6f 6e 20 72 75 6e 73 20 6d 61 6e 79 20 61  tion runs many a
9690: 73 73 65 72 74 73 20 74 6f 20 74 72 79 20 74 6f  sserts to try to
96a0: 20 66 69 6e 64 20 69 6e 63 6f 6e 73 69 73 74 65   find inconsiste
96b0: 6e 63 69 65 73 20 69 6e 0a 2a 2a 20 74 68 65 20  ncies in.** the 
96c0: 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f  internal state o
96d0: 66 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  f the Pager obje
96e0: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ct..*/.static in
96f0: 74 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  t assert_pager_s
9700: 74 61 74 65 28 50 61 67 65 72 20 2a 70 29 7b 0a  tate(Pager *p){.
9710: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
9720: 3d 20 70 3b 0a 0a 20 20 2f 2a 20 53 74 61 74 65  = p;..  /* State
9730: 20 6d 75 73 74 20 62 65 20 76 61 6c 69 64 2e 20   must be valid. 
9740: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
9750: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
9760: 45 4e 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e  EN.       || p->
9770: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
9780: 41 44 45 52 0a 20 20 20 20 20 20 20 7c 7c 20 70  ADER.       || p
9790: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
97a0: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20  WRITER_LOCKED.  
97b0: 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74       || p->eStat
97c0: 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
97d0: 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20  CACHEMOD.       
97e0: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  || p->eState==PA
97f0: 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
9800: 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53  .       || p->eS
9810: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
9820: 45 52 5f 46 49 4e 49 53 48 45 44 0a 20 20 20 20  ER_FINISHED.    
9830: 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d     || p->eState=
9840: 3d 50 41 47 45 52 5f 45 52 52 4f 52 0a 20 20 29  =PAGER_ERROR.  )
9850: 3b 0a 0a 20 20 2f 2a 20 52 65 67 61 72 64 6c 65  ;..  /* Regardle
9860: 73 73 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  ss of the curren
9870: 74 20 73 74 61 74 65 2c 20 61 20 74 65 6d 70 2d  t state, a temp-
9880: 66 69 6c 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  file connection 
9890: 61 6c 77 61 79 73 20 62 65 68 61 76 65 73 0a 20  always behaves. 
98a0: 20 2a 2a 20 61 73 20 69 66 20 69 74 20 68 61 73   ** as if it has
98b0: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
98c0: 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
98d0: 73 65 20 66 69 6c 65 2e 20 49 74 20 6e 65 76 65  se file. It neve
98e0: 72 20 75 70 64 61 74 65 73 0a 20 20 2a 2a 20 74  r updates.  ** t
98f0: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
9900: 72 20 66 69 65 6c 64 2c 20 73 6f 20 74 68 65 20  r field, so the 
9910: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
9920: 66 6c 61 67 20 69 73 20 61 6c 77 61 79 73 20 73  flag is always s
9930: 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  et..  */.  asser
9940: 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d  t( p->tempFile==
9950: 30 20 7c 7c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45  0 || p->eLock==E
9960: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
9970: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74 65  .  assert( p->te
9980: 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 50 61  mpFile==0 || pPa
9990: 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
99a0: 44 6f 6e 65 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  Done );..  /* If
99b0: 20 74 68 65 20 75 73 65 4a 6f 75 72 6e 61 6c 20   the useJournal 
99c0: 66 6c 61 67 20 69 73 20 63 6c 65 61 72 2c 20 74  flag is clear, t
99d0: 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20  he journal-mode 
99e0: 6d 75 73 74 20 62 65 20 22 4f 46 46 22 2e 20 0a  must be "OFF". .
99f0: 20 20 2a 2a 20 41 6e 64 20 69 66 20 74 68 65 20    ** And if the 
9a00: 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 69 73 20  journal-mode is 
9a10: 22 4f 46 46 22 2c 20 74 68 65 20 6a 6f 75 72 6e  "OFF", the journ
9a20: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 6e 6f 74  al file must not
9a30: 20 62 65 20 6f 70 65 6e 2e 0a 20 20 2a 2f 0a 20   be open..  */. 
9a40: 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72   assert( p->jour
9a50: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
9a60: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c  OURNALMODE_OFF |
9a70: 7c 20 70 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  | p->useJournal 
9a80: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
9a90: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
9aa0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
9ab0: 46 46 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 2d  FF || !isOpen(p-
9ac0: 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 43  >jfd) );..  /* C
9ad0: 68 65 63 6b 20 74 68 61 74 20 4d 45 4d 44 42 20  heck that MEMDB 
9ae0: 69 6d 70 6c 69 65 73 20 6e 6f 53 79 6e 63 2e 20  implies noSync. 
9af0: 41 6e 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  And an in-memory
9b00: 20 6a 6f 75 72 6e 61 6c 2e 20 53 69 6e 63 65 20   journal. Since 
9b10: 0a 20 20 2a 2a 20 74 68 69 73 20 6d 65 61 6e 73  .  ** this means
9b20: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   an in-memory pa
9b30: 67 65 72 20 70 65 72 66 6f 72 6d 73 20 6e 6f 20  ger performs no 
9b40: 49 4f 20 61 74 20 61 6c 6c 2c 20 69 74 20 63 61  IO at all, it ca
9b50: 6e 6e 6f 74 20 65 6e 63 6f 75 6e 74 65 72 20 0a  nnot encounter .
9b60: 20 20 2a 2a 20 65 69 74 68 65 72 20 53 51 4c 49    ** either SQLI
9b70: 54 45 5f 49 4f 45 52 52 20 6f 72 20 53 51 4c 49  TE_IOERR or SQLI
9b80: 54 45 5f 46 55 4c 4c 20 64 75 72 69 6e 67 20 72  TE_FULL during r
9b90: 6f 6c 6c 62 61 63 6b 20 6f 72 20 77 68 69 6c 65  ollback or while
9ba0: 20 66 69 6e 61 6c 69 7a 69 6e 67 20 0a 20 20 2a   finalizing .  *
9bb0: 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  * a journal file
9bc0: 2e 20 28 61 6c 74 68 6f 75 67 68 20 74 68 65 20  . (although the 
9bd0: 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
9be0: 6c 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  l implementation
9bf0: 20 6d 61 79 20 0a 20 20 2a 2a 20 72 65 74 75 72   may .  ** retur
9c00: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
9c10: 4f 4d 45 4d 20 77 68 69 6c 65 20 74 68 65 20 6a  OMEM while the j
9c20: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62  ournal file is b
9c30: 65 69 6e 67 20 77 72 69 74 74 65 6e 29 2e 20 49  eing written). I
9c40: 74 20 0a 20 20 2a 2a 20 69 73 20 74 68 65 72 65  t .  ** is there
9c50: 66 6f 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c  fore not possibl
9c60: 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  e for an in-memo
9c70: 72 79 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65  ry pager to ente
9c80: 72 20 74 68 65 20 45 52 52 4f 52 20 0a 20 20 2a  r the ERROR .  *
9c90: 2a 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20  * state..  */.  
9ca0: 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
9cb0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 6f 53 79   assert( p->noSy
9cc0: 6e 63 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  nc );.    assert
9cd0: 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ( p->journalMode
9ce0: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
9cf0: 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20  ODE_OFF .       
9d00: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
9d10: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
9d20: 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20  ALMODE_MEMORY . 
9d30: 20 20 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74     );.    assert
9d40: 28 20 70 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ( p->eState!=PAG
9d50: 45 52 5f 45 52 52 4f 52 20 26 26 20 70 2d 3e 65  ER_ERROR && p->e
9d60: 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45  State!=PAGER_OPE
9d70: 4e 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  N );.    assert(
9d80: 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 29 3d   pagerUseWal(p)=
9d90: 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  =0 );.  }..  /* 
9da0: 49 66 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  If changeCountDo
9db0: 6e 65 20 69 73 20 73 65 74 2c 20 61 20 52 45 53  ne is set, a RES
9dc0: 45 52 56 45 44 20 6c 6f 63 6b 20 6f 72 20 67 72  ERVED lock or gr
9dd0: 65 61 74 65 72 20 6d 75 73 74 20 62 65 20 68 65  eater must be he
9de0: 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 66  ld.  ** on the f
9df0: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ile..  */.  asse
9e00: 72 74 28 20 70 50 61 67 65 72 2d 3e 63 68 61 6e  rt( pPager->chan
9e10: 67 65 43 6f 75 6e 74 44 6f 6e 65 3d 3d 30 20 7c  geCountDone==0 |
9e20: 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e  | pPager->eLock>
9e30: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29  =RESERVED_LOCK )
9e40: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  ;.  assert( p->e
9e50: 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f  Lock!=PENDING_LO
9e60: 43 4b 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28  CK );..  switch(
9e70: 20 70 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20   p->eState ){.  
9e80: 20 20 63 61 73 65 20 50 41 47 45 52 5f 4f 50 45    case PAGER_OPE
9e90: 4e 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  N:.      assert(
9ea0: 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 20   !MEMDB );.     
9eb0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9ec0: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
9ed0: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
9ee0: 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63  ert( sqlite3Pcac
9ef0: 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
9f00: 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 7c  r->pPCache)==0 |
9f10: 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
9f20: 6c 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  le );.      brea
9f30: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
9f40: 45 52 5f 52 45 41 44 45 52 3a 0a 20 20 20 20 20  ER_READER:.     
9f50: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9f60: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
9f70: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
9f80: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55  ert( p->eLock!=U
9f90: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20  NKNOWN_LOCK );. 
9fa0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
9fb0: 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f  eLock>=SHARED_LO
9fc0: 43 4b 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  CK );.      brea
9fd0: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
9fe0: 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
9ff0: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
a000: 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57  p->eLock!=UNKNOW
a010: 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  N_LOCK );.      
a020: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a030: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
a040: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OK );.      if( 
a050: 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
a060: 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ger) ){.        
a070: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
a080: 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  >=RESERVED_LOCK 
a090: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
a0a0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a0b0: 3e 64 62 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d  >dbSize==pPager-
a0c0: 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 3b 0a 20  >dbOrigSize );. 
a0d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a0e0: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d  ger->dbOrigSize=
a0f0: 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  =pPager->dbFileS
a100: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ize );.      ass
a110: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f  ert( pPager->dbO
a120: 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d  rigSize==pPager-
a130: 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20  >dbHintSize );. 
a140: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a150: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d  ger->setMaster==
a160: 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
a170: 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  ;..    case PAGE
a180: 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
a190: 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  D:.      assert(
a1a0: 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f   p->eLock!=UNKNO
a1b0: 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  WN_LOCK );.     
a1c0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a1d0: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
a1e0: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28  _OK );.      if(
a1f0: 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
a200: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  ager) ){.       
a210: 20 2f 2a 20 49 74 20 69 73 20 70 6f 73 73 69 62   /* It is possib
a220: 6c 65 20 74 68 61 74 20 69 66 20 6a 6f 75 72 6e  le that if journ
a230: 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20 68 65 72 65  al_mode=wal here
a240: 20 74 68 61 74 20 6e 65 69 74 68 65 72 20 74 68   that neither th
a250: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75  e.        ** jou
a260: 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 72 20 74 68  rnal file nor th
a270: 65 20 57 41 4c 20 66 69 6c 65 20 61 72 65 20 6f  e WAL file are o
a280: 70 65 6e 2e 20 54 68 69 73 20 68 61 70 70 65 6e  pen. This happen
a290: 73 20 64 75 72 69 6e 67 0a 20 20 20 20 20 20 20  s during.       
a2a0: 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 74   ** a rollback t
a2b0: 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20  ransaction that 
a2c0: 73 77 69 74 63 68 65 73 20 66 72 6f 6d 20 6a 6f  switches from jo
a2d0: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66 66 0a 20  urnal_mode=off. 
a2e0: 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 6a 6f 75         ** to jou
a2f0: 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 2e 0a 20  rnal_mode=wal.. 
a300: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
a310: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
a320: 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck>=RESERVED_LOC
a330: 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  K );.        ass
a340: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a  ert( isOpen(p->j
a350: 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  fd) .           
a360: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
a370: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
a380: 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20  ALMODE_OFF .    
a390: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
a3a0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
a3b0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
a3c0: 4c 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  L .        );.  
a3d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
a3e0: 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  rt( pPager->dbOr
a3f0: 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e  igSize==pPager->
a400: 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a 20 20  dbFileSize );.  
a410: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a420: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d  er->dbOrigSize==
a430: 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69  pPager->dbHintSi
a440: 7a 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ze );.      brea
a450: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
a460: 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 3a  ER_WRITER_DBMOD:
a470: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a480: 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
a490: 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  VE_LOCK );.     
a4a0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a4b0: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
a4c0: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
a4d0: 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
a4e0: 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
a4f0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
a500: 6f 63 6b 3e 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock>=EXCLUSIVE_L
a510: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  OCK );.      ass
a520: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a  ert( isOpen(p->j
a530: 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  fd) .           
a540: 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  || p->journalMod
a550: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
a560: 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20  MODE_OFF .      
a570: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
a580: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a590: 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20  URNALMODE_WAL . 
a5a0: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73       );.      as
a5b0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
a5c0: 4f 72 69 67 53 69 7a 65 3c 3d 70 50 61 67 65 72  OrigSize<=pPager
a5d0: 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a  ->dbHintSize );.
a5e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
a5f0: 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52 49    case PAGER_WRI
a600: 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 20 20  TER_FINISHED:.  
a610: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
a620: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
a630: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  LOCK );.      as
a640: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
a650: 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
a660: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a670: 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
a680: 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20  Pager) );.      
a690: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
a6a0: 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20  ->jfd) .        
a6b0: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
a6c0: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
a6d0: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
a6e0: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f          || p->jo
a6f0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
a700: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
a710: 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20   .      );.     
a720: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
a730: 65 20 50 41 47 45 52 5f 45 52 52 4f 52 3a 0a 20  e PAGER_ERROR:. 
a740: 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 6d 75       /* There mu
a750: 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f  st be at least o
a760: 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  ne outstanding r
a770: 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
a780: 70 61 67 65 72 20 69 66 0a 20 20 20 20 20 20 2a  pager if.      *
a790: 2a 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65  * in ERROR state
a7a0: 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20  . Otherwise the 
a7b0: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 68 61 76  pager should hav
a7c0: 65 20 61 6c 72 65 61 64 79 20 64 72 6f 70 70 65  e already droppe
a7d0: 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20  d.      ** back 
a7e0: 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e 0a 20  to OPEN state.. 
a7f0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
a800: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
a810: 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b  rCode!=SQLITE_OK
a820: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a830: 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  ( sqlite3PcacheR
a840: 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
a850: 70 50 43 61 63 68 65 29 3e 30 20 29 3b 0a 20 20  pPCache)>0 );.  
a860: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
a870: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
a880: 6e 64 69 66 20 2f 2a 20 69 66 6e 64 65 66 20 4e  ndif /* ifndef N
a890: 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64 65 66  DEBUG */..#ifdef
a8a0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 0a 2f   SQLITE_DEBUG ./
a8b0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
a8c0: 69 6e 74 65 72 20 74 6f 20 61 20 68 75 6d 61 6e  inter to a human
a8d0: 20 72 65 61 64 61 62 6c 65 20 73 74 72 69 6e 67   readable string
a8e0: 20 69 6e 20 61 20 73 74 61 74 69 63 20 62 75 66   in a static buf
a8f0: 66 65 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e  fer.** containin
a900: 67 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  g the state of t
a910: 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  he Pager object 
a920: 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67  passed as an arg
a930: 75 6d 65 6e 74 2e 20 54 68 69 73 0a 2a 2a 20 69  ument. This.** i
a940: 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65  s intended to be
a950: 20 75 73 65 64 20 77 69 74 68 69 6e 20 64 65 62   used within deb
a960: 75 67 67 65 72 73 2e 20 46 6f 72 20 65 78 61 6d  uggers. For exam
a970: 70 6c 65 2c 20 61 73 20 61 6e 20 61 6c 74 65 72  ple, as an alter
a980: 6e 61 74 69 76 65 0a 2a 2a 20 74 6f 20 22 70 72  native.** to "pr
a990: 69 6e 74 20 2a 70 50 61 67 65 72 22 20 69 6e 20  int *pPager" in 
a9a0: 67 64 62 3a 0a 2a 2a 0a 2a 2a 20 28 67 64 62 29  gdb:.**.** (gdb)
a9b0: 20 70 72 69 6e 74 66 20 22 25 73 22 2c 20 70 72   printf "%s", pr
a9c0: 69 6e 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  int_pager_state(
a9d0: 70 50 61 67 65 72 29 0a 2a 2f 0a 73 74 61 74 69  pPager).*/.stati
a9e0: 63 20 63 68 61 72 20 2a 70 72 69 6e 74 5f 70 61  c char *print_pa
a9f0: 67 65 72 5f 73 74 61 74 65 28 50 61 67 65 72 20  ger_state(Pager 
aa00: 2a 70 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68  *p){.  static ch
aa10: 61 72 20 7a 52 65 74 5b 31 30 32 34 5d 3b 0a 0a  ar zRet[1024];..
aa20: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
aa30: 74 66 28 31 30 32 34 2c 20 7a 52 65 74 2c 0a 20  tf(1024, zRet,. 
aa40: 20 20 20 20 20 22 46 69 6c 65 6e 61 6d 65 3a 20       "Filename: 
aa50: 20 20 20 20 20 25 73 5c 6e 22 0a 20 20 20 20 20       %s\n".     
aa60: 20 22 53 74 61 74 65 3a 20 20 20 20 20 20 20 20   "State:        
aa70: 20 25 73 20 65 72 72 43 6f 64 65 3d 25 64 5c 6e   %s errCode=%d\n
aa80: 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b 3a 20 20  ".      "Lock:  
aa90: 20 20 20 20 20 20 20 20 25 73 5c 6e 22 0a 20 20          %s\n".  
aaa0: 20 20 20 20 22 4c 6f 63 6b 69 6e 67 20 6d 6f 64      "Locking mod
aab0: 65 3a 20 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  e:  locking_mode
aac0: 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f  =%s\n".      "Jo
aad0: 75 72 6e 61 6c 20 6d 6f 64 65 3a 20 20 6a 6f 75  urnal mode:  jou
aae0: 72 6e 61 6c 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a  rnal_mode=%s\n".
aaf0: 20 20 20 20 20 20 22 42 61 63 6b 69 6e 67 20 73        "Backing s
ab00: 74 6f 72 65 3a 20 74 65 6d 70 46 69 6c 65 3d 25  tore: tempFile=%
ab10: 64 20 6d 65 6d 44 62 3d 25 64 20 75 73 65 4a 6f  d memDb=%d useJo
ab20: 75 72 6e 61 6c 3d 25 64 5c 6e 22 0a 20 20 20 20  urnal=%d\n".    
ab30: 20 20 22 4a 6f 75 72 6e 61 6c 3a 20 20 20 20 20    "Journal:     
ab40: 20 20 6a 6f 75 72 6e 61 6c 4f 66 66 3d 25 6c 6c    journalOff=%ll
ab50: 64 20 6a 6f 75 72 6e 61 6c 48 64 72 3d 25 6c 6c  d journalHdr=%ll
ab60: 64 5c 6e 22 0a 20 20 20 20 20 20 22 53 69 7a 65  d\n".      "Size
ab70: 3a 20 20 20 20 20 20 20 20 20 20 64 62 73 69 7a  :          dbsiz
ab80: 65 3d 25 64 20 64 62 4f 72 69 67 53 69 7a 65 3d  e=%d dbOrigSize=
ab90: 25 64 20 64 62 46 69 6c 65 53 69 7a 65 3d 25 64  %d dbFileSize=%d
aba0: 5c 6e 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e 7a  \n".      , p->z
abb0: 46 69 6c 65 6e 61 6d 65 0a 20 20 20 20 20 20 2c  Filename.      ,
abc0: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
abd0: 52 5f 4f 50 45 4e 20 20 20 20 20 20 20 20 20 20  R_OPEN          
abe0: 20 20 3f 20 22 4f 50 45 4e 22 20 3a 0a 20 20 20    ? "OPEN" :.   
abf0: 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d       p->eState==
ac00: 50 41 47 45 52 5f 52 45 41 44 45 52 20 20 20 20  PAGER_READER    
ac10: 20 20 20 20 20 20 3f 20 22 52 45 41 44 45 52 22        ? "READER"
ac20: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
ac30: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
ac40: 45 52 5f 4c 4f 43 4b 45 44 20 20 20 3f 20 22 57  ER_LOCKED   ? "W
ac50: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 22 20 3a 0a  RITER_LOCKED" :.
ac60: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
ac70: 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
ac80: 43 41 43 48 45 4d 4f 44 20 3f 20 22 57 52 49 54  CACHEMOD ? "WRIT
ac90: 45 52 5f 43 41 43 48 45 4d 4f 44 22 20 3a 0a 20  ER_CACHEMOD" :. 
aca0: 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
acb0: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  ==PAGER_WRITER_D
acc0: 42 4d 4f 44 20 20 20 20 3f 20 22 57 52 49 54 45  BMOD    ? "WRITE
acd0: 52 5f 44 42 4d 4f 44 22 20 3a 0a 20 20 20 20 20  R_DBMOD" :.     
ace0: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41     p->eState==PA
acf0: 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53  GER_WRITER_FINIS
ad00: 48 45 44 20 3f 20 22 57 52 49 54 45 52 5f 46 49  HED ? "WRITER_FI
ad10: 4e 49 53 48 45 44 22 20 3a 0a 20 20 20 20 20 20  NISHED" :.      
ad20: 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47    p->eState==PAG
ad30: 45 52 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20  ER_ERROR        
ad40: 20 20 20 3f 20 22 45 52 52 4f 52 22 20 3a 20 22     ? "ERROR" : "
ad50: 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c  ?error?".      ,
ad60: 20 28 69 6e 74 29 70 2d 3e 65 72 72 43 6f 64 65   (int)p->errCode
ad70: 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 4c 6f 63  .      , p->eLoc
ad80: 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20 20  k==NO_LOCK      
ad90: 20 20 20 3f 20 22 4e 4f 5f 4c 4f 43 4b 22 20 3a     ? "NO_LOCK" :
ada0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63  .        p->eLoc
adb0: 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k==RESERVED_LOCK
adc0: 20 20 20 3f 20 22 52 45 53 45 52 56 45 44 22 20     ? "RESERVED" 
add0: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f  :.        p->eLo
ade0: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
adf0: 43 4b 20 20 3f 20 22 45 58 43 4c 55 53 49 56 45  CK  ? "EXCLUSIVE
ae00: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
ae10: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
ae20: 4b 20 20 20 20 20 3f 20 22 53 48 41 52 45 44 22  K     ? "SHARED"
ae30: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c   :.        p->eL
ae40: 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock==UNKNOWN_LOC
ae50: 4b 20 20 20 20 3f 20 22 55 4e 4b 4e 4f 57 4e 22  K    ? "UNKNOWN"
ae60: 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20   : "?error?".   
ae70: 20 20 20 2c 20 70 2d 3e 65 78 63 6c 75 73 69 76     , p->exclusiv
ae80: 65 4d 6f 64 65 20 3f 20 22 65 78 63 6c 75 73 69  eMode ? "exclusi
ae90: 76 65 22 20 3a 20 22 6e 6f 72 6d 61 6c 22 0a 20  ve" : "normal". 
aea0: 20 20 20 20 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61       , p->journa
aeb0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
aec0: 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
aed0: 20 20 3f 20 22 6d 65 6d 6f 72 79 22 20 3a 0a 20    ? "memory" :. 
aee0: 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61         p->journa
aef0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
af00: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20 20 20  RNALMODE_OFF    
af10: 20 20 3f 20 22 6f 66 66 22 20 3a 0a 20 20 20 20    ? "off" :.    
af20: 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f      p->journalMo
af30: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
af40: 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20 20 3f  LMODE_DELETE   ?
af50: 20 22 64 65 6c 65 74 65 22 20 3a 0a 20 20 20 20   "delete" :.    
af60: 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f      p->journalMo
af70: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
af80: 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 20 3f  LMODE_PERSIST  ?
af90: 20 22 70 65 72 73 69 73 74 22 20 3a 0a 20 20 20   "persist" :.   
afa0: 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d       p->journalM
afb0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
afc0: 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20  ALMODE_TRUNCATE 
afd0: 3f 20 22 74 72 75 6e 63 61 74 65 22 20 3a 0a 20  ? "truncate" :. 
afe0: 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61         p->journa
aff0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
b000: 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20 20 20  RNALMODE_WAL    
b010: 20 20 3f 20 22 77 61 6c 22 20 3a 20 22 3f 65 72    ? "wal" : "?er
b020: 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 28 69  ror?".      , (i
b030: 6e 74 29 70 2d 3e 74 65 6d 70 46 69 6c 65 2c 20  nt)p->tempFile, 
b040: 28 69 6e 74 29 70 2d 3e 6d 65 6d 44 62 2c 20 28  (int)p->memDb, (
b050: 69 6e 74 29 70 2d 3e 75 73 65 4a 6f 75 72 6e 61  int)p->useJourna
b060: 6c 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f 75  l.      , p->jou
b070: 72 6e 61 6c 4f 66 66 2c 20 70 2d 3e 6a 6f 75 72  rnalOff, p->jour
b080: 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 2c 20 28  nalHdr.      , (
b090: 69 6e 74 29 70 2d 3e 64 62 53 69 7a 65 2c 20 28  int)p->dbSize, (
b0a0: 69 6e 74 29 70 2d 3e 64 62 4f 72 69 67 53 69 7a  int)p->dbOrigSiz
b0b0: 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62 46 69 6c  e, (int)p->dbFil
b0c0: 65 53 69 7a 65 0a 20 20 29 3b 0a 0a 20 20 72 65  eSize.  );..  re
b0d0: 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 23 65 6e  turn zRet;.}.#en
b0e0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
b0f0: 6e 20 74 72 75 65 20 69 66 20 69 74 20 69 73 20  n true if it is 
b100: 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69  necessary to wri
b110: 74 65 20 70 61 67 65 20 2a 70 50 67 20 69 6e 74  te page *pPg int
b120: 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
b130: 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e 65 65  l..** A page nee
b140: 64 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ds to be written
b150: 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f   into the sub-jo
b160: 75 72 6e 61 6c 20 69 66 20 74 68 65 72 65 20 65  urnal if there e
b170: 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72 20  xists one.** or 
b180: 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76 65 70 6f  more open savepo
b190: 69 6e 74 73 20 66 6f 72 20 77 68 69 63 68 3a 0a  ints for which:.
b1a0: 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61  **.**   * The pa
b1b0: 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c 65 73  ge-number is les
b1c0: 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
b1d0: 74 6f 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  to PagerSavepoin
b1e0: 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a 20  t.nOrig, and.** 
b1f0: 20 20 2a 20 54 68 65 20 62 69 74 20 63 6f 72 72    * The bit corr
b200: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
b210: 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20   page-number is 
b220: 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20 20 20  not set in.**   
b230: 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
b240: 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e 0a 2a  .pInSavepoint..*
b250: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62  /.static int sub
b260: 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 50 67  jRequiresPage(Pg
b270: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
b280: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
b290: 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 61 67 65  ->pPager;.  Page
b2a0: 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 3b 0a 20  rSavepoint *p;. 
b2b0: 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67   Pgno pgno = pPg
b2c0: 2d 3e 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 69 3b  ->pgno;.  int i;
b2d0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50  .  for(i=0; i<pP
b2e0: 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
b2f0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20  ; i++){.    p = 
b300: 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  &pPager->aSavepo
b310: 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  int[i];.    if( 
b320: 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20 26  p->nOrig>=pgno &
b330: 26 20 30 3d 3d 73 71 6c 69 74 65 33 42 69 74 76  & 0==sqlite3Bitv
b340: 65 63 54 65 73 74 28 70 2d 3e 70 49 6e 53 61 76  ecTest(p->pInSav
b350: 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 20 29 7b  epoint, pgno) ){
b360: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
b370: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
b380: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
b390: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
b3a0: 68 65 20 70 61 67 65 20 69 73 20 61 6c 72 65 61  he page is alrea
b3b0: 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  dy in the journa
b3c0: 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  l file..*/.stati
b3d0: 63 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72  c int pageInJour
b3e0: 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
b3f0: 72 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  r, PgHdr *pPg){.
b400: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
b410: 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65  BitvecTest(pPage
b420: 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
b430: 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a  Pg->pgno);.}../*
b440: 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69  .** Read a 32-bi
b450: 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74  t integer from t
b460: 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65  he given file de
b470: 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65  scriptor.  Store
b480: 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20   the integer.** 
b490: 74 68 61 74 20 69 73 20 72 65 61 64 20 69 6e 20  that is read in 
b4a0: 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53  *pRes.  Return S
b4b0: 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
b4c0: 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f  ything worked, o
b4d0: 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f  r an.** error co
b4e0: 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20  de is something 
b4f0: 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a  goes wrong..**.*
b500: 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65  * All values are
b510: 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20   stored on disk 
b520: 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a  as big-endian..*
b530: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
b540: 64 33 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f  d32bits(sqlite3_
b550: 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66  file *fd, i64 of
b560: 66 73 65 74 2c 20 75 33 32 20 2a 70 52 65 73 29  fset, u32 *pRes)
b570: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
b580: 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72  r ac[4];.  int r
b590: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
b5a0: 64 28 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66  d(fd, ac, sizeof
b5b0: 28 61 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20  (ac), offset);. 
b5c0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
b5d0: 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  OK ){.    *pRes 
b5e0: 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74  = sqlite3Get4byt
b5f0: 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74  e(ac);.  }.  ret
b600: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
b610: 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20   Write a 32-bit 
b620: 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73  integer into a s
b630: 74 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20  tring buffer in 
b640: 62 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20  big-endian byte 
b650: 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e  order..*/.#defin
b660: 65 20 70 75 74 33 32 62 69 74 73 28 41 2c 42 29  e put32bits(A,B)
b670: 20 20 73 71 6c 69 74 65 33 50 75 74 34 62 79 74    sqlite3Put4byt
b680: 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a 0a 2f 2a  e((u8*)A,B).../*
b690: 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62  .** Write a 32-b
b6a0: 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20  it integer into 
b6b0: 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64  the given file d
b6c0: 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75  escriptor.  Retu
b6d0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
b6e0: 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
b6f0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73   error code is s
b700: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
b710: 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
b720: 6e 74 20 77 72 69 74 65 33 32 62 69 74 73 28 73  nt write32bits(s
b730: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
b740: 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32   i64 offset, u32
b750: 20 76 61 6c 29 7b 0a 20 20 63 68 61 72 20 61 63   val){.  char ac
b760: 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73  [4];.  put32bits
b770: 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74  (ac, val);.  ret
b780: 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69  urn sqlite3OsWri
b790: 74 65 28 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66  te(fd, ac, 4, of
b7a0: 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  fset);.}../*.** 
b7b0: 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  Unlock the datab
b7c0: 61 73 65 20 66 69 6c 65 20 74 6f 20 6c 65 76 65  ase file to leve
b7d0: 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63 68 20 6d  l eLock, which m
b7e0: 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
b7f0: 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72 20 53 48 41 52  _LOCK.** or SHAR
b800: 45 44 5f 4c 4f 43 4b 2e 20 52 65 67 61 72 64 6c  ED_LOCK. Regardl
b810: 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f  ess of whether o
b820: 72 20 6e 6f 74 20 74 68 65 20 63 61 6c 6c 20 74  r not the call t
b830: 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 73  o xUnlock().** s
b840: 75 63 63 65 65 64 73 2c 20 73 65 74 20 74 68 65  ucceeds, set the
b850: 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72   Pager.eLock var
b860: 69 61 62 6c 65 20 74 6f 20 6d 61 74 63 68 20 74  iable to match t
b870: 68 65 20 28 61 74 74 65 6d 70 74 65 64 29 20 6e  he (attempted) n
b880: 65 77 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 45  ew lock..**.** E
b890: 78 63 65 70 74 2c 20 69 66 20 50 61 67 65 72 2e  xcept, if Pager.
b8a0: 65 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20  eLock is set to 
b8b0: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65  UNKNOWN_LOCK whe
b8c0: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
b8d0: 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 64 6f  is.** called, do
b8e0: 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69 74 2e 20   not modify it. 
b8f0: 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  See the comment 
b900: 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e  above the #defin
b910: 65 20 6f 66 20 0a 2a 2a 20 55 4e 4b 4e 4f 57 4e  e of .** UNKNOWN
b920: 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78 70  _LOCK for an exp
b930: 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 69 73  lanation of this
b940: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b950: 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 50 61  pagerUnlockDb(Pa
b960: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
b970: 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72   eLock){.  int r
b980: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
b990: 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
b9a0: 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
b9b0: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63   || pPager->eLoc
b9c0: 6b 3d 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20 61 73  k==eLock );.  as
b9d0: 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 4e 4f 5f  sert( eLock==NO_
b9e0: 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 53  LOCK || eLock==S
b9f0: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
ba00: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 21 3d 4e  assert( eLock!=N
ba10: 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 61 67 65 72 55  O_LOCK || pagerU
ba20: 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30  seWal(pPager)==0
ba30: 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e   );.  if( isOpen
ba40: 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
ba50: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
ba60: 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b  er->eLock>=eLock
ba70: 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 50 61   );.    rc = pPa
ba80: 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20 53 51  ger->noLock ? SQ
ba90: 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74 65  LITE_OK : sqlite
baa0: 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72  3OsUnlock(pPager
bab0: 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20  ->fd, eLock);.  
bac0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c    if( pPager->eL
bad0: 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock!=UNKNOWN_LOC
bae0: 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  K ){.      pPage
baf0: 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75 38 29 65  r->eLock = (u8)e
bb00: 4c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Lock;.    }.    
bb10: 49 4f 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  IOTRACE(("UNLOCK
bb20: 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
bb30: 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20 7d 0a 20  r, eLock)).  }. 
bb40: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
bb50: 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 64 61  *.** Lock the da
bb60: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6c  tabase file to l
bb70: 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63  evel eLock, whic
bb80: 68 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  h must be either
bb90: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a   SHARED_LOCK,.**
bba0: 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f   RESERVED_LOCK o
bbb0: 72 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  r EXCLUSIVE_LOCK
bbc0: 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20  . If the caller 
bbd0: 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73  is successful, s
bbe0: 65 74 20 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e  et the.** Pager.
bbf0: 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74  eLock variable t
bc00: 6f 20 74 68 65 20 6e 65 77 20 6c 6f 63 6b 69 6e  o the new lockin
bc10: 67 20 73 74 61 74 65 2e 20 0a 2a 2a 0a 2a 2a 20  g state. .**.** 
bc20: 45 78 63 65 70 74 2c 20 69 66 20 50 61 67 65 72  Except, if Pager
bc30: 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f  .eLock is set to
bc40: 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68   UNKNOWN_LOCK wh
bc50: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
bc60: 20 69 73 20 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20   is .** called, 
bc70: 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69 74  do not modify it
bc80: 20 75 6e 6c 65 73 73 20 74 68 65 20 6e 65 77 20   unless the new 
bc90: 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 20 69 73  locking state is
bca0: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e   EXCLUSIVE_LOCK.
bcb0: 20 0a 2a 2a 20 53 65 65 20 74 68 65 20 63 6f 6d   .** See the com
bcc0: 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23  ment above the #
bcd0: 64 65 66 69 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57  define of UNKNOW
bce0: 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78  N_LOCK for an ex
bcf0: 70 6c 61 6e 61 74 69 6f 6e 20 0a 2a 2a 20 6f 66  planation .** of
bd00: 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   this..*/.static
bd10: 20 69 6e 74 20 70 61 67 65 72 4c 6f 63 6b 44 62   int pagerLockDb
bd20: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
bd30: 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e  int eLock){.  in
bd40: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
bd50: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f  ;..  assert( eLo
bd60: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
bd70: 7c 7c 20 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56  || eLock==RESERV
bd80: 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  ED_LOCK || eLock
bd90: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
bda0: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
bdb0: 2d 3e 65 4c 6f 63 6b 3c 65 4c 6f 63 6b 20 7c 7c  ->eLock<eLock ||
bdc0: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
bdd0: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a  UNKNOWN_LOCK ){.
bde0: 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d      rc = pPager-
bdf0: 3e 6e 6f 4c 6f 63 6b 20 3f 20 53 51 4c 49 54 45  >noLock ? SQLITE
be00: 5f 4f 4b 20 3a 20 73 71 6c 69 74 65 33 4f 73 4c  _OK : sqlite3OsL
be10: 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
be20: 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20  eLock);.    if( 
be30: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
be40: 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 21   (pPager->eLock!
be50: 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 7c 7c 65  =UNKNOWN_LOCK||e
be60: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
be70: 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20 20 70  LOCK) ){.      p
be80: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28  Pager->eLock = (
be90: 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 20 20  u8)eLock;.      
bea0: 49 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25  IOTRACE(("LOCK %
beb0: 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
bec0: 20 65 4c 6f 63 6b 29 29 0a 20 20 20 20 7d 0a 20   eLock)).    }. 
bed0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
bee0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
bef0: 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65  nction determine
bf00: 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  s whether or not
bf10: 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74   the atomic-writ
bf20: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a  e optimization.*
bf30: 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 69  * can be used wi
bf40: 74 68 20 74 68 69 73 20 70 61 67 65 72 2e 20 54  th this pager. T
bf50: 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
bf60: 63 61 6e 20 62 65 20 75 73 65 64 20 69 66 3a 0a  can be used if:.
bf70: 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65 20 76  **.**  (a) the v
bf80: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
bf90: 20 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74   OsDeviceCharact
bfa0: 65 72 69 73 74 69 63 73 28 29 20 69 6e 64 69 63  eristics() indic
bfb0: 61 74 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20  ates that.**    
bfc0: 20 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67    a database pag
bfd0: 65 20 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e  e may be written
bfe0: 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64   atomically, and
bff0: 0a 2a 2a 20 20 28 62 29 20 74 68 65 20 76 61 6c  .**  (b) the val
c000: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f  ue returned by O
c010: 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69 73  sSectorSize() is
c020: 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
c030: 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74  ual.**      to t
c040: 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  he page size..**
c050: 0a 2a 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 61  .** The optimiza
c060: 74 69 6f 6e 20 69 73 20 61 6c 73 6f 20 61 6c 77  tion is also alw
c070: 61 79 73 20 65 6e 61 62 6c 65 64 20 66 6f 72 20  ays enabled for 
c080: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e  temporary files.
c090: 20 49 74 20 69 73 0a 2a 2a 20 61 6e 20 65 72 72   It is.** an err
c0a0: 6f 72 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20  or to call this 
c0b0: 66 75 6e 63 74 69 6f 6e 20 69 66 20 70 50 61 67  function if pPag
c0c0: 65 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20  er is opened on 
c0d0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  an in-memory.** 
c0e0: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
c0f0: 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  If the optimizat
c100: 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75 73  ion cannot be us
c110: 65 64 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65  ed, 0 is returne
c120: 64 2e 20 49 66 20 69 74 20 63 61 6e 20 62 65 20  d. If it can be 
c130: 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  used,.** then th
c140: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
c150: 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20   is the size of 
c160: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
c170: 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e 74   when it.** cont
c180: 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64 61  ains rollback da
c190: 74 61 20 66 6f 72 20 65 78 61 63 74 6c 79 20 6f  ta for exactly o
c1a0: 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 64  ne page..*/.#ifd
c1b0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
c1c0: 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 73 74  _ATOMIC_WRITE.st
c1d0: 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42 75 66  atic int jrnlBuf
c1e0: 66 65 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70  ferSize(Pager *p
c1f0: 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74  Pager){.  assert
c200: 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66  ( !MEMDB );.  if
c210: 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
c220: 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 64  ile ){.    int d
c230: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
c240: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c250: 44 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  Device character
c260: 69 73 74 69 63 73 20 2a 2f 0a 20 20 20 20 69 6e  istics */.    in
c270: 74 20 6e 53 65 63 74 6f 72 3b 20 20 20 20 20 20  t nSector;      
c280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c290: 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 2a  /* Sector size *
c2a0: 2f 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67 65  /.    int szPage
c2b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c2c0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
c2d0: 73 69 7a 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73  size */..    ass
c2e0: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
c2f0: 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 20 20 64  er->fd) );.    d
c300: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76  c = sqlite3OsDev
c310: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
c320: 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  cs(pPager->fd);.
c330: 20 20 20 20 6e 53 65 63 74 6f 72 20 3d 20 70 50      nSector = pP
c340: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
c350: 3b 0a 20 20 20 20 73 7a 50 61 67 65 20 3d 20 70  ;.    szPage = p
c360: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
c370: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 53 51 4c  ..    assert(SQL
c380: 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
c390: 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a  512==(512>>8));.
c3a0: 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
c3b0: 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34  E_IOCAP_ATOMIC64
c3c0: 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a  K==(65536>>8));.
c3d0: 20 20 20 20 69 66 28 20 30 3d 3d 28 64 63 26 28      if( 0==(dc&(
c3e0: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
c3f0: 4d 49 43 7c 28 73 7a 50 61 67 65 3e 3e 38 29 29  MIC|(szPage>>8))
c400: 20 7c 7c 20 6e 53 65 63 74 6f 72 3e 73 7a 50 61   || nSector>szPa
c410: 67 65 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ge) ){.      ret
c420: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 0;.    }.  }
c430: 0a 0a 20 20 72 65 74 75 72 6e 20 4a 4f 55 52 4e  ..  return JOURN
c440: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
c450: 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ) + JOURNAL_PG_S
c460: 5a 28 70 50 61 67 65 72 29 3b 0a 7d 0a 23 65 6e  Z(pPager);.}.#en
c470: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51  dif../*.** If SQ
c480: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
c490: 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e   is defined then
c4a0: 20 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e 69   we do some sani
c4b0: 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f  ty checking.** o
c4c0: 6e 20 74 68 65 20 63 61 63 68 65 20 75 73 69 6e  n the cache usin
c4d0: 67 20 61 20 68 61 73 68 20 66 75 6e 63 74 69 6f  g a hash functio
c4e0: 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  n.  This is used
c4f0: 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20   for testing.** 
c500: 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  and debugging on
c510: 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ly..*/.#ifdef SQ
c520: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
c530: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
c540: 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20 74  32-bit hash of t
c550: 68 65 20 70 61 67 65 20 64 61 74 61 20 66 6f 72  he page data for
c560: 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69   pPage..*/.stati
c570: 63 20 75 33 32 20 70 61 67 65 72 5f 64 61 74 61  c u32 pager_data
c580: 68 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c 20  hash(int nByte, 
c590: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
c5a0: 44 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61 73  Data){.  u32 has
c5b0: 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  h = 0;.  int i;.
c5c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 79    for(i=0; i<nBy
c5d0: 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61  te; i++){.    ha
c5e0: 73 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39 29  sh = (hash*1039)
c5f0: 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d   + pData[i];.  }
c600: 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b 0a  .  return hash;.
c610: 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67  }.static u32 pag
c620: 65 72 5f 70 61 67 65 68 61 73 68 28 50 67 48 64  er_pagehash(PgHd
c630: 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74  r *pPage){.  ret
c640: 75 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68 61  urn pager_dataha
c650: 73 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65 72  sh(pPage->pPager
c660: 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 6e 73  ->pageSize, (uns
c670: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 50 61  igned char *)pPa
c680: 67 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 73 74  ge->pData);.}.st
c690: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
c6a0: 73 65 74 5f 70 61 67 65 68 61 73 68 28 50 67 48  set_pagehash(PgH
c6b0: 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 70 50  dr *pPage){.  pP
c6c0: 61 67 65 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  age->pageHash = 
c6d0: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
c6e0: 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
c6f0: 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20 6d  The CHECK_PAGE m
c700: 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67 48  acro takes a PgH
c710: 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65  dr* as an argume
c720: 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43 48  nt. If SQLITE_CH
c730: 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20  ECK_PAGES.** is 
c740: 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45  defined, and NDE
c750: 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  BUG is not defin
c760: 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20  ed, an assert() 
c770: 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b 73  statement checks
c780: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67  .** that the pag
c790: 65 20 69 73 20 65 69 74 68 65 72 20 64 69 72 74  e is either dirt
c7a0: 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63 68  y or still match
c7b0: 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74 65  es the calculate
c7c0: 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a  d page-hash..*/.
c7d0: 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41  #define CHECK_PA
c7e0: 47 45 28 78 29 20 63 68 65 63 6b 50 61 67 65 28  GE(x) checkPage(
c7f0: 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  x).static void c
c800: 68 65 63 6b 50 61 67 65 28 50 67 48 64 72 20 2a  heckPage(PgHdr *
c810: 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
c820: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
c830: 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ger;.  assert( p
c840: 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
c850: 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20  AGER_ERROR );.  
c860: 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c  assert( (pPg->fl
c870: 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 29  ags&PGHDR_DIRTY)
c880: 20 7c 7c 20 70 50 67 2d 3e 70 61 67 65 48 61 73   || pPg->pageHas
c890: 68 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61 73  h==pager_pagehas
c8a0: 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c  h(pPg) );.}..#el
c8b0: 73 65 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72  se.#define pager
c8c0: 5f 64 61 74 61 68 61 73 68 28 58 2c 59 29 20 20  _datahash(X,Y)  
c8d0: 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f  0.#define pager_
c8e0: 70 61 67 65 68 61 73 68 28 58 29 20 20 30 0a 23  pagehash(X)  0.#
c8f0: 64 65 66 69 6e 65 20 70 61 67 65 72 5f 73 65 74  define pager_set
c900: 5f 70 61 67 65 68 61 73 68 28 58 29 0a 23 64 65  _pagehash(X).#de
c910: 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28  fine CHECK_PAGE(
c920: 78 29 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53 51  x).#endif  /* SQ
c930: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
c940: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20   */../*.** When 
c950: 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74  this is called t
c960: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
c970: 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72  for pager pPager
c980: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a   must be open..*
c990: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
c9a0: 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 61 64  attempts to read
c9b0: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
c9c0: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 66 72 6f 6d  l file name from
c9d0: 20 74 68 65 20 0a 2a 2a 20 65 6e 64 20 6f 66 20   the .** end of 
c9e0: 74 68 65 20 66 69 6c 65 20 61 6e 64 2c 20 69 66  the file and, if
c9f0: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 63 6f 70   successful, cop
ca00: 69 65 73 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f  ies it into memo
ca10: 72 79 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20  ry supplied .** 
ca20: 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 53  by the caller. S
ca30: 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76  ee comments abov
ca40: 65 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  e writeMasterJou
ca50: 72 6e 61 6c 28 29 20 66 6f 72 20 74 68 65 20 66  rnal() for the f
ca60: 6f 72 6d 61 74 0a 2a 2a 20 75 73 65 64 20 74 6f  ormat.** used to
ca70: 20 73 74 6f 72 65 20 61 20 6d 61 73 74 65 72 20   store a master 
ca80: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
ca90: 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  e at the end of 
caa0: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  a journal file..
cab0: 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d 75  **.** zMaster mu
cac0: 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  st point to a bu
cad0: 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74  ffer of at least
cae0: 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 61   nMaster bytes a
caf0: 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74  llocated by.** t
cb00: 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 69 73 20  he caller. This 
cb10: 73 68 6f 75 6c 64 20 62 65 20 73 71 6c 69 74 65  should be sqlite
cb20: 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65  3_vfs.mxPathname
cb30: 2b 31 20 28 74 6f 20 65 6e 73 75 72 65 20 74 68  +1 (to ensure th
cb40: 65 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67 68  ere is.** enough
cb50: 20 73 70 61 63 65 20 74 6f 20 77 72 69 74 65 20   space to write 
cb60: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
cb70: 61 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74 68 65  al name). If the
cb80: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
cb90: 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 6a  ** name in the j
cba0: 6f 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65 72  ournal is longer
cbb0: 20 74 68 61 6e 20 6e 4d 61 73 74 65 72 20 62 79   than nMaster by
cbc0: 74 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20 61  tes (including a
cbd0: 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  .** nul-terminat
cbe0: 6f 72 29 2c 20 74 68 65 6e 20 74 68 69 73 20 69  or), then this i
cbf0: 73 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66 20  s handled as if 
cc00: 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
cc10: 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20 70  l name.** were p
cc20: 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 6a 6f  resent in the jo
cc30: 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urnal..**.** If 
cc40: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
cc50: 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72   file name is pr
cc60: 65 73 65 6e 74 20 61 74 20 74 68 65 20 65 6e 64  esent at the end
cc70: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   of the journal.
cc80: 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  ** file, then it
cc90: 20 69 73 20 63 6f 70 69 65 64 20 69 6e 74 6f 20   is copied into 
cca0: 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74  the buffer point
ccb0: 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72  ed to by zMaster
ccc0: 2e 20 41 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69  . A.** nul-termi
ccd0: 6e 61 74 6f 72 20 62 79 74 65 20 69 73 20 61 70  nator byte is ap
cce0: 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 62 75  pended to the bu
ccf0: 66 66 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ffer following t
cd00: 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75  he master.** jou
cd10: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 2e 0a  rnal file name..
cd20: 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 64  **.** If it is d
cd30: 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 6e  etermined that n
cd40: 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
cd50: 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72   file name is pr
cd60: 65 73 65 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74 65  esent .** zMaste
cd70: 72 5b 30 5d 20 69 73 20 73 65 74 20 74 6f 20 30  r[0] is set to 0
cd80: 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
cd90: 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
cda0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
cdb0: 73 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20  s while reading 
cdc0: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
cdd0: 20 66 69 6c 65 2c 20 61 6e 20 53 51 4c 69 74 65   file, an SQLite
cde0: 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69  .** error code i
cdf0: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
ce00: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61  tatic int readMa
ce10: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69  sterJournal(sqli
ce20: 74 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c  te3_file *pJrnl,
ce30: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20   char *zMaster, 
ce40: 75 33 32 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20  u32 nMaster){.  
ce50: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
ce60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
ce70: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75  turn code */.  u
ce80: 33 32 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20  32 len;         
ce90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
cea0: 67 74 68 20 69 6e 20 62 79 74 65 73 20 6f 66 20  gth in bytes of 
ceb0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
cec0: 61 6d 65 20 2a 2f 0a 20 20 69 36 34 20 73 7a 4a  ame */.  i64 szJ
ced0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
cee0: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a      /* Total siz
cef0: 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6a 6f  e in bytes of jo
cf00: 75 72 6e 61 6c 20 66 69 6c 65 20 70 4a 72 6e 6c  urnal file pJrnl
cf10: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b   */.  u32 cksum;
cf20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf30: 20 2f 2a 20 4d 4a 20 63 68 65 63 6b 73 75 6d 20   /* MJ checksum 
cf40: 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  value read from 
cf50: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
cf60: 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   u;             
cf70: 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67          /* Unsig
cf80: 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72  ned loop counter
cf90: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
cfa0: 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20  har aMagic[8];  
cfb0: 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20   /* A buffer to 
cfc0: 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68  hold the magic h
cfd0: 65 61 64 65 72 20 2a 2f 0a 20 20 7a 4d 61 73 74  eader */.  zMast
cfe0: 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20  er[0] = '\0';.. 
cff0: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
d000: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46  (rc = sqlite3OsF
d010: 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26  ileSize(pJrnl, &
d020: 73 7a 4a 29 29 0a 20 20 20 7c 7c 20 73 7a 4a 3c  szJ)).   || szJ<
d030: 31 36 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  16.   || SQLITE_
d040: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
d050: 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d  bits(pJrnl, szJ-
d060: 31 36 2c 20 26 6c 65 6e 29 29 0a 20 20 20 7c 7c  16, &len)).   ||
d070: 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a 20   len>=nMaster . 
d080: 20 20 7c 7c 20 6c 65 6e 3d 3d 30 20 0a 20 20 20    || len==0 .   
d090: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
d0a0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
d0b0: 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26 63  Jrnl, szJ-12, &c
d0c0: 6b 73 75 6d 29 29 0a 20 20 20 7c 7c 20 53 51 4c  ksum)).   || SQL
d0d0: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
d0e0: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e  lite3OsRead(pJrn
d0f0: 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a  l, aMagic, 8, sz
d100: 4a 2d 38 29 29 0a 20 20 20 7c 7c 20 6d 65 6d 63  J-8)).   || memc
d110: 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72  mp(aMagic, aJour
d120: 6e 61 6c 4d 61 67 69 63 2c 20 38 29 0a 20 20 20  nalMagic, 8).   
d130: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
d140: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
d150: 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65 72  d(pJrnl, zMaster
d160: 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65  , len, szJ-16-le
d170: 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  n)).  ){.    ret
d180: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
d190: 2a 20 53 65 65 20 69 66 20 74 68 65 20 63 68 65  * See if the che
d1a0: 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68  cksum matches th
d1b0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
d1c0: 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 75   name */.  for(u
d1d0: 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b  =0; u<len; u++){
d1e0: 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d  .    cksum -= zM
d1f0: 61 73 74 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20 20  aster[u];.  }.  
d200: 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20  if( cksum ){.   
d210: 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63 6b   /* If the check
d220: 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64 20  sum doesn't add 
d230: 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20  up, then one or 
d240: 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73 6b  more of the disk
d250: 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20   sectors.    ** 
d260: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6d  containing the m
d270: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
d280: 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75 70  lename is corrup
d290: 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a  ted. This means.
d2a0: 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c      ** definitel
d2b0: 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20  y roll back, so 
d2c0: 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49  just return SQLI
d2d0: 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74  TE_OK and report
d2e0: 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20   a (nul).    ** 
d2f0: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
d300: 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a  ilename..    */.
d310: 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 7d      len = 0;.  }
d320: 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20  .  zMaster[len] 
d330: 3d 20 27 5c 30 27 3b 0a 20 20 20 0a 20 20 72 65  = '\0';.   .  re
d340: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
d350: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
d360: 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68  the offset of th
d370: 65 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72  e sector boundar
d380: 79 20 61 74 20 6f 72 20 69 6d 6d 65 64 69 61 74  y at or immediat
d390: 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  ely .** followin
d3a0: 67 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70  g the value in p
d3b0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
d3c0: 66 2c 20 61 73 73 75 6d 69 6e 67 20 61 20 73 65  f, assuming a se
d3d0: 63 74 6f 72 20 0a 2a 2a 20 73 69 7a 65 20 6f 66  ctor .** size of
d3e0: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
d3f0: 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a  ize bytes..**.**
d400: 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74 6f   i.e for a secto
d410: 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a  r size of 512:.*
d420: 2a 0a 2a 2a 20 20 20 50 61 67 65 72 2e 6a 6f 75  *.**   Pager.jou
d430: 72 6e 61 6c 4f 66 66 20 20 20 20 20 20 20 20 20  rnalOff         
d440: 20 52 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   Return value.**
d450: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
d460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
d480: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
d490: 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20 20            0.**  
d4a0: 20 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20   512            
d4b0: 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a             512.*
d4c0: 2a 20 20 20 31 30 30 20 20 20 20 20 20 20 20 20  *   100         
d4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31                51
d4e0: 32 0a 2a 2a 20 20 20 32 30 30 30 20 20 20 20 20  2.**   2000     
d4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d500: 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61   2048.** .*/.sta
d510: 74 69 63 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48  tic i64 journalH
d520: 64 72 4f 66 66 73 65 74 28 50 61 67 65 72 20 2a  drOffset(Pager *
d530: 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6f  pPager){.  i64 o
d540: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36 34  ffset = 0;.  i64
d550: 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75   c = pPager->jou
d560: 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63  rnalOff;.  if( c
d570: 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d   ){.    offset =
d580: 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f   ((c-1)/JOURNAL_
d590: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b  HDR_SZ(pPager) +
d5a0: 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44   1) * JOURNAL_HD
d5b0: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  R_SZ(pPager);.  
d5c0: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
d5d0: 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  et%JOURNAL_HDR_S
d5e0: 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a  Z(pPager)==0 );.
d5f0: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
d600: 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=c );.  assert(
d610: 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52   (offset-c)<JOUR
d620: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
d630: 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f  r) );.  return o
d640: 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ffset;.}../*.** 
d650: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
d660: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68   must be open wh
d670: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
d680: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
d690: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
d6a0: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
d6b0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
d6c0: 61 73 20 6e 6f 74 20 62 65 65 6e 20 77 72 69 74  as not been writ
d6d0: 74 65 6e 20 74 6f 0a 2a 2a 20 77 69 74 68 69 6e  ten to.** within
d6e0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
d6f0: 6e 73 61 63 74 69 6f 6e 20 28 69 2e 65 2e 20 69  nsaction (i.e. i
d700: 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  f Pager.journalO
d710: 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  ff==0)..**.** If
d720: 20 64 6f 54 72 75 6e 63 61 74 65 20 69 73 20 6e   doTruncate is n
d730: 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74 68 65 20 50  on-zero or the P
d740: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ager.journalSize
d750: 4c 69 6d 69 74 20 76 61 72 69 61 62 6c 65 20 69  Limit variable i
d760: 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2c 20 74  s.** set to 0, t
d770: 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65  hen truncate the
d780: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
d790: 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73   zero bytes in s
d7a0: 69 7a 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a  ize. Otherwise,.
d7b0: 2a 2a 20 7a 65 72 6f 20 74 68 65 20 32 38 2d 62  ** zero the 28-b
d7c0: 79 74 65 20 68 65 61 64 65 72 20 61 74 20 74 68  yte header at th
d7d0: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a  e start of the j
d7e0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 6e 20  ournal file. In 
d7f0: 65 69 74 68 65 72 20 63 61 73 65 2c 20 0a 2a 2a  either case, .**
d800: 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73   if the pager is
d810: 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20   not in no-sync 
d820: 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a  mode, sync the j
d830: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d 6d 65  ournal file imme
d840: 64 69 61 74 65 6c 79 20 0a 2a 2a 20 61 66 74 65  diately .** afte
d850: 72 20 77 72 69 74 69 6e 67 20 6f 72 20 74 72 75  r writing or tru
d860: 6e 63 61 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a  ncating it..**.*
d870: 2a 20 49 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e  * If Pager.journ
d880: 61 6c 53 69 7a 65 4c 69 6d 69 74 20 69 73 20 73  alSizeLimit is s
d890: 65 74 20 74 6f 20 61 20 70 6f 73 69 74 69 76 65  et to a positive
d8a0: 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  , non-zero value
d8b0: 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  , and.** followi
d8c0: 6e 67 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f  ng the truncatio
d8d0: 6e 20 6f 72 20 7a 65 72 6f 69 6e 67 20 64 65 73  n or zeroing des
d8e0: 63 72 69 62 65 64 20 61 62 6f 76 65 20 74 68 65  cribed above the
d8f0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a   size of the .**
d900: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
d910: 20 62 79 74 65 73 20 69 73 20 6c 61 72 67 65 72   bytes is larger
d920: 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65   than this value
d930: 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20  , then truncate 
d940: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
d950: 69 6c 65 20 74 6f 20 50 61 67 65 72 2e 6a 6f 75  ile to Pager.jou
d960: 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 62 79  rnalSizeLimit by
d970: 74 65 73 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c  tes. The journal
d980: 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f   file does.** no
d990: 74 20 6e 65 65 64 20 74 6f 20 62 65 20 73 79 6e  t need to be syn
d9a0: 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ced following th
d9b0: 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a  is operation..**
d9c0: 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72  .** If an IO err
d9d0: 6f 72 20 6f 63 63 75 72 73 2c 20 61 62 61 6e 64  or occurs, aband
d9e0: 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e  on processing an
d9f0: 64 20 72 65 74 75 72 6e 20 74 68 65 20 49 4f 20  d return the IO 
da00: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20 4f  error code..** O
da10: 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
da20: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
da30: 74 61 74 69 63 20 69 6e 74 20 7a 65 72 6f 4a 6f  tatic int zeroJo
da40: 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a  urnalHdr(Pager *
da50: 70 50 61 67 65 72 2c 20 69 6e 74 20 64 6f 54 72  pPager, int doTr
da60: 75 6e 63 61 74 65 29 7b 0a 20 20 69 6e 74 20 72  uncate){.  int r
da70: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
da80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
daa0: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
dab0: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
dac0: 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
dad0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
dae0: 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20  urnalOff ){.    
daf0: 63 6f 6e 73 74 20 69 36 34 20 69 4c 69 6d 69 74  const i64 iLimit
db00: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
db10: 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20  alSizeLimit;    
db20: 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
db30: 66 20 6a 73 6c 20 2a 2f 0a 0a 20 20 20 20 49 4f  f jsl */..    IO
db40: 54 52 41 43 45 28 28 22 4a 5a 45 52 4f 48 44 52  TRACE(("JZEROHDR
db50: 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
db60: 0a 20 20 20 20 69 66 28 20 64 6f 54 72 75 6e 63  .    if( doTrunc
db70: 61 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30  ate || iLimit==0
db80: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
db90: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
dba0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29  (pPager->jfd, 0)
dbb0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
dbc0: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
dbd0: 63 68 61 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d  char zeroHdr[28]
dbe0: 20 3d 20 7b 30 7d 3b 0a 20 20 20 20 20 20 72 63   = {0};.      rc
dbf0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
dc00: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
dc10: 65 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a  eroHdr, sizeof(z
dc20: 65 72 6f 48 64 72 29 2c 20 30 29 3b 0a 20 20 20  eroHdr), 0);.   
dc30: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
dc40: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50 61  QLITE_OK && !pPa
dc50: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
dc60: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
dc70: 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
dc80: 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43  jfd, SQLITE_SYNC
dc90: 5f 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72  _DATAONLY|pPager
dca0: 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20  ->syncFlags);.  
dcb0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74    }..    /* At t
dcc0: 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 74 72  his point the tr
dcd0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
dce0: 6d 69 74 74 65 64 20 62 75 74 20 74 68 65 20 77  mitted but the w
dcf0: 72 69 74 65 20 6c 6f 63 6b 20 0a 20 20 20 20 2a  rite lock .    *
dd00: 2a 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64 20  * is still held 
dd10: 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20  on the file. If 
dd20: 74 68 65 72 65 20 69 73 20 61 20 73 69 7a 65 20  there is a size 
dd30: 6c 69 6d 69 74 20 63 6f 6e 66 69 67 75 72 65 64  limit configured
dd40: 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68 65   for .    ** the
dd50: 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72   persistent jour
dd60: 6e 61 6c 20 61 6e 64 20 74 68 65 20 6a 6f 75 72  nal and the jour
dd70: 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e 74  nal file current
dd80: 6c 79 20 63 6f 6e 73 75 6d 65 73 20 6d 6f 72 65  ly consumes more
dd90: 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 74 68  .    ** space th
dda0: 61 6e 20 74 68 61 74 20 6c 69 6d 69 74 20 61 6c  an that limit al
ddb0: 6c 6f 77 73 20 66 6f 72 2c 20 74 72 75 6e 63 61  lows for, trunca
ddc0: 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 72 65  te it now. There
ddd0: 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20   is no need.    
dde0: 2a 2a 20 74 6f 20 73 79 6e 63 20 74 68 65 20 66  ** to sync the f
ddf0: 69 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ile following th
de00: 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20  is operation..  
de10: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
de20: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c  =SQLITE_OK && iL
de30: 69 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20 20 20  imit>0 ){.      
de40: 69 36 34 20 73 7a 3b 0a 20 20 20 20 20 20 72 63  i64 sz;.      rc
de50: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
de60: 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
de70: 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 69 66  , &sz);.      if
de80: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
de90: 26 26 20 73 7a 3e 69 4c 69 6d 69 74 20 29 7b 0a  && sz>iLimit ){.
dea0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
deb0: 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
dec0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4c 69 6d  Pager->jfd, iLim
ded0: 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  it);.      }.   
dee0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
def0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
df00: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
df10: 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20  st be open when 
df20: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
df30: 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61  called. A journa
df40: 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f 55  l.** header (JOU
df50: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
df60: 73 29 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  s) is written in
df70: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
df80: 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63 75  ile at the.** cu
df90: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a  rrent location..
dfa0: 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74  **.** The format
dfb0: 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
dfc0: 20 68 65 61 64 65 72 20 69 73 20 61 73 20 66 6f   header is as fo
dfd0: 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79  llows:.** - 8 by
dfe0: 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e 74  tes: Magic ident
dff0: 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66  ifying journal f
e000: 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79  ormat..** - 4 by
e010: 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72  tes: Number of r
e020: 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61  ecords in journa
e030: 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63  l, or -1 no-sync
e040: 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20   mode is on..** 
e050: 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64 6f  - 4 bytes: Rando
e060: 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f  m number used fo
e070: 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20  r page hash..** 
e080: 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74 69  - 4 bytes: Initi
e090: 61 6c 20 64 61 74 61 62 61 73 65 20 70 61 67 65  al database page
e0a0: 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62   count..** - 4 b
e0b0: 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69 7a  ytes: Sector siz
e0c0: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 70 72  e used by the pr
e0d0: 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65  ocess that wrote
e0e0: 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a   this journal..*
e0f0: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 44 61 74  * - 4 bytes: Dat
e100: 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e  abase page size.
e110: 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64  .** .** Followed
e120: 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52   by (JOURNAL_HDR
e130: 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20  _SZ - 28) bytes 
e140: 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 2e  of unused space.
e150: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
e160: 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50  riteJournalHdr(P
e170: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
e180: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
e190: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
e1a0: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
e1b0: 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ode */.  char *z
e1c0: 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 72 2d  Header = pPager-
e1d0: 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 2f 2a 20  >pTmpSpace;  /* 
e1e0: 54 65 6d 70 6f 72 61 72 79 20 73 70 61 63 65 20  Temporary space 
e1f0: 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 68 65  used to build he
e200: 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 48  ader */.  u32 nH
e210: 65 61 64 65 72 20 3d 20 28 75 33 32 29 70 50 61  eader = (u32)pPa
e220: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 2f 2a  ger->pageSize;/*
e230: 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20   Size of buffer 
e240: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 48  pointed to by zH
e250: 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e  eader */.  u32 n
e260: 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20  Write;          
e270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e280: 2a 20 42 79 74 65 73 20 6f 66 20 68 65 61 64 65  * Bytes of heade
e290: 72 20 73 65 63 74 6f 72 20 77 72 69 74 74 65 6e  r sector written
e2a0: 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20 20   */.  int ii;   
e2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
e2d0: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20  p counter */..  
e2e0: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
e2f0: 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20  Pager->jfd) );  
e300: 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66      /* Journal f
e310: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
e320: 2e 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 48 65 61  . */..  if( nHea
e330: 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  der>JOURNAL_HDR_
e340: 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  SZ(pPager) ){.  
e350: 20 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f 55 52    nHeader = JOUR
e360: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
e370: 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  r);.  }..  /* If
e380: 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76   there are activ
e390: 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64  e savepoints and
e3a0: 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 77 65 72   any of them wer
e3b0: 65 20 63 72 65 61 74 65 64 20 0a 20 20 2a 2a 20  e created .  ** 
e3c0: 73 69 6e 63 65 20 74 68 65 20 6d 6f 73 74 20 72  since the most r
e3d0: 65 63 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 68 65  ecent journal he
e3e0: 61 64 65 72 20 77 61 73 20 77 72 69 74 74 65 6e  ader was written
e3f0: 2c 20 75 70 64 61 74 65 20 74 68 65 20 0a 20 20  , update the .  
e400: 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  ** PagerSavepoin
e410: 74 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69 65  t.iHdrOffset fie
e420: 6c 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20  lds now..  */.  
e430: 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61  for(ii=0; ii<pPa
e440: 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
e450: 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20   ii++){.    if( 
e460: 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
e470: 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65  nt[ii].iHdrOffse
e480: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50  t==0 ){.      pP
e490: 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
e4a0: 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 20  [ii].iHdrOffset 
e4b0: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
e4c0: 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lOff;.    }.  }.
e4d0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
e4e0: 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e  alHdr = pPager->
e4f0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75  journalOff = jou
e500: 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50  rnalHdrOffset(pP
e510: 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20  ager);..  /* .  
e520: 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65  ** Write the nRe
e530: 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e 75  c Field - the nu
e540: 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63  mber of page rec
e550: 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77  ords that follow
e560: 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e   this.  ** journ
e570: 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61  al header. Norma
e580: 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72 69  lly, zero is wri
e590: 74 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61 6c  tten to this val
e5a0: 75 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e  ue at this time.
e5b0: 0a 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65 20  .  ** After the 
e5c0: 72 65 63 6f 72 64 73 20 61 72 65 20 61 64 64 65  records are adde
e5d0: 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d to the journal
e5e0: 20 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61   (and the journa
e5f0: 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20  l synced, .  ** 
e600: 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  if in full-sync 
e610: 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f 20  mode), the zero 
e620: 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77  is overwritten w
e630: 69 74 68 20 74 68 65 20 74 72 75 65 20 6e 75 6d  ith the true num
e640: 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f  ber.  ** of reco
e650: 72 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f 75  rds (see syncJou
e660: 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20  rnal())..  **.  
e670: 2a 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74 65  ** A faster alte
e680: 72 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77 72  rnative is to wr
e690: 69 74 65 20 30 78 46 46 46 46 46 46 46 46 20 74  ite 0xFFFFFFFF t
e6a0: 6f 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  o the nRec field
e6b0: 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64  . When.  ** read
e6c0: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
e6d0: 74 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c 73  this value tells
e6e0: 20 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75 6d   SQLite to assum
e6f0: 65 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a 20  e that the.  ** 
e700: 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  rest of the jour
e710: 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  nal file contain
e720: 73 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63  s valid page rec
e730: 6f 72 64 73 2e 20 54 68 69 73 20 61 73 73 75 6d  ords. This assum
e740: 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61  ption.  ** is da
e750: 6e 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20 61  ngerous, as if a
e760: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65   failure occurre
e770: 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67  d whilst writing
e780: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   to the journal.
e790: 20 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61 79    ** file it may
e7a0: 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61   contain some ga
e7b0: 72 62 61 67 65 20 64 61 74 61 2e 20 54 68 65 72  rbage data. Ther
e7c0: 65 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61 72  e are two scenar
e7d0: 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20 74  ios.  ** where t
e7e0: 68 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65 20  his risk can be 
e7f0: 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20  ignored:.  **.  
e800: 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20  **   * When the 
e810: 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73  pager is in no-s
e820: 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70  ync mode. Corrup
e830: 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20  tion can follow 
e840: 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65 72  a.  **     power
e850: 20 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69 73   failure in this
e860: 20 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20 20   case anyway..  
e870: 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e  **.  **   * When
e880: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41   the SQLITE_IOCA
e890: 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66 6c  P_SAFE_APPEND fl
e8a0: 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 73 20  ag is set. This 
e8b0: 67 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20  guarantees.  ** 
e8c0: 20 20 20 20 74 68 61 74 20 67 61 72 62 61 67 65      that garbage
e8d0: 20 64 61 74 61 20 69 73 20 6e 65 76 65 72 20 61   data is never a
e8e0: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 6a  ppended to the j
e8f0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a  ournal file..  *
e900: 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  /.  assert( isOp
e910: 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
e920: 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  | pPager->noSync
e930: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
e940: 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 70 50 61  ->noSync || (pPa
e950: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
e960: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
e970: 4f 44 45 5f 4d 45 4d 4f 52 59 29 0a 20 20 20 7c  ODE_MEMORY).   |
e980: 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69  | (sqlite3OsDevi
e990: 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
e9a0: 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53 51  s(pPager->fd)&SQ
e9b0: 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
e9c0: 41 50 50 45 4e 44 29 20 0a 20 20 29 7b 0a 20 20  APPEND) .  ){.  
e9d0: 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72    memcpy(zHeader
e9e0: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
e9f0: 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
ea00: 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 70 75 74  Magic));.    put
ea10: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
ea20: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
ea30: 61 67 69 63 29 5d 2c 20 30 78 66 66 66 66 66 66  agic)], 0xffffff
ea40: 66 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ff);.  }else{.  
ea50: 20 20 6d 65 6d 73 65 74 28 7a 48 65 61 64 65 72    memset(zHeader
ea60: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75  , 0, sizeof(aJou
ea70: 72 6e 61 6c 4d 61 67 69 63 29 2b 34 29 3b 0a 20  rnalMagic)+4);. 
ea80: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e   }..  /* The ran
ea90: 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20 69  dom check-hash i
eaa0: 6e 69 74 69 61 6c 69 7a 65 72 20 2a 2f 20 0a 20  nitializer */ . 
eab0: 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
eac0: 65 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67 65  ess(sizeof(pPage
ead0: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26  r->cksumInit), &
eae0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
eaf0: 74 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28  t);.  put32bits(
eb00: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
eb10: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34  aJournalMagic)+4
eb20: 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  ], pPager->cksum
eb30: 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20  Init);.  /* The 
eb40: 69 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65  initial database
eb50: 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32   size */.  put32
eb60: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
eb70: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
eb80: 69 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e  ic)+8], pPager->
eb90: 64 62 4f 72 69 67 53 69 7a 65 29 3b 0a 20 20 2f  dbOrigSize);.  /
eba0: 2a 20 54 68 65 20 61 73 73 75 6d 65 64 20 73 65  * The assumed se
ebb0: 63 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74 68  ctor size for th
ebc0: 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20  is process */.  
ebd0: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
ebe0: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
ebf0: 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70 50  alMagic)+12], pP
ec00: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
ec10: 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 70 61 67  );..  /* The pag
ec20: 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33  e size */.  put3
ec30: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
ec40: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
ec50: 67 69 63 29 2b 31 36 5d 2c 20 70 50 61 67 65 72  gic)+16], pPager
ec60: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20  ->pageSize);..  
ec70: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 69 6e 67 20  /* Initializing 
ec80: 74 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65 20  the tail of the 
ec90: 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20 6e 65  buffer is not ne
eca0: 63 65 73 73 61 72 79 2e 20 20 45 76 65 72 79 74  cessary.  Everyt
ecb0: 68 69 6e 67 0a 20 20 2a 2a 20 77 6f 72 6b 73 20  hing.  ** works 
ecc0: 66 69 6e 64 20 69 66 20 74 68 65 20 66 6f 6c 6c  find if the foll
ecd0: 6f 77 69 6e 67 20 6d 65 6d 73 65 74 28 29 20 69  owing memset() i
ece0: 73 20 6f 6d 69 74 74 65 64 2e 20 20 42 75 74 20  s omitted.  But 
ecf0: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 0a 20 20 2a  initializing.  *
ed00: 2a 20 74 68 65 20 6d 65 6d 6f 72 79 20 70 72 65  * the memory pre
ed10: 76 65 6e 74 73 20 76 61 6c 67 72 69 6e 64 20 66  vents valgrind f
ed20: 72 6f 6d 20 63 6f 6d 70 6c 61 69 6e 69 6e 67 2c  rom complaining,
ed30: 20 73 6f 20 77 65 20 61 72 65 20 77 69 6c 6c 69   so we are willi
ed40: 6e 67 20 74 6f 0a 20 20 2a 2a 20 74 61 6b 65 20  ng to.  ** take 
ed50: 74 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  the performance 
ed60: 68 69 74 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73  hit..  */.  mems
ed70: 65 74 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  et(&zHeader[size
ed80: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
ed90: 29 2b 32 30 5d 2c 20 30 2c 0a 20 20 20 20 20 20  )+20], 0,.      
eda0: 20 20 20 6e 48 65 61 64 65 72 2d 28 73 69 7a 65     nHeader-(size
edb0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
edc0: 29 2b 32 30 29 29 3b 0a 0a 20 20 2f 2a 20 49 6e  )+20));..  /* In
edd0: 20 74 68 65 6f 72 79 2c 20 69 74 20 69 73 20 6f   theory, it is o
ede0: 6e 6c 79 20 6e 65 63 65 73 73 61 72 79 20 74 6f  nly necessary to
edf0: 20 77 72 69 74 65 20 74 68 65 20 32 38 20 62 79   write the 28 by
ee00: 74 65 73 20 74 68 61 74 20 74 68 65 20 0a 20 20  tes that the .  
ee10: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ** journal heade
ee20: 72 20 63 6f 6e 73 75 6d 65 73 20 74 6f 20 74 68  r consumes to th
ee30: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
ee40: 65 72 65 2e 20 54 68 65 6e 20 69 6e 63 72 65 6d  ere. Then increm
ee50: 65 6e 74 20 74 68 65 20 0a 20 20 2a 2a 20 50 61  ent the .  ** Pa
ee60: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 76  ger.journalOff v
ee70: 61 72 69 61 62 6c 65 20 62 79 20 4a 4f 55 52 4e  ariable by JOURN
ee80: 41 4c 5f 48 44 52 5f 53 5a 20 73 6f 20 74 68 61  AL_HDR_SZ so tha
ee90: 74 20 74 68 65 20 6e 65 78 74 20 0a 20 20 2a 2a  t the next .  **
eea0: 20 72 65 63 6f 72 64 20 69 73 20 77 72 69 74 74   record is writt
eeb0: 65 6e 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  en to the follow
eec0: 69 6e 67 20 73 65 63 74 6f 72 20 28 6c 65 61 76  ing sector (leav
eed0: 69 6e 67 20 61 20 67 61 70 20 69 6e 20 74 68 65  ing a gap in the
eee0: 20 66 69 6c 65 0a 20 20 2a 2a 20 74 68 61 74 20   file.  ** that 
eef0: 77 69 6c 6c 20 62 65 20 69 6d 70 6c 69 63 69 74  will be implicit
ef00: 6c 79 20 66 69 6c 6c 65 64 20 69 6e 20 62 79 20  ly filled in by 
ef10: 74 68 65 20 4f 53 29 2e 0a 20 20 2a 2a 0a 20 20  the OS)..  **.  
ef20: 2a 2a 20 48 6f 77 65 76 65 72 20 69 74 20 68 61  ** However it ha
ef30: 73 20 62 65 65 6e 20 64 69 73 63 6f 76 65 72 65  s been discovere
ef40: 64 20 74 68 61 74 20 6f 6e 20 73 6f 6d 65 20 73  d that on some s
ef50: 79 73 74 65 6d 73 20 74 68 69 73 20 70 61 74 74  ystems this patt
ef60: 65 72 6e 20 63 61 6e 20 0a 20 20 2a 2a 20 62 65  ern can .  ** be
ef70: 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 20 73   significantly s
ef80: 6c 6f 77 65 72 20 74 68 61 6e 20 63 6f 6e 74 69  lower than conti
ef90: 67 75 6f 75 73 6c 79 20 77 72 69 74 69 6e 67 20  guously writing 
efa0: 64 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c 65  data to the file
efb0: 2c 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 74  ,.  ** even if t
efc0: 68 61 74 20 6d 65 61 6e 73 20 65 78 70 6c 69 63  hat means explic
efd0: 69 74 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74  itly writing dat
efe0: 61 20 74 6f 20 74 68 65 20 62 6c 6f 63 6b 20 6f  a to the block o
eff0: 66 20 0a 20 20 2a 2a 20 28 4a 4f 55 52 4e 41 4c  f .  ** (JOURNAL
f000: 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62 79  _HDR_SZ - 28) by
f010: 74 65 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 6f  tes that will no
f020: 74 20 62 65 20 75 73 65 64 2e 20 53 6f 20 74 68  t be used. So th
f030: 61 74 20 69 73 20 77 68 61 74 0a 20 20 2a 2a 20  at is what.  ** 
f040: 69 73 20 64 6f 6e 65 2e 20 0a 20 20 2a 2a 0a 20  is done. .  **. 
f050: 20 2a 2a 20 54 68 65 20 6c 6f 6f 70 20 69 73 20   ** The loop is 
f060: 72 65 71 75 69 72 65 64 20 68 65 72 65 20 69 6e  required here in
f070: 20 63 61 73 65 20 74 68 65 20 73 65 63 74 6f 72   case the sector
f080: 2d 73 69 7a 65 20 69 73 20 6c 61 72 67 65 72 20  -size is larger 
f090: 74 68 61 6e 20 74 68 65 20 0a 20 20 2a 2a 20 64  than the .  ** d
f0a0: 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a  atabase page siz
f0b0: 65 2e 20 53 69 6e 63 65 20 74 68 65 20 7a 48 65  e. Since the zHe
f0c0: 61 64 65 72 20 62 75 66 66 65 72 20 69 73 20 6f  ader buffer is o
f0d0: 6e 6c 79 20 50 61 67 65 72 2e 70 61 67 65 53 69  nly Pager.pageSi
f0e0: 7a 65 0a 20 20 2a 2a 20 62 79 74 65 73 20 69 6e  ze.  ** bytes in
f0f0: 20 73 69 7a 65 2c 20 6d 6f 72 65 20 74 68 61 6e   size, more than
f100: 20 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   one call to sql
f110: 69 74 65 33 4f 73 57 72 69 74 65 28 29 20 6d 61  ite3OsWrite() ma
f120: 79 20 62 65 20 72 65 71 75 69 72 65 64 0a 20 20  y be required.  
f130: 2a 2a 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74  ** to populate t
f140: 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61  he entire journa
f150: 6c 20 68 65 61 64 65 72 20 73 65 63 74 6f 72 2e  l header sector.
f160: 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 6e 57 72  .  */ .  for(nWr
f170: 69 74 65 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  ite=0; rc==SQLIT
f180: 45 5f 4f 4b 26 26 6e 57 72 69 74 65 3c 4a 4f 55  E_OK&&nWrite<JOU
f190: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
f1a0: 65 72 29 3b 20 6e 57 72 69 74 65 2b 3d 6e 48 65  er); nWrite+=nHe
f1b0: 61 64 65 72 29 7b 0a 20 20 20 20 49 4f 54 52 41  ader){.    IOTRA
f1c0: 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c  CE(("JHDR %p %ll
f1d0: 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  d %d\n", pPager,
f1e0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f1f0: 48 64 72 2c 20 6e 48 65 61 64 65 72 29 29 0a 20  Hdr, nHeader)). 
f200: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
f210: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
f220: 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 6e 48 65  fd, zHeader, nHe
f230: 61 64 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  ader, pPager->jo
f240: 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20 61  urnalOff);.    a
f250: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
f260: 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61  ournalHdr <= pPa
f270: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
f280: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  );.    pPager->j
f290: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48 65  ournalOff += nHe
f2a0: 61 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  ader;.  }..  ret
f2b0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
f2c0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
f2d0: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77  e must be open w
f2e0: 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
f2f0: 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65  ed. A journal he
f300: 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f  ader file.** (JO
f310: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
f320: 65 73 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d  es) is read from
f330: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   the current loc
f340: 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75  ation in the jou
f350: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54 68  rnal.** file. Th
f360: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
f370: 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  on in the journa
f380: 6c 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e 20  l file is given 
f390: 62 79 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 6a 6f  by.** pPager->jo
f3a0: 75 72 6e 61 6c 4f 66 66 2e 20 53 65 65 20 63 6f  urnalOff. See co
f3b0: 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75 6e  mments above fun
f3c0: 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e  ction writeJourn
f3d0: 61 6c 48 64 72 28 29 20 66 6f 72 0a 2a 2a 20 61  alHdr() for.** a
f3e0: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   description of 
f3f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
f400: 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a  er format..**.**
f410: 20 49 66 20 74 68 65 20 68 65 61 64 65 72 20 69   If the header i
f420: 73 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75  s read successfu
f430: 6c 6c 79 2c 20 2a 70 4e 52 65 63 20 69 73 20 73  lly, *pNRec is s
f440: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
f450: 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f   of.** page reco
f460: 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  rds following th
f470: 69 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a 70  is header and *p
f480: 44 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  DbSize is set to
f490: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
f4a0: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65 66  .** database bef
f4b0: 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ore the transact
f4c0: 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70 61  ion began, in pa
f4d0: 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65  ges. Also, pPage
f4e0: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20  r->cksumInit.** 
f4f0: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61  is set to the va
f500: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
f510: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
f520: 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  . SQLITE_OK is r
f530: 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68  eturned.** in th
f540: 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  is case..**.** I
f550: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
f560: 61 64 65 72 20 66 69 6c 65 20 61 70 70 65 61 72  ader file appear
f570: 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74 65  s to be corrupte
f580: 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69  d, SQLITE_DONE i
f590: 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e  s.** returned an
f5a0: 64 20 2a 70 4e 52 65 63 20 61 6e 64 20 2a 50 44  d *pNRec and *PD
f5b0: 62 53 69 7a 65 20 61 72 65 20 75 6e 64 65 66 69  bSize are undefi
f5c0: 6e 65 64 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c  ned.  If JOURNAL
f5d0: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a  _HDR_SZ bytes.**
f5e0: 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64 20   cannot be read 
f5f0: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
f600: 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20 63   file an error c
f610: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
f620: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
f630: 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20  eadJournalHdr(. 
f640: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
f650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f660: 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f   Pager object */
f670: 0a 20 20 69 6e 74 20 69 73 48 6f 74 2c 0a 20 20  .  int isHot,.  
f680: 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c  i64 journalSize,
f690: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f6a0: 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 70 65 6e  Size of the open
f6b0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
f6c0: 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20   bytes */.  u32 
f6d0: 2a 70 4e 52 65 63 2c 20 20 20 20 20 20 20 20 20  *pNRec,         
f6e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
f6f0: 20 56 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   Value read from
f700: 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20   the nRec field 
f710: 2a 2f 0a 20 20 75 33 32 20 2a 70 44 62 53 69 7a  */.  u32 *pDbSiz
f720: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
f730: 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20    /* OUT: Value 
f740: 6f 66 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  of original data
f750: 62 61 73 65 20 73 69 7a 65 20 66 69 65 6c 64 20  base size field 
f760: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
f770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f780: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
f790: 6f 64 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ode */.  unsigne
f7a0: 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d  d char aMagic[8]
f7b0: 3b 20 20 20 20 20 2f 2a 20 41 20 62 75 66 66 65  ;     /* A buffe
f7c0: 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61  r to hold the ma
f7d0: 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  gic header */.  
f7e0: 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20  i64 iHdrOff;    
f7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f800: 4f 66 66 73 65 74 20 6f 66 20 6a 6f 75 72 6e 61  Offset of journa
f810: 6c 20 68 65 61 64 65 72 20 62 65 69 6e 67 20 72  l header being r
f820: 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ead */..  assert
f830: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
f840: 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a  >jfd) );      /*
f850: 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   Journal file mu
f860: 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a  st be open. */..
f870: 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 50 61 67    /* Advance Pag
f880: 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 74 6f  er.journalOff to
f890: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
f8a0: 65 20 6e 65 78 74 20 73 65 63 74 6f 72 2e 20 49  e next sector. I
f8b0: 66 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e  f the.  ** journ
f8c0: 61 6c 20 66 69 6c 65 20 69 73 20 74 6f 6f 20 73  al file is too s
f8d0: 6d 61 6c 6c 20 66 6f 72 20 74 68 65 72 65 20 74  mall for there t
f8e0: 6f 20 62 65 20 61 20 68 65 61 64 65 72 20 73 74  o be a header st
f8f0: 6f 72 65 64 20 61 74 20 74 68 69 73 0a 20 20 2a  ored at this.  *
f900: 2a 20 70 6f 69 6e 74 2c 20 72 65 74 75 72 6e 20  * point, return 
f910: 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a  SQLITE_DONE..  *
f920: 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  /.  pPager->jour
f930: 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c  nalOff = journal
f940: 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72  HdrOffset(pPager
f950: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
f960: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52  >journalOff+JOUR
f970: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
f980: 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65  r) > journalSize
f990: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
f9a0: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a  QLITE_DONE;.  }.
f9b0: 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67    iHdrOff = pPag
f9c0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
f9d0: 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68  .  /* Read in th
f9e0: 65 20 66 69 72 73 74 20 38 20 62 79 74 65 73 20  e first 8 bytes 
f9f0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
fa00: 65 61 64 65 72 2e 20 49 66 20 74 68 65 79 20 64  eader. If they d
fa10: 6f 20 6e 6f 74 20 6d 61 74 63 68 0a 20 20 2a 2a  o not match.  **
fa20: 20 74 68 65 20 20 6d 61 67 69 63 20 73 74 72 69   the  magic stri
fa30: 6e 67 20 66 6f 75 6e 64 20 61 74 20 74 68 65 20  ng found at the 
fa40: 73 74 61 72 74 20 6f 66 20 65 61 63 68 20 6a 6f  start of each jo
fa50: 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 72 65  urnal header, re
fa60: 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45  turn.  ** SQLITE
fa70: 5f 44 4f 4e 45 2e 20 49 66 20 61 6e 20 49 4f 20  _DONE. If an IO 
fa80: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
fa90: 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
faa0: 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20  de. Otherwise,. 
fab0: 20 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a   ** proceed..  *
fac0: 2f 0a 20 20 69 66 28 20 69 73 48 6f 74 20 7c 7c  /.  if( isHot ||
fad0: 20 69 48 64 72 4f 66 66 21 3d 70 50 61 67 65 72   iHdrOff!=pPager
fae0: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 29 7b 0a  ->journalHdr ){.
faf0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
fb00: 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a  OsRead(pPager->j
fb10: 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65  fd, aMagic, size
fb20: 6f 66 28 61 4d 61 67 69 63 29 2c 20 69 48 64 72  of(aMagic), iHdr
fb30: 4f 66 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Off);.    if( rc
fb40: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
fb50: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
fb60: 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63  f( memcmp(aMagic
fb70: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
fb80: 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29   sizeof(aMagic))
fb90: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  !=0 ){.      ret
fba0: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
fbb0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
fbc0: 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20   Read the first 
fbd0: 74 68 72 65 65 20 33 32 2d 62 69 74 20 66 69 65  three 32-bit fie
fbe0: 6c 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  lds of the journ
fbf0: 61 6c 20 68 65 61 64 65 72 3a 20 54 68 65 20 6e  al header: The n
fc00: 52 65 63 0a 20 20 2a 2a 20 66 69 65 6c 64 2c 20  Rec.  ** field, 
fc10: 74 68 65 20 63 68 65 63 6b 73 75 6d 2d 69 6e 69  the checksum-ini
fc20: 74 69 61 6c 69 7a 65 72 20 61 6e 64 20 74 68 65  tializer and the
fc30: 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61   database size a
fc40: 74 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a  t the start.  **
fc50: 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
fc60: 69 6f 6e 2e 20 52 65 74 75 72 6e 20 61 6e 20 65  ion. Return an e
fc70: 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79  rror code if any
fc80: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
fc90: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c  ..  */.  if( SQL
fca0: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
fcb0: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
fcc0: 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 38 2c  >jfd, iHdrOff+8,
fcd0: 20 70 4e 52 65 63 29 29 0a 20 20 20 7c 7c 20 53   pNRec)).   || S
fce0: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
fcf0: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
fd00: 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
fd10: 31 32 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73  12, &pPager->cks
fd20: 75 6d 49 6e 69 74 29 29 0a 20 20 20 7c 7c 20 53  umInit)).   || S
fd30: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
fd40: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
fd50: 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
fd60: 31 36 2c 20 70 44 62 53 69 7a 65 29 29 0a 20 20  16, pDbSize)).  
fd70: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
fd80: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  ;.  }..  if( pPa
fd90: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
fda0: 3d 30 20 29 7b 0a 20 20 20 20 75 33 32 20 69 50  =0 ){.    u32 iP
fdb0: 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  ageSize;        
fdc0: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 2d 73         /* Page-s
fdd0: 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75  ize field of jou
fde0: 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20  rnal header */. 
fdf0: 20 20 20 75 33 32 20 69 53 65 63 74 6f 72 53 69     u32 iSectorSi
fe00: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
fe10: 2f 2a 20 53 65 63 74 6f 72 2d 73 69 7a 65 20 66  /* Sector-size f
fe20: 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  ield of journal 
fe30: 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 20 20 2f  header */..    /
fe40: 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65 2d  * Read the page-
fe50: 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d  size and sector-
fe60: 73 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  size journal hea
fe70: 64 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20  der fields. */. 
fe80: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
fe90: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
fea0: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
feb0: 69 48 64 72 4f 66 66 2b 32 30 2c 20 26 69 53 65  iHdrOff+20, &iSe
fec0: 63 74 6f 72 53 69 7a 65 29 29 0a 20 20 20 20 20  ctorSize)).     
fed0: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
fee0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
fef0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
ff00: 4f 66 66 2b 32 34 2c 20 26 69 50 61 67 65 53 69  Off+24, &iPageSi
ff10: 7a 65 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  ze)).    ){.    
ff20: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
ff30: 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 73 69   }..    /* Versi
ff40: 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72  ons of SQLite pr
ff50: 69 6f 72 20 74 6f 20 33 2e 35 2e 38 20 73 65 74  ior to 3.5.8 set
ff60: 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 66   the page-size f
ff70: 69 65 6c 64 20 6f 66 20 74 68 65 0a 20 20 20 20  ield of the.    
ff80: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ** journal heade
ff90: 72 20 74 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68  r to zero. In th
ffa0: 69 73 20 63 61 73 65 2c 20 61 73 73 75 6d 65 20  is case, assume 
ffb0: 74 68 61 74 20 74 68 65 20 50 61 67 65 72 2e 70  that the Pager.p
ffc0: 61 67 65 53 69 7a 65 0a 20 20 20 20 2a 2a 20 76  ageSize.    ** v
ffd0: 61 72 69 61 62 6c 65 20 69 73 20 61 6c 72 65 61  ariable is alrea
ffe0: 64 79 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f  dy set to the co
fff0: 72 72 65 63 74 20 70 61 67 65 20 73 69 7a 65 2e  rrect page size.
10000 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
10010 69 50 61 67 65 53 69 7a 65 3d 3d 30 20 29 7b 0a  iPageSize==0 ){.
10020 20 20 20 20 20 20 69 50 61 67 65 53 69 7a 65 20        iPageSize 
10030 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
10040 7a 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ze;.    }..    /
10050 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
10060 20 76 61 6c 75 65 73 20 72 65 61 64 20 66 72 6f   values read fro
10070 6d 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  m the page-size 
10080 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  and sector-size 
10090 66 69 65 6c 64 73 0a 20 20 20 20 2a 2a 20 61 72  fields.    ** ar
100a0 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e 20  e within range. 
100b0 54 6f 20 62 65 20 27 69 6e 20 72 61 6e 67 65 27  To be 'in range'
100c0 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 20 6e 65  , both values ne
100d0 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72  ed to be a power
100e0 0a 20 20 20 20 2a 2a 20 6f 66 20 74 77 6f 20 67  .    ** of two g
100f0 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
10100 71 75 61 6c 20 74 6f 20 35 31 32 20 6f 72 20 33  qual to 512 or 3
10110 32 2c 20 61 6e 64 20 6e 6f 74 20 67 72 65 61 74  2, and not great
10120 65 72 20 74 68 61 6e 20 74 68 65 69 72 20 0a 20  er than their . 
10130 20 20 20 2a 2a 20 72 65 73 70 65 63 74 69 76 65     ** respective
10140 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 6d 61   compile time ma
10150 78 69 6d 75 6d 20 6c 69 6d 69 74 73 2e 0a 20 20  ximum limits..  
10160 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61    */.    if( iPa
10170 67 65 53 69 7a 65 3c 35 31 32 20 20 20 20 20 20  geSize<512      
10180 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 69              || i
10190 53 65 63 74 6f 72 53 69 7a 65 3c 33 32 0a 20 20  SectorSize<32.  
101a0 20 20 20 7c 7c 20 69 50 61 67 65 53 69 7a 65 3e     || iPageSize>
101b0 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
101c0 53 49 5a 45 20 7c 7c 20 69 53 65 63 74 6f 72 53  SIZE || iSectorS
101d0 69 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53  ize>MAX_SECTOR_S
101e0 49 5a 45 0a 20 20 20 20 20 7c 7c 20 28 28 69 50  IZE.     || ((iP
101f0 61 67 65 53 69 7a 65 2d 31 29 26 69 50 61 67 65  ageSize-1)&iPage
10200 53 69 7a 65 29 21 3d 30 20 20 20 7c 7c 20 28 28  Size)!=0   || ((
10210 69 53 65 63 74 6f 72 53 69 7a 65 2d 31 29 26 69  iSectorSize-1)&i
10220 53 65 63 74 6f 72 53 69 7a 65 29 21 3d 30 20 0a  SectorSize)!=0 .
10230 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
10240 49 66 20 74 68 65 20 65 69 74 68 65 72 20 74 68  If the either th
10250 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 72 20 73  e page-size or s
10260 65 63 74 6f 72 2d 73 69 7a 65 20 69 6e 20 74 68  ector-size in th
10270 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  e journal-header
10280 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e   is .      ** in
10290 76 61 6c 69 64 2c 20 74 68 65 6e 20 74 68 65 20  valid, then the 
102a0 70 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f  process that wro
102b0 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68  te the journal-h
102c0 65 61 64 65 72 20 6d 75 73 74 20 68 61 76 65 20  eader must have 
102d0 0a 20 20 20 20 20 20 2a 2a 20 63 72 61 73 68 65  .      ** crashe
102e0 64 20 62 65 66 6f 72 65 20 74 68 65 20 68 65 61  d before the hea
102f0 64 65 72 20 77 61 73 20 73 79 6e 63 65 64 2e 20  der was synced. 
10300 49 6e 20 74 68 69 73 20 63 61 73 65 20 73 74 6f  In this case sto
10310 70 20 72 65 61 64 69 6e 67 20 0a 20 20 20 20 20  p reading .     
10320 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
10330 66 69 6c 65 20 68 65 72 65 2e 0a 20 20 20 20 20  file here..     
10340 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
10350 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
10360 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61    }..    /* Upda
10370 74 65 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  te the page-size
10380 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61   to match the va
10390 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
103a0 65 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20  e journal. .    
103b0 2a 2a 20 55 73 65 20 61 20 74 65 73 74 63 61 73  ** Use a testcas
103c0 65 28 29 20 6d 61 63 72 6f 20 74 6f 20 6d 61 6b  e() macro to mak
103d0 65 20 73 75 72 65 20 74 68 61 74 20 6d 61 6c 6c  e sure that mall
103e0 6f 63 20 66 61 69 6c 75 72 65 20 77 69 74 68 69  oc failure withi
103f0 6e 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72 53  n .    ** PagerS
10400 65 74 50 61 67 65 73 69 7a 65 28 29 20 69 73 20  etPagesize() is 
10410 74 65 73 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  tested..    */. 
10420 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
10430 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
10440 70 50 61 67 65 72 2c 20 26 69 50 61 67 65 53 69  pPager, &iPageSi
10450 7a 65 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73  ze, -1);.    tes
10460 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
10470 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  E_OK );..    /* 
10480 55 70 64 61 74 65 20 74 68 65 20 61 73 73 75 6d  Update the assum
10490 65 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 74  ed sector-size t
104a0 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75  o match the valu
104b0 65 20 75 73 65 64 20 62 79 20 0a 20 20 20 20 2a  e used by .    *
104c0 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  * the process th
104d0 61 74 20 63 72 65 61 74 65 64 20 74 68 69 73 20  at created this 
104e0 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69 73  journal. If this
104f0 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 20   journal was.   
10500 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 61   ** created by a
10510 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74   process other t
10520 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68  han this one, th
10530 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
10540 20 20 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20      ** is being 
10550 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68  called from with
10560 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  in pager_playbac
10570 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76  k(). The local v
10580 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20 50  alue.    ** of P
10590 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20  ager.sectorSize 
105a0 69 73 20 72 65 73 74 6f 72 65 64 20 61 74 20 74  is restored at t
105b0 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72  he end of that r
105c0 6f 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20  outine..    */. 
105d0 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f     pPager->secto
105e0 72 53 69 7a 65 20 3d 20 69 53 65 63 74 6f 72 53  rSize = iSectorS
105f0 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67  ize;.  }..  pPag
10600 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
10610 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  = JOURNAL_HDR_SZ
10620 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
10630 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
10640 20 57 72 69 74 65 20 74 68 65 20 73 75 70 70 6c   Write the suppl
10650 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ied master journ
10660 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65  al name into the
10670 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
10680 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67 65  r pager.** pPage
10690 72 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74  r at the current
106a0 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d   location. The m
106b0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
106c0 6d 65 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c  me must be the l
106d0 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69  ast.** thing wri
106e0 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61  tten to a journa
106f0 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70  l file. If the p
10700 61 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d  ager is in full-
10710 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a  sync mode, the.*
10720 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  * journal file d
10730 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 64 76  escriptor is adv
10740 61 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65 78  anced to the nex
10750 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72  t sector boundar
10760 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74  y before.** anyt
10770 68 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e 2e  hing is written.
10780 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a   The format is:.
10790 2a 2a 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65  **.**   + 4 byte
107a0 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  s: PAGER_MJ_PGNO
107b0 2e 0a 2a 2a 20 20 20 2b 20 4e 20 62 79 74 65 73  ..**   + N bytes
107c0 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  : Master journal
107d0 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 75 74 66   filename in utf
107e0 2d 38 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74  -8..**   + 4 byt
107f0 65 73 3a 20 4e 20 28 6c 65 6e 67 74 68 20 6f 66  es: N (length of
10800 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
10810 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 2c 20 6e  name in bytes, n
10820 6f 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  o nul-terminator
10830 29 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65  )..**   + 4 byte
10840 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61  s: Master journa
10850 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e  l name checksum.
10860 0a 2a 2a 20 20 20 2b 20 38 20 62 79 74 65 73 3a  .**   + 8 bytes:
10870 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
10880 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74  ..**.** The mast
10890 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20  er journal page 
108a0 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65 20  checksum is the 
108b0 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65 73  sum of the bytes
108c0 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a 2a   in the master.*
108d0 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c 20  * journal name, 
108e0 77 68 65 72 65 20 65 61 63 68 20 62 79 74 65 20  where each byte 
108f0 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
10900 73 20 61 20 73 69 67 6e 65 64 20 38 2d 62 69 74  s a signed 8-bit
10910 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20   integer..**.** 
10920 49 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61 20  If zMaster is a 
10930 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63  NULL pointer (oc
10940 63 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67 6c  curs for a singl
10950 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  e database trans
10960 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69  action), .** thi
10970 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f  s call is a no-o
10980 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
10990 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
109a0 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
109b0 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  r, const char *z
109c0 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
109d0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
109e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
109f0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
10a00 69 6e 74 20 6e 4d 61 73 74 65 72 3b 20 20 20 20  int nMaster;    
10a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 73 74   /* Length of st
10a30 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a  ring zMaster */.
10a40 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20    i64 iHdrOff;  
10a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a60 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
10a70 68 65 61 64 65 72 20 69 6e 20 6a 6f 75 72 6e 61  header in journa
10a80 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20  l file */.  i64 
10a90 6a 72 6e 6c 53 69 7a 65 3b 20 20 20 20 20 20 20  jrnlSize;       
10aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10ab0 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  Size of journal 
10ac0 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a  file on disk */.
10ad0 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b    u32 cksum = 0;
10ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10af0 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 6f     /* Checksum o
10b00 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65 72  f string zMaster
10b10 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
10b20 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
10b30 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
10b40 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
10b50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20  ager) );..  if( 
10b60 21 7a 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20  !zMaster .   || 
10b70 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
10b80 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
10b90 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20  ALMODE_MEMORY . 
10ba0 20 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50 61    || !isOpen(pPa
10bb0 67 65 72 2d 3e 6a 66 64 29 0a 20 20 29 7b 0a 20  ger->jfd).  ){. 
10bc0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10bd0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  _OK;.  }.  pPage
10be0 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31  r->setMaster = 1
10bf0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
10c00 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c  er->journalHdr <
10c10 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
10c20 6c 4f 66 66 20 29 3b 0a 0a 20 20 2f 2a 20 43 61  lOff );..  /* Ca
10c30 6c 63 75 6c 61 74 65 20 74 68 65 20 6c 65 6e 67  lculate the leng
10c40 74 68 20 69 6e 20 62 79 74 65 73 20 61 6e 64 20  th in bytes and 
10c50 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6f 66 20  the checksum of 
10c60 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 66 6f 72  zMaster */.  for
10c70 28 6e 4d 61 73 74 65 72 3d 30 3b 20 7a 4d 61 73  (nMaster=0; zMas
10c80 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e 4d  ter[nMaster]; nM
10c90 61 73 74 65 72 2b 2b 29 7b 0a 20 20 20 20 63 6b  aster++){.    ck
10ca0 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 6e  sum += zMaster[n
10cb0 4d 61 73 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20 20  Master];.  }..  
10cc0 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79  /* If in full-sy
10cd0 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65  nc mode, advance
10ce0 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69 73   to the next dis
10cf0 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65 20  k sector before 
10d00 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65  writing.  ** the
10d10 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
10d20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69 6e  name. This is in
10d30 20 63 61 73 65 20 74 68 65 20 70 72 65 76 69 6f   case the previo
10d40 75 73 20 70 61 67 65 20 77 72 69 74 74 65 6e 20  us page written 
10d50 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  to.  ** the jour
10d60 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79 20  nal has already 
10d70 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a  been synced..  *
10d80 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
10d90 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20  fullSync ){.    
10da0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
10db0 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f  ff = journalHdrO
10dc0 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  ffset(pPager);. 
10dd0 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20 70   }.  iHdrOff = p
10de0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
10df0 66 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74  f;..  /* Write t
10e00 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
10e10 6c 20 64 61 74 61 20 74 6f 20 74 68 65 20 65 6e  l data to the en
10e20 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d of the journal
10e30 20 66 69 6c 65 2e 20 49 66 0a 20 20 2a 2a 20 61   file. If.  ** a
10e40 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
10e50 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72  return the error
10e60 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c   code to the cal
10e70 6c 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ler..  */.  if( 
10e80 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74  (0 != (rc = writ
10e90 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
10ea0 6a 66 64 2c 20 69 48 64 72 4f 66 66 2c 20 50 41  jfd, iHdrOff, PA
10eb0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
10ec0 65 72 29 29 29 29 0a 20 20 20 7c 7c 20 28 30 20  er)))).   || (0 
10ed0 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  != (rc = sqlite3
10ee0 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
10ef0 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 4d  jfd, zMaster, nM
10f00 61 73 74 65 72 2c 20 69 48 64 72 4f 66 66 2b 34  aster, iHdrOff+4
10f10 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20  ))).   || (0 != 
10f20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74  (rc = write32bit
10f30 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
10f40 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72  HdrOff+4+nMaster
10f50 2c 20 6e 4d 61 73 74 65 72 29 29 29 0a 20 20 20  , nMaster))).   
10f60 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77  || (0 != (rc = w
10f70 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
10f80 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
10f90 34 2b 6e 4d 61 73 74 65 72 2b 34 2c 20 63 6b 73  4+nMaster+4, cks
10fa0 75 6d 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21  um))).   || (0 !
10fb0 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  = (rc = sqlite3O
10fc0 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
10fd0 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  fd, aJournalMagi
10fe0 63 2c 20 38 2c 20 69 48 64 72 4f 66 66 2b 34 2b  c, 8, iHdrOff+4+
10ff0 6e 4d 61 73 74 65 72 2b 38 29 29 29 0a 20 20 29  nMaster+8))).  )
11000 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
11010 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a  .  }.  pPager->j
11020 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d  ournalOff += (nM
11030 61 73 74 65 72 2b 32 30 29 3b 0a 0a 20 20 2f 2a  aster+20);..  /*
11040 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
11050 20 69 6e 20 70 65 72 69 73 74 65 6e 74 2d 6a 6f   in peristent-jo
11060 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68 65 6e  urnal mode, then
11070 20 74 68 65 20 70 68 79 73 69 63 61 6c 20 0a 20   the physical . 
11080 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65   ** journal-file
11090 20 6d 61 79 20 65 78 74 65 6e 64 20 70 61 73 74   may extend past
110a0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
110b0 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e  master-journal n
110c0 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 38 20 62  ame.  ** and 8 b
110d0 79 74 65 73 20 6f 66 20 6d 61 67 69 63 20 64 61  ytes of magic da
110e0 74 61 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20  ta just written 
110f0 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69  to the file. Thi
11100 73 20 69 73 20 0a 20 20 2a 2a 20 64 61 6e 67 65  s is .  ** dange
11110 72 6f 75 73 20 62 65 63 61 75 73 65 20 74 68 65  rous because the
11120 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 62 61 63   code to rollbac
11130 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  k a hot-journal 
11140 66 69 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e  file.  ** will n
11150 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 66 69  ot be able to fi
11160 6e 64 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f  nd the master-jo
11170 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20 64 65  urnal name to de
11180 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68  termine .  ** wh
11190 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
111a0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e   journal is hot.
111b0 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 73 69   .  **.  ** Easi
111c0 65 73 74 20 74 68 69 6e 67 20 74 6f 20 64 6f 20  est thing to do 
111d0 69 6e 20 74 68 69 73 20 73 63 65 6e 61 72 69 6f  in this scenario
111e0 20 69 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20   is to truncate 
111f0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a  the journal .  *
11200 2a 20 66 69 6c 65 20 74 6f 20 74 68 65 20 72 65  * file to the re
11210 71 75 69 72 65 64 20 73 69 7a 65 2e 0a 20 20 2a  quired size..  *
11220 2f 20 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  / .  if( SQLITE_
11230 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK==(rc = sqlite
11240 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
11250 65 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53 69  er->jfd, &jrnlSi
11260 7a 65 29 29 0a 20 20 20 26 26 20 6a 72 6e 6c 53  ze)).   && jrnlS
11270 69 7a 65 3e 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ize>pPager->jour
11280 6e 61 6c 4f 66 66 0a 20 20 29 7b 0a 20 20 20 20  nalOff.  ){.    
11290 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
112a0 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
112b0 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
112c0 6e 61 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20 20 72  nalOff);.  }.  r
112d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
112e0 2a 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 65  ** Discard the e
112f0 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f  ntire contents o
11300 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  f the in-memory 
11310 70 61 67 65 2d 63 61 63 68 65 2e 0a 2a 2f 0a 73  page-cache..*/.s
11320 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
11330 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a 70 50  _reset(Pager *pP
11340 61 67 65 72 29 7b 0a 20 20 70 50 61 67 65 72 2d  ager){.  pPager-
11350 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2b 2b 3b  >iDataVersion++;
11360 0a 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70  .  sqlite3Backup
11370 52 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e  Restart(pPager->
11380 70 42 61 63 6b 75 70 29 3b 0a 20 20 73 71 6c 69  pBackup);.  sqli
11390 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 28 70  te3PcacheClear(p
113a0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
113b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
113c0 20 74 68 65 20 70 50 61 67 65 72 2d 3e 69 44 61   the pPager->iDa
113d0 74 61 56 65 72 73 69 6f 6e 20 76 61 6c 75 65 0a  taVersion value.
113e0 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 50 61  */.u32 sqlite3Pa
113f0 67 65 72 44 61 74 61 56 65 72 73 69 6f 6e 28 50  gerDataVersion(P
11400 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
11410 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
11420 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f 4f 50  >eState>PAGER_OP
11430 45 4e 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  EN );.  return p
11440 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73  Pager->iDataVers
11450 69 6f 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  ion;.}../*.** Fr
11460 65 65 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65  ee all structure
11470 73 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61  s in the Pager.a
11480 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61  Savepoint[] arra
11490 79 20 61 6e 64 20 73 65 74 20 62 6f 74 68 0a 2a  y and set both.*
114a0 2a 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  * Pager.aSavepoi
114b0 6e 74 20 61 6e 64 20 50 61 67 65 72 2e 6e 53 61  nt and Pager.nSa
114c0 76 65 70 6f 69 6e 74 20 74 6f 20 7a 65 72 6f 2e  vepoint to zero.
114d0 20 43 6c 6f 73 65 20 74 68 65 20 73 75 62 2d 6a   Close the sub-j
114e0 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66 20 69 74 20  ournal.** if it 
114f0 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
11500 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20  pager is not in 
11510 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a  exclusive mode..
11520 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
11530 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69  eleaseAllSavepoi
11540 6e 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  nts(Pager *pPage
11550 72 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20  r){.  int ii;   
11560 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
11570 74 65 72 61 74 6f 72 20 66 6f 72 20 6c 6f 6f 70  terator for loop
11580 69 6e 67 20 74 68 72 6f 75 67 68 20 50 61 67 65  ing through Page
11590 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  r.aSavepoint */.
115a0 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
115b0 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
115c0 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73 71  t; ii++){.    sq
115d0 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
115e0 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65  oy(pPager->aSave
115f0 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76  point[ii].pInSav
11600 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20 69  epoint);.  }.  i
11610 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
11620 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 73 71 6c  usiveMode || sql
11630 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c  ite3IsMemJournal
11640 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29  (pPager->sjfd) )
11650 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
11660 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73 6a 66  lose(pPager->sjf
11670 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
11680 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61  3_free(pPager->a
11690 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 70 50  Savepoint);.  pP
116a0 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
116b0 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
116c0 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a  nSavepoint = 0;.
116d0 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65    pPager->nSubRe
116e0 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  c = 0;.}../*.** 
116f0 53 65 74 20 74 68 65 20 62 69 74 20 6e 75 6d 62  Set the bit numb
11700 65 72 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 50  er pgno in the P
11710 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49  agerSavepoint.pI
11720 6e 53 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 62  nSavepoint .** b
11730 69 74 76 65 63 73 20 6f 66 20 61 6c 6c 20 6f 70  itvecs of all op
11740 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 52  en savepoints. R
11750 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
11760 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a 2a 2a  if successful.**
11770 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   or SQLITE_NOMEM
11780 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69   if a malloc fai
11790 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  lure occurs..*/.
117a0 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 54 6f  static int addTo
117b0 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73  SavepointBitvecs
117c0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
117d0 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e  Pgno pgno){.  in
117e0 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
117f0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
11800 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
11810 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
11820 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
11830 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 66 6f 72 28   code */..  for(
11840 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d  ii=0; ii<pPager-
11850 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b  >nSavepoint; ii+
11860 2b 29 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76  +){.    PagerSav
11870 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61  epoint *p = &pPa
11880 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
11890 69 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 67 6e  ii];.    if( pgn
118a0 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20  o<=p->nOrig ){. 
118b0 20 20 20 20 20 72 63 20 7c 3d 20 73 71 6c 69 74       rc |= sqlit
118c0 65 33 42 69 74 76 65 63 53 65 74 28 70 2d 3e 70  e3BitvecSet(p->p
118d0 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e  InSavepoint, pgn
118e0 6f 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  o);.      testca
118f0 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
11900 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 61 73  OMEM );.      as
11910 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
11920 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  _OK || rc==SQLIT
11930 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 7d  E_NOMEM );.    }
11940 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
11950 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
11960 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
11970 2d 6f 70 20 69 66 20 74 68 65 20 70 61 67 65 72  -op if the pager
11980 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65   is in exclusive
11990 20 6d 6f 64 65 20 61 6e 64 20 6e 6f 74 0a 2a 2a   mode and not.**
119a0 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74   in the ERROR st
119b0 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ate. Otherwise, 
119c0 69 74 20 73 77 69 74 63 68 65 73 20 74 68 65 20  it switches the 
119d0 70 61 67 65 72 20 74 6f 20 50 41 47 45 52 5f 4f  pager to PAGER_O
119e0 50 45 4e 0a 2a 2a 20 73 74 61 74 65 2e 0a 2a 2a  PEN.** state..**
119f0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
11a00 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75   is not in exclu
11a10 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65  sive-access mode
11a20 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  , the database f
11a30 69 6c 65 20 69 73 0a 2a 2a 20 63 6f 6d 70 6c 65  ile is.** comple
11a40 74 65 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 49  tely unlocked. I
11a50 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e  f the file is un
11a60 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 66  locked and the f
11a70 69 6c 65 2d 73 79 73 74 65 6d 20 64 6f 65 73 0a  ile-system does.
11a80 2a 2a 20 6e 6f 74 20 65 78 68 69 62 69 74 20 74  ** not exhibit t
11a90 68 65 20 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57  he UNDELETABLE_W
11aa0 48 45 4e 5f 4f 50 45 4e 20 70 72 6f 70 65 72 74  HEN_OPEN propert
11ab0 79 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  y, the journal f
11ac0 69 6c 65 20 69 73 0a 2a 2a 20 63 6c 6f 73 65 64  ile is.** closed
11ad0 20 28 69 66 20 69 74 20 69 73 20 6f 70 65 6e 29   (if it is open)
11ae0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
11af0 61 67 65 72 20 69 73 20 69 6e 20 45 52 52 4f 52  ager is in ERROR
11b00 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73   state when this
11b10 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
11b20 6c 65 64 2c 20 74 68 65 20 0a 2a 2a 20 63 6f 6e  led, the .** con
11b30 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
11b40 65 72 20 63 61 63 68 65 20 61 72 65 20 64 69 73  er cache are dis
11b50 63 61 72 64 65 64 20 62 65 66 6f 72 65 20 73 77  carded before sw
11b60 69 74 63 68 69 6e 67 20 62 61 63 6b 20 74 6f 20  itching back to 
11b70 0a 2a 2a 20 74 68 65 20 4f 50 45 4e 20 73 74 61  .** the OPEN sta
11b80 74 65 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f  te. Regardless o
11b90 66 20 77 68 65 74 68 65 72 20 74 68 65 20 70 61  f whether the pa
11ba0 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73  ger is in exclus
11bb0 69 76 65 2d 6d 6f 64 65 0a 2a 2a 20 6f 72 20 6e  ive-mode.** or n
11bc0 6f 74 2c 20 61 6e 79 20 6a 6f 75 72 6e 61 6c 20  ot, any journal 
11bd0 66 69 6c 65 20 6c 65 66 74 20 69 6e 20 74 68 65  file left in the
11be0 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 77 69 6c   file-system wil
11bf0 6c 20 62 65 20 74 72 65 61 74 65 64 0a 2a 2a 20  l be treated.** 
11c00 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  as a hot-journal
11c10 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62 61 63 6b   and rolled back
11c20 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 61   the next time a
11c30 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
11c40 6e 0a 2a 2a 20 69 73 20 6f 70 65 6e 65 64 20 28  n.** is opened (
11c50 62 79 20 74 68 69 73 20 6f 72 20 62 79 20 61 6e  by this or by an
11c60 79 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  y other connecti
11c70 6f 6e 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  on)..*/.static v
11c80 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  oid pager_unlock
11c90 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
11ca0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
11cb0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
11cc0 52 5f 52 45 41 44 45 52 20 0a 20 20 20 20 20 20  R_READER .      
11cd0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
11ce0 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 0a  te==PAGER_OPEN .
11cf0 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
11d00 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
11d10 45 52 52 4f 52 20 0a 20 20 29 3b 0a 0a 20 20 73  ERROR .  );..  s
11d20 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
11d30 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  roy(pPager->pInJ
11d40 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65  ournal);.  pPage
11d50 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
11d60 30 3b 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53  0;.  releaseAllS
11d70 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72  avepoints(pPager
11d80 29 3b 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55  );..  if( pagerU
11d90 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
11da0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73  .    assert( !is
11db0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
11dc0 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
11dd0 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61  WalEndReadTransa
11de0 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57  ction(pPager->pW
11df0 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  al);.    pPager-
11e00 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
11e10 4f 50 45 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66  OPEN;.  }else if
11e20 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
11e30 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20  siveMode ){.    
11e40 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
11e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11e60 20 45 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75   Error code retu
11e70 72 6e 65 64 20 62 79 20 70 61 67 65 72 55 6e 6c  rned by pagerUnl
11e80 6f 63 6b 44 62 28 29 20 2a 2f 0a 20 20 20 20 69  ockDb() */.    i
11e90 6e 74 20 69 44 63 20 3d 20 69 73 4f 70 65 6e 28  nt iDc = isOpen(
11ea0 70 50 61 67 65 72 2d 3e 66 64 29 3f 73 71 6c 69  pPager->fd)?sqli
11eb0 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
11ec0 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
11ed0 72 2d 3e 66 64 29 3a 30 3b 0a 0a 20 20 20 20 2f  r->fd):0;..    /
11ee0 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 69  * If the operati
11ef0 6e 67 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72  ng system suppor
11f00 74 20 64 65 6c 65 74 69 6f 6e 20 6f 66 20 6f 70  t deletion of op
11f10 65 6e 20 66 69 6c 65 73 2c 20 74 68 65 6e 0a 20  en files, then. 
11f20 20 20 20 2a 2a 20 63 6c 6f 73 65 20 74 68 65 20     ** close the 
11f30 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65  journal file whe
11f40 6e 20 64 72 6f 70 70 69 6e 67 20 74 68 65 20 64  n dropping the d
11f50 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e 20 20 4f  atabase lock.  O
11f60 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20  therwise.    ** 
11f70 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  another connecti
11f80 6f 6e 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f  on with journal_
11f90 6d 6f 64 65 3d 64 65 6c 65 74 65 20 6d 69 67 68  mode=delete migh
11fa0 74 20 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c  t delete the fil
11fb0 65 0a 20 20 20 20 2a 2a 20 6f 75 74 20 66 72 6f  e.    ** out fro
11fc0 6d 20 75 6e 64 65 72 20 75 73 2e 0a 20 20 20 20  m under us..    
11fd0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
11fe0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
11ff0 45 5f 4d 45 4d 4f 52 59 20 20 20 26 20 35 29 21  E_MEMORY   & 5)!
12000 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
12010 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
12020 4d 4f 44 45 5f 4f 46 46 20 20 20 20 20 20 26 20  MODE_OFF      & 
12030 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  5)!=1 );.    ass
12040 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
12050 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20 20 20 20  NALMODE_WAL     
12060 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20   & 5)!=1 );.    
12070 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
12080 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
12090 45 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20  E   & 5)!=1 );. 
120a0 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
120b0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  R_JOURNALMODE_TR
120c0 55 4e 43 41 54 45 20 26 20 35 29 3d 3d 31 20 29  UNCATE & 5)==1 )
120d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
120e0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
120f0 5f 50 45 52 53 49 53 54 20 20 26 20 35 29 3d 3d  _PERSIST  & 5)==
12100 31 20 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  1 );.    if( 0==
12110 28 69 44 63 20 26 20 53 51 4c 49 54 45 5f 49 4f  (iDc & SQLITE_IO
12120 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f  CAP_UNDELETABLE_
12130 57 48 45 4e 5f 4f 50 45 4e 29 0a 20 20 20 20 20  WHEN_OPEN).     
12140 7c 7c 20 31 21 3d 28 70 50 61 67 65 72 2d 3e 6a  || 1!=(pPager->j
12150 6f 75 72 6e 61 6c 4d 6f 64 65 20 26 20 35 29 0a  ournalMode & 5).
12160 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c      ){.      sql
12170 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
12180 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a  er->jfd);.    }.
12190 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70  .    /* If the p
121a0 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 45  ager is in the E
121b0 52 52 4f 52 20 73 74 61 74 65 20 61 6e 64 20 74  RROR state and t
121c0 68 65 20 63 61 6c 6c 20 74 6f 20 75 6e 6c 6f 63  he call to unloc
121d0 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  k the database. 
121e0 20 20 20 2a 2a 20 66 69 6c 65 20 66 61 69 6c 73     ** file fails
121f0 2c 20 73 65 74 20 74 68 65 20 63 75 72 72 65 6e  , set the curren
12200 74 20 6c 6f 63 6b 20 74 6f 20 55 4e 4b 4e 4f 57  t lock to UNKNOW
12210 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20 74 68 65 20  N_LOCK. See the 
12220 63 6f 6d 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 61  comment.    ** a
12230 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e 65  bove the #define
12240 20 66 6f 72 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43   for UNKNOWN_LOC
12250 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61  K for an explana
12260 74 69 6f 6e 20 6f 66 20 77 68 79 20 74 68 69 73  tion of why this
12270 0a 20 20 20 20 2a 2a 20 69 73 20 6e 65 63 65 73  .    ** is neces
12280 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  sary..    */.   
12290 20 72 63 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63   rc = pagerUnloc
122a0 6b 44 62 28 70 50 61 67 65 72 2c 20 4e 4f 5f 4c  kDb(pPager, NO_L
122b0 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63  OCK);.    if( rc
122c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  !=SQLITE_OK && p
122d0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
122e0 41 47 45 52 5f 45 52 52 4f 52 20 29 7b 0a 20 20  AGER_ERROR ){.  
122f0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63      pPager->eLoc
12300 6b 20 3d 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  k = UNKNOWN_LOCK
12310 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
12320 54 68 65 20 70 61 67 65 72 20 73 74 61 74 65 20  The pager state 
12330 6d 61 79 20 62 65 20 63 68 61 6e 67 65 64 20 66  may be changed f
12340 72 6f 6d 20 50 41 47 45 52 5f 45 52 52 4f 52 20  rom PAGER_ERROR 
12350 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20 68 65  to PAGER_OPEN he
12360 72 65 0a 20 20 20 20 2a 2a 20 77 69 74 68 6f 75  re.    ** withou
12370 74 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20 65  t clearing the e
12380 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 69 73 20  rror code. This 
12390 69 73 20 69 6e 74 65 6e 74 69 6f 6e 61 6c 20 2d  is intentional -
123a0 20 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20 2a   the error.    *
123b0 2a 20 63 6f 64 65 20 69 73 20 63 6c 65 61 72 65  * code is cleare
123c0 64 20 61 6e 64 20 74 68 65 20 63 61 63 68 65 20  d and the cache 
123d0 72 65 73 65 74 20 69 6e 20 74 68 65 20 62 6c 6f  reset in the blo
123e0 63 6b 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f  ck below..    */
123f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
12400 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20  ger->errCode || 
12410 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
12420 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20  PAGER_ERROR );. 
12430 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
12440 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a  eCountDone = 0;.
12450 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
12460 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b  te = PAGER_OPEN;
12470 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 50 61  .  }..  /* If Pa
12480 67 65 72 2e 65 72 72 43 6f 64 65 20 69 73 20 73  ger.errCode is s
12490 65 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  et, the contents
124a0 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63 61   of the pager ca
124b0 63 68 65 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20  che cannot be.  
124c0 2a 2a 20 74 72 75 73 74 65 64 2e 20 4e 6f 77 20  ** trusted. Now 
124d0 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20 6e  that there are n
124e0 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  o outstanding re
124f0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
12500 70 61 67 65 72 2c 0a 20 20 2a 2a 20 69 74 20 63  pager,.  ** it c
12510 61 6e 20 73 61 66 65 6c 79 20 6d 6f 76 65 20 62  an safely move b
12520 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 4f 50 45  ack to PAGER_OPE
12530 4e 20 73 74 61 74 65 2e 20 54 68 69 73 20 68 61  N state. This ha
12540 70 70 65 6e 73 20 69 6e 20 62 6f 74 68 0a 20 20  ppens in both.  
12550 2a 2a 20 6e 6f 72 6d 61 6c 20 61 6e 64 20 65 78  ** normal and ex
12560 63 6c 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20  clusive-locking 
12570 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  mode..  */.  if(
12580 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
12590 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
125a0 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 70 61  !MEMDB );.    pa
125b0 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
125c0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  );.    pPager->c
125d0 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
125e0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
125f0 65 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  e;.    pPager->e
12600 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50  State = PAGER_OP
12610 45 4e 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  EN;.    pPager->
12620 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45  errCode = SQLITE
12630 5f 4f 4b 3b 0a 20 20 20 20 69 66 28 20 55 53 45  _OK;.    if( USE
12640 46 45 54 43 48 28 70 50 61 67 65 72 29 20 29 20  FETCH(pPager) ) 
12650 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68  sqlite3OsUnfetch
12660 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20  (pPager->fd, 0, 
12670 30 29 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65  0);.  }..  pPage
12680 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
12690 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  0;.  pPager->jou
126a0 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 70  rnalHdr = 0;.  p
126b0 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
126c0 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   = 0;.}../*.** T
126d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
126e0 63 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20  called whenever 
126f0 61 6e 20 49 4f 45 52 52 20 6f 72 20 46 55 4c 4c  an IOERR or FULL
12700 20 65 72 72 6f 72 20 74 68 61 74 20 72 65 71 75   error that requ
12710 69 72 65 73 0a 2a 2a 20 74 68 65 20 70 61 67 65  ires.** the page
12720 72 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 20  r to transition 
12730 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73  into the ERROR s
12740 74 61 74 65 20 6d 61 79 20 61 68 76 65 20 6f 63  tate may ahve oc
12750 63 75 72 72 65 64 2e 0a 2a 2a 20 54 68 65 20 66  curred..** The f
12760 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
12770 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
12780 65 20 70 61 67 65 72 20 73 74 72 75 63 74 75 72  e pager structur
12790 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a  e, the second .*
127a0 2a 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65  * the error-code
127b0 20 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74   about to be ret
127c0 75 72 6e 65 64 20 62 79 20 61 20 70 61 67 65 72  urned by a pager
127d0 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20 54   API function. T
127e0 68 65 20 0a 2a 2a 20 76 61 6c 75 65 20 72 65 74  he .** value ret
127f0 75 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20  urned is a copy 
12800 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  of the second ar
12810 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
12820 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20  unction. .**.** 
12830 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
12840 67 75 6d 65 6e 74 20 69 73 20 53 51 4c 49 54 45  gument is SQLITE
12850 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f  _FULL, SQLITE_IO
12860 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68  ERR or one of th
12870 65 0a 2a 2a 20 49 4f 45 52 52 20 73 75 62 2d 63  e.** IOERR sub-c
12880 6f 64 65 73 2c 20 74 68 65 20 70 61 67 65 72 20  odes, the pager 
12890 65 6e 74 65 72 73 20 74 68 65 20 45 52 52 4f 52  enters the ERROR
128a0 20 73 74 61 74 65 20 61 6e 64 20 74 68 65 20 65   state and the e
128b0 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20  rror code.** is 
128c0 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e  stored in Pager.
128d0 65 72 72 43 6f 64 65 2e 20 57 68 69 6c 65 20 74  errCode. While t
128e0 68 65 20 70 61 67 65 72 20 72 65 6d 61 69 6e 73  he pager remains
128f0 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74   in the ERROR st
12900 61 74 65 2c 0a 2a 2a 20 61 6c 6c 20 6d 61 6a 6f  ate,.** all majo
12910 72 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74  r API calls on t
12920 68 65 20 50 61 67 65 72 20 77 69 6c 6c 20 69 6d  he Pager will im
12930 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e  mediately return
12940 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e 0a   Pager.errCode..
12950 2a 2a 0a 2a 2a 20 54 68 65 20 45 52 52 4f 52 20  **.** The ERROR 
12960 73 74 61 74 65 20 69 6e 64 69 63 61 74 65 73 20  state indicates 
12970 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  that the content
12980 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63  s of the pager-c
12990 61 63 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20  ache .** cannot 
129a0 62 65 20 74 72 75 73 74 65 64 2e 20 54 68 69 73  be trusted. This
129b0 20 73 74 61 74 65 20 63 61 6e 20 62 65 20 63 6c   state can be cl
129c0 65 61 72 65 64 20 62 79 20 63 6f 6d 70 6c 65 74  eared by complet
129d0 65 6c 79 20 64 69 73 63 61 72 64 69 6e 67 20 0a  ely discarding .
129e0 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ** the contents 
129f0 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  of the pager-cac
12a00 68 65 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63  he. If a transac
12a10 74 69 6f 6e 20 77 61 73 20 61 63 74 69 76 65 20  tion was active 
12a20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73  when.** the pers
12a30 69 73 74 65 6e 74 20 65 72 72 6f 72 20 6f 63 63  istent error occ
12a40 75 72 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20  urred, then the 
12a50 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
12a60 20 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20   may need.** to 
12a70 62 65 20 72 65 70 6c 61 79 65 64 20 74 6f 20 72  be replayed to r
12a80 65 73 74 6f 72 65 20 74 68 65 20 63 6f 6e 74 65  estore the conte
12a90 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  nts of the datab
12aa0 61 73 65 20 66 69 6c 65 20 28 61 73 20 69 66 0a  ase file (as if.
12ab0 2a 2a 20 69 74 20 77 65 72 65 20 61 20 68 6f 74  ** it were a hot
12ac0 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74  -journal)..*/.st
12ad0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65  atic int pager_e
12ae0 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67  rror(Pager *pPag
12af0 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69  er, int rc){.  i
12b00 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20 30 78  nt rc2 = rc & 0x
12b10 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  ff;.  assert( rc
12b20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21  ==SQLITE_OK || !
12b30 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72  MEMDB );.  asser
12b40 74 28 0a 20 20 20 20 20 20 20 70 50 61 67 65 72  t(.       pPager
12b50 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
12b60 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20  E_FULL ||.      
12b70 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
12b80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20  ==SQLITE_OK ||. 
12b90 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65        (pPager->e
12ba0 72 72 43 6f 64 65 20 26 20 30 78 66 66 29 3d 3d  rrCode & 0xff)==
12bb0 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 29  SQLITE_IOERR.  )
12bc0 3b 0a 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c  ;.  if( rc2==SQL
12bd0 49 54 45 5f 46 55 4c 4c 20 7c 7c 20 72 63 32 3d  ITE_FULL || rc2=
12be0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b  =SQLITE_IOERR ){
12bf0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
12c00 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 70  Code = rc;.    p
12c10 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
12c20 50 41 47 45 52 5f 45 52 52 4f 52 3b 0a 20 20 7d  PAGER_ERROR;.  }
12c30 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12c40 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
12c50 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72  r_truncate(Pager
12c60 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e   *pPager, Pgno n
12c70 50 61 67 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  Page);../*.** Th
12c80 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 64 73 20  is routine ends 
12c90 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41  a transaction. A
12ca0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
12cb0 75 73 75 61 6c 6c 79 20 65 6e 64 65 64 20 62 79  usually ended by
12cc0 20 0a 2a 2a 20 65 69 74 68 65 72 20 61 20 43 4f   .** either a CO
12cd0 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41  MMIT or a ROLLBA
12ce0 43 4b 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68  CK operation. Th
12cf0 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 62  is routine may b
12d00 65 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 61 66 74  e called .** aft
12d10 65 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61  er rollback of a
12d20 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72   hot-journal, or
12d30 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
12d40 75 72 73 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e  urs while openin
12d50 67 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g.** the journal
12d60 20 66 69 6c 65 20 6f 72 20 77 72 69 74 69 6e 67   file or writing
12d70 20 74 68 65 20 76 65 72 79 20 66 69 72 73 74 20   the very first 
12d80 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6f  journal-header o
12d90 66 20 61 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  f a.** database 
12da0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
12db0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
12dc0 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
12dd0 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20   in PAGER_ERROR 
12de0 73 74 61 74 65 2e 20 49 66 20 69 74 20 69 73 20  state. If it is 
12df0 63 61 6c 6c 65 64 0a 2a 2a 20 69 6e 20 50 41 47  called.** in PAG
12e00 45 52 5f 4e 4f 4e 45 20 6f 72 20 50 41 47 45 52  ER_NONE or PAGER
12e10 5f 53 48 41 52 45 44 20 73 74 61 74 65 20 61 6e  _SHARED state an
12e20 64 20 74 68 65 20 6c 6f 63 6b 20 68 65 6c 64 20  d the lock held 
12e30 69 73 20 6c 65 73 73 0a 2a 2a 20 65 78 63 6c 75  is less.** exclu
12e40 73 69 76 65 20 74 68 61 6e 20 61 20 52 45 53 45  sive than a RESE
12e50 52 56 45 44 20 6c 6f 63 6b 2c 20 69 74 20 69 73  RVED lock, it is
12e60 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
12e70 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 79 20 61  Otherwise, any a
12e80 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73  ctive savepoints
12e90 20 61 72 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a   are released..*
12ea0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
12eb0 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  nal file is open
12ec0 2c 20 74 68 65 6e 20 69 74 20 69 73 20 22 66 69  , then it is "fi
12ed0 6e 61 6c 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61  nalized". Once a
12ee0 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c   journal .** fil
12ef0 65 20 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c  e has been final
12f00 69 7a 65 64 20 69 74 20 69 73 20 6e 6f 74 20 70  ized it is not p
12f10 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20 69  ossible to use i
12f20 74 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61  t to roll back a
12f30 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e   .** transaction
12f40 2e 20 4e 6f 72 20 77 69 6c 6c 20 69 74 20 62 65  . Nor will it be
12f50 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62   considered to b
12f60 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  e a hot-journal 
12f70 62 79 20 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e  by this.** or an
12f80 79 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  y other database
12f90 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61   connection. Exa
12fa0 63 74 6c 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e  ctly how a journ
12fb0 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a  al is finalized.
12fc0 2a 2a 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68  ** depends on wh
12fd0 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
12fe0 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e   pager is runnin
12ff0 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  g in exclusive m
13000 6f 64 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63  ode and.** the c
13010 75 72 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d  urrent journal-m
13020 6f 64 65 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e  ode (Pager.journ
13030 61 6c 4d 6f 64 65 20 76 61 6c 75 65 29 2c 20 61  alMode value), a
13040 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
13050 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d     journalMode==
13060 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f  MEMORY.**     Jo
13070 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
13080 69 70 74 6f 72 20 69 73 20 73 69 6d 70 6c 79 20  iptor is simply 
13090 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 64 65 73  closed. This des
130a0 74 72 6f 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20  troys an .**    
130b0 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e   in-memory journ
130c0 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72  al..**.**   jour
130d0 6e 61 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54  nalMode==TRUNCAT
130e0 45 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c  E.**     Journal
130f0 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74   file is truncat
13100 65 64 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73  ed to zero bytes
13110 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20   in size..**.** 
13120 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50    journalMode==P
13130 45 52 53 49 53 54 0a 2a 2a 20 20 20 20 20 54 68  ERSIST.**     Th
13140 65 20 66 69 72 73 74 20 32 38 20 62 79 74 65 73  e first 28 bytes
13150 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
13160 66 69 6c 65 20 61 72 65 20 7a 65 72 6f 65 64 2e  file are zeroed.
13170 20 54 68 69 73 20 69 6e 76 61 6c 69 64 61 74 65   This invalidate
13180 73 0a 2a 2a 20 20 20 20 20 74 68 65 20 66 69 72  s.**     the fir
13190 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
131a0 72 20 69 6e 20 74 68 65 20 66 69 6c 65 2c 20 61  r in the file, a
131b0 6e 64 20 68 65 6e 63 65 20 74 68 65 20 65 6e 74  nd hence the ent
131c0 69 72 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  ire journal.**  
131d0 20 20 20 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61     file. An inva
131e0 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  lid journal file
131f0 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65   cannot be rolle
13200 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20  d back..**.**   
13210 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c  journalMode==DEL
13220 45 54 45 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a  ETE.**     The j
13230 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63  ournal file is c
13240 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65  losed and delete
13250 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f  d using sqlite3O
13260 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a  sDelete()..**.**
13270 20 20 20 20 20 49 66 20 74 68 65 20 70 61 67 65       If the page
13280 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20  r is running in 
13290 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20  exclusive mode, 
132a0 74 68 69 73 20 6d 65 74 68 6f 64 20 6f 66 20 66  this method of f
132b0 69 6e 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20  inalizing.**    
132c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
132d0 65 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e  e is never used.
132e0 20 49 6e 73 74 65 61 64 2c 20 69 66 20 74 68 65   Instead, if the
132f0 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a   journalMode is.
13300 2a 2a 20 20 20 20 20 44 45 4c 45 54 45 20 61 6e  **     DELETE an
13310 64 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  d the pager is i
13320 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
13330 2c 20 74 68 65 20 6d 65 74 68 6f 64 20 64 65 73  , the method des
13340 63 72 69 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20  cribed under.** 
13350 20 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d      journalMode=
13360 3d 50 45 52 53 49 53 54 20 69 73 20 75 73 65 64  =PERSIST is used
13370 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20   instead..**.** 
13380 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61  After the journa
13390 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20  l is finalized, 
133a0 74 68 65 20 70 61 67 65 72 20 6d 6f 76 65 73 20  the pager moves 
133b0 74 6f 20 50 41 47 45 52 5f 52 45 41 44 45 52 20  to PAGER_READER 
133c0 73 74 61 74 65 2e 0a 2a 2a 20 49 66 20 72 75 6e  state..** If run
133d0 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c  ning in non-excl
133e0 75 73 69 76 65 20 72 6f 6c 6c 62 61 63 6b 20 6d  usive rollback m
133f0 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20 6f 6e  ode, the lock on
13400 20 74 68 65 20 66 69 6c 65 20 69 73 20 0a 2a 2a   the file is .**
13410 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 61   downgraded to a
13420 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
13430 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
13440 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20   returned if no 
13450 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 49 66  error occurs. If
13460 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
13470 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f   during.** any o
13480 66 20 74 68 65 20 49 4f 20 6f 70 65 72 61 74 69  f the IO operati
13490 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20  ons to finalize 
134a0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
134b0 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a   or unlock the.*
134c0 2a 20 64 61 74 61 62 61 73 65 20 74 68 65 6e 20  * database then 
134d0 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
134e0 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f  e is returned to
134f0 20 74 68 65 20 75 73 65 72 2e 20 49 66 20 74 68   the user. If th
13500 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20  e .** operation 
13510 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20  to finalize the 
13520 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69  journal file fai
13530 6c 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 64  ls, then the cod
13540 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72 69 65 73  e still.** tries
13550 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64   to unlock the d
13560 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20  atabase file if 
13570 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65  not in exclusive
13580 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 0a 2a 2a   mode. If the.**
13590 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f   unlock operatio
135a0 6e 20 66 61 69 6c 73 20 61 73 20 77 65 6c 6c 2c  n fails as well,
135b0 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   then the first 
135c0 65 72 72 6f 72 20 63 6f 64 65 20 72 65 6c 61 74  error code relat
135d0 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72  ed.** to the fir
135e0 73 74 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74  st error encount
135f0 65 72 65 64 20 28 74 68 65 20 6a 6f 75 72 6e 61  ered (the journa
13600 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f  l finalization o
13610 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  ne) is.** return
13620 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
13630 74 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  t pager_end_tran
13640 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70  saction(Pager *p
13650 50 61 67 65 72 2c 20 69 6e 74 20 68 61 73 4d 61  Pager, int hasMa
13660 73 74 65 72 2c 20 69 6e 74 20 62 43 6f 6d 6d 69  ster, int bCommi
13670 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
13680 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f  QLITE_OK;      /
13690 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f  * Error code fro
136a0 6d 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69  m journal finali
136b0 7a 61 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e  zation operation
136c0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32 20 3d 20   */.  int rc2 = 
136d0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f  SQLITE_OK;     /
136e0 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f  * Error code fro
136f0 6d 20 64 62 20 66 69 6c 65 20 75 6e 6c 6f 63 6b  m db file unlock
13700 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20   operation */.. 
13710 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69   /* Do nothing i
13720 66 20 74 68 65 20 70 61 67 65 72 20 64 6f 65 73  f the pager does
13730 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 6f 70 65   not have an ope
13740 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  n write transact
13750 69 6f 6e 0a 20 20 2a 2a 20 6f 72 20 61 74 20 6c  ion.  ** or at l
13760 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44 20  east a RESERVED 
13770 6c 6f 63 6b 2e 20 54 68 69 73 20 66 75 6e 63 74  lock. This funct
13780 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65  ion may be calle
13790 64 20 77 68 65 6e 20 74 68 65 72 65 0a 20 20 2a  d when there.  *
137a0 2a 20 69 73 20 6e 6f 20 77 72 69 74 65 2d 74 72  * is no write-tr
137b0 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65  ansaction active
137c0 20 62 75 74 20 61 20 52 45 53 45 52 56 45 44 20   but a RESERVED 
137d0 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
137e0 69 73 0a 20 20 2a 2a 20 68 65 6c 64 20 75 6e 64  is.  ** held und
137f0 65 72 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61  er two circumsta
13800 6e 63 65 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  nces:.  **.  ** 
13810 20 20 31 2e 20 41 66 74 65 72 20 61 20 73 75 63    1. After a suc
13820 63 65 73 73 66 75 6c 20 68 6f 74 2d 6a 6f 75 72  cessful hot-jour
13830 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74  nal rollback, it
13840 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 0a   is called with.
13850 20 20 2a 2a 20 20 20 20 20 20 65 53 74 61 74 65    **      eState
13860 3d 3d 50 41 47 45 52 5f 4e 4f 4e 45 20 61 6e 64  ==PAGER_NONE and
13870 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56   eLock==EXCLUSIV
13880 45 5f 4c 4f 43 4b 2e 0a 20 20 2a 2a 0a 20 20 2a  E_LOCK..  **.  *
13890 2a 20 20 20 32 2e 20 49 66 20 61 20 63 6f 6e 6e  *   2. If a conn
138a0 65 63 74 69 6f 6e 20 77 69 74 68 20 6c 6f 63 6b  ection with lock
138b0 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
138c0 76 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58  ve holding an EX
138d0 43 4c 55 53 49 56 45 20 0a 20 20 2a 2a 20 20 20  CLUSIVE .  **   
138e0 20 20 20 6c 6f 63 6b 20 73 77 69 74 63 68 65 73     lock switches
138f0 20 62 61 63 6b 20 74 6f 20 6c 6f 63 6b 69 6e 67   back to locking
13900 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 61 6e 64  _mode=normal and
13910 20 74 68 65 6e 20 65 78 65 63 75 74 65 73 20 61   then executes a
13920 0a 20 20 2a 2a 20 20 20 20 20 20 72 65 61 64 2d  .  **      read-
13930 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 69  transaction, thi
13940 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
13950 6c 6c 65 64 20 77 69 74 68 20 65 53 74 61 74 65  lled with eState
13960 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 0a  ==PAGER_READER .
13970 20 20 2a 2a 20 20 20 20 20 20 61 6e 64 20 65 4c    **      and eL
13980 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
13990 4f 43 4b 20 77 68 65 6e 20 74 68 65 20 72 65 61  OCK when the rea
139a0 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d-transaction is
139b0 20 63 6c 6f 73 65 64 2e 0a 20 20 2a 2f 0a 20 20   closed..  */.  
139c0 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
139d0 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
139e0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
139f0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
13a00 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20  PAGER_ERROR );. 
13a10 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
13a20 61 74 65 3c 50 41 47 45 52 5f 57 52 49 54 45 52  ate<PAGER_WRITER
13a30 5f 4c 4f 43 4b 45 44 20 26 26 20 70 50 61 67 65  _LOCKED && pPage
13a40 72 2d 3e 65 4c 6f 63 6b 3c 52 45 53 45 52 56 45  r->eLock<RESERVE
13a50 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65  D_LOCK ){.    re
13a60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13a70 20 20 7d 0a 0a 20 20 72 65 6c 65 61 73 65 41 6c    }..  releaseAl
13a80 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67  lSavepoints(pPag
13a90 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  er);.  assert( i
13aa0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
13ab0 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 49  d) || pPager->pI
13ac0 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
13ad0 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
13ae0 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
13af0 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
13b00 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
13b10 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65  .    /* Finalize
13b20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
13b30 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71  e. */.    if( sq
13b40 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61  lite3IsMemJourna
13b50 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  l(pPager->jfd) )
13b60 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
13b70 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
13b80 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
13b90 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b  ALMODE_MEMORY );
13ba0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
13bb0 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
13bc0 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  d);.    }else if
13bd0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
13be0 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
13bf0 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
13c00 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  E ){.      if( p
13c10 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
13c20 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  f==0 ){.        
13c30 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
13c40 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
13c50 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
13c60 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
13c70 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20  er->jfd, 0);.   
13c80 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
13c90 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
13ca0 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ->fullSync ){.  
13cb0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20          /* Make 
13cc0 73 75 72 65 20 74 68 65 20 6e 65 77 20 66 69 6c  sure the new fil
13cd0 65 20 73 69 7a 65 20 69 73 20 77 72 69 74 74 65  e size is writte
13ce0 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 6f 64 65  n into the inode
13cf0 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 20   right away..   
13d00 20 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72 77         ** Otherw
13d10 69 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ise the journal 
13d20 6d 69 67 68 74 20 72 65 73 75 72 72 65 63 74 20  might resurrect 
13d30 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77 65  following a powe
13d40 72 20 6c 6f 73 73 20 61 6e 64 0a 20 20 20 20 20  r loss and.     
13d50 20 20 20 20 20 2a 2a 20 63 61 75 73 65 20 74 68       ** cause th
13d60 65 20 6c 61 73 74 20 74 72 61 6e 73 61 63 74 69  e last transacti
13d70 6f 6e 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e  on to roll back.
13d80 20 20 53 65 65 0a 20 20 20 20 20 20 20 20 20 20    See.          
13d90 2a 2a 20 68 74 74 70 73 3a 2f 2f 62 75 67 7a 69  ** https://bugzi
13da0 6c 6c 61 2e 6d 6f 7a 69 6c 6c 61 2e 6f 72 67 2f  lla.mozilla.org/
13db0 73 68 6f 77 5f 62 75 67 2e 63 67 69 3f 69 64 3d  show_bug.cgi?id=
13dc0 31 30 37 32 37 37 33 0a 20 20 20 20 20 20 20 20  1072773.        
13dd0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72    */.          r
13de0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
13df0 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  c(pPager->jfd, p
13e00 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
13e10 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
13e20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
13e30 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
13e40 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
13e50 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
13e60 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
13e70 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a  NALMODE_PERSIST.
13e80 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72        || (pPager
13e90 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
13ea0 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
13eb0 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
13ec0 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20  URNALMODE_WAL). 
13ed0 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d     ){.      rc =
13ee0 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28   zeroJournalHdr(
13ef0 70 50 61 67 65 72 2c 20 68 61 73 4d 61 73 74 65  pPager, hasMaste
13f00 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  r);.      pPager
13f10 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
13f20 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
13f30 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
13f40 68 20 6d 61 79 20 62 65 20 65 78 65 63 75 74 65  h may be execute
13f50 64 20 77 69 74 68 20 50 61 67 65 72 2e 6a 6f 75  d with Pager.jou
13f60 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59  rnalMode==MEMORY
13f70 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 61 20 68   if.      ** a h
13f80 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6a  ot-journal was j
13f90 75 73 74 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  ust rolled back.
13fa0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
13fb0 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  e journal.      
13fc0 2a 2a 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62  ** file should b
13fd0 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c  e closed and del
13fe0 65 74 65 64 2e 20 49 66 20 74 68 69 73 20 63 6f  eted. If this co
13ff0 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20  nnection writes 
14000 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  to.      ** the 
14010 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69  database file, i
14020 74 20 77 69 6c 6c 20 64 6f 20 73 6f 20 75 73 69  t will do so usi
14030 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  ng an in-memory 
14040 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 20 20  journal. .      
14050 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 62 44 65  */.      int bDe
14060 6c 65 74 65 20 3d 20 28 21 70 50 61 67 65 72 2d  lete = (!pPager-
14070 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 73 71 6c  >tempFile && sql
14080 69 74 65 33 4a 6f 75 72 6e 61 6c 45 78 69 73 74  ite3JournalExist
14090 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 29 3b  s(pPager->jfd));
140a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
140b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
140c0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
140d0 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 0a 20 20  LMODE_DELETE .  
140e0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67           || pPag
140f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
14100 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
14110 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20 20  DE_MEMORY .     
14120 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
14130 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
14140 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
14150 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20  WAL .      );.  
14160 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
14170 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
14180 0a 20 20 20 20 20 20 69 66 28 20 62 44 65 6c 65  .      if( bDele
14190 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  te ){.        rc
141a0 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65   = sqlite3OsDele
141b0 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c  te(pPager->pVfs,
141c0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
141d0 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  l, 0);.      }. 
141e0 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66     }.  }..#ifdef
141f0 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
14200 47 45 53 0a 20 20 73 71 6c 69 74 65 33 50 63 61  GES.  sqlite3Pca
14210 63 68 65 49 74 65 72 61 74 65 44 69 72 74 79 28  cheIterateDirty(
14220 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
14230 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68   pager_set_pageh
14240 61 73 68 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ash);.  if( pPag
14250 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 20 26 26  er->dbSize==0 &&
14260 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
14270 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
14280 50 43 61 63 68 65 29 3e 30 20 29 7b 0a 20 20 20  PCache)>0 ){.   
14290 20 50 67 48 64 72 20 2a 70 20 3d 20 73 71 6c 69   PgHdr *p = sqli
142a0 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70  te3PagerLookup(p
142b0 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 69  Pager, 1);.    i
142c0 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 70 2d  f( p ){.      p-
142d0 3e 70 61 67 65 48 61 73 68 20 3d 20 30 3b 0a 20  >pageHash = 0;. 
142e0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
142f0 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 29  rUnrefNotNull(p)
14300 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
14310 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74  if..  sqlite3Bit
14320 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
14330 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->pInJournal);.
14340 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
14350 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67  rnal = 0;.  pPag
14360 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
14370 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65  sqlite3PcacheCle
14380 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50  anAll(pPager->pP
14390 43 61 63 68 65 29 3b 0a 20 20 73 71 6c 69 74 65  Cache);.  sqlite
143a0 33 50 63 61 63 68 65 54 72 75 6e 63 61 74 65 28  3PcacheTruncate(
143b0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
143c0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29   pPager->dbSize)
143d0 3b 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73  ;..  if( pagerUs
143e0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
143f0 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20      /* Drop the 
14400 57 41 4c 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20  WAL write-lock, 
14410 69 66 20 61 6e 79 2e 20 41 6c 73 6f 2c 20 69 66  if any. Also, if
14420 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
14430 77 61 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20 6c  was in .    ** l
14440 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
14450 75 73 69 76 65 20 6d 6f 64 65 20 62 75 74 20 69  usive mode but i
14460 73 20 6e 6f 20 6c 6f 6e 67 65 72 2c 20 64 72 6f  s no longer, dro
14470 70 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20  p the EXCLUSIVE 
14480 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 68 65 6c  .    ** lock hel
14490 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
144a0 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
144b0 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
144c0 57 61 6c 45 6e 64 57 72 69 74 65 54 72 61 6e 73  WalEndWriteTrans
144d0 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70  action(pPager->p
144e0 57 61 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Wal);.    assert
144f0 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2==SQLITE_OK
14500 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   );.  }else if( 
14510 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
14520 20 62 43 6f 6d 6d 69 74 20 26 26 20 70 50 61 67   bCommit && pPag
14530 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 3e 70  er->dbFileSize>p
14540 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b  Pager->dbSize ){
14550 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61  .    /* This bra
14560 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65  nch is taken whe
14570 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  n committing a t
14580 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 72 6f  ransaction in ro
14590 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 0a 20  llback-journal. 
145a0 20 20 20 2a 2a 20 6d 6f 64 65 20 69 66 20 74 68     ** mode if th
145b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
145c0 6f 6e 20 64 69 73 6b 20 69 73 20 6c 61 72 67 65  on disk is large
145d0 72 20 74 68 61 6e 20 74 68 65 20 64 61 74 61 62  r than the datab
145e0 61 73 65 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a  ase image..    *
145f0 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
14600 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20  the journal has 
14610 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 61  been finalized a
14620 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  nd the transacti
14630 6f 6e 20 0a 20 20 20 20 2a 2a 20 73 75 63 63 65  on .    ** succe
14640 73 73 66 75 6c 6c 79 20 63 6f 6d 6d 69 74 74 65  ssfully committe
14650 64 2c 20 62 75 74 20 74 68 65 20 45 58 43 4c 55  d, but the EXCLU
14660 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 73 74 69  SIVE lock is sti
14670 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20  ll held on the. 
14680 20 20 20 2a 2a 20 66 69 6c 65 2e 20 53 6f 20 69     ** file. So i
14690 74 20 69 73 20 73 61 66 65 20 74 6f 20 74 72 75  t is safe to tru
146a0 6e 63 61 74 65 20 74 68 65 20 64 61 74 61 62 61  ncate the databa
146b0 73 65 20 66 69 6c 65 20 74 6f 20 69 74 73 20 6d  se file to its m
146c0 69 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 72 65  inimum.    ** re
146d0 71 75 69 72 65 64 20 73 69 7a 65 2e 20 20 2a 2f  quired size.  */
146e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
146f0 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c  ger->eLock==EXCL
14700 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  USIVE_LOCK );.  
14710 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75    rc = pager_tru
14720 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 70 50  ncate(pPager, pP
14730 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20  ager->dbSize);. 
14740 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
14750 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6f 6d 6d  LITE_OK && bComm
14760 69 74 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61  it && isOpen(pPa
14770 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
14780 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
14790 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72  leControl(pPager
147a0 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e  ->fd, SQLITE_FCN
147b0 54 4c 5f 43 4f 4d 4d 49 54 5f 50 48 41 53 45 54  TL_COMMIT_PHASET
147c0 57 4f 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  WO, 0);.    if( 
147d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  rc==SQLITE_NOTFO
147e0 55 4e 44 20 29 20 72 63 20 3d 20 53 51 4c 49 54  UND ) rc = SQLIT
147f0 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  E_OK;.  }..  if(
14800 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
14810 69 76 65 4d 6f 64 65 20 0a 20 20 20 26 26 20 28  iveMode .   && (
14820 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
14830 67 65 72 29 20 7c 7c 20 73 71 6c 69 74 65 33 57  ger) || sqlite3W
14840 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28  alExclusiveMode(
14850 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 30 29  pPager->pWal, 0)
14860 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 32 20 3d  ).  ){.    rc2 =
14870 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70   pagerUnlockDb(p
14880 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f  Pager, SHARED_LO
14890 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  CK);.    pPager-
148a0 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
148b0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67   = 0;.  }.  pPag
148c0 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
148d0 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 70 50 61  ER_READER;.  pPa
148e0 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
148f0 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 28 72   0;..  return (r
14900 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32  c==SQLITE_OK?rc2
14910 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  :rc);.}../*.** E
14920 78 65 63 75 74 65 20 61 20 72 6f 6c 6c 62 61 63  xecute a rollbac
14930 6b 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69  k if a transacti
14940 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 64  on is active and
14950 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20   unlock the .** 
14960 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a  database file. .
14970 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
14980 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 65  er has already e
14990 6e 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52  ntered the ERROR
149a0 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74 20 61   state, do not a
149b0 74 74 65 6d 70 74 20 0a 2a 2a 20 74 68 65 20 72  ttempt .** the r
149c0 6f 6c 6c 62 61 63 6b 20 61 74 20 74 68 69 73 20  ollback at this 
149d0 74 69 6d 65 2e 20 49 6e 73 74 65 61 64 2c 20 70  time. Instead, p
149e0 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73  ager_unlock() is
149f0 20 63 61 6c 6c 65 64 2e 20 54 68 65 0a 2a 2a 20   called. The.** 
14a00 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e  call to pager_un
14a10 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 64 69 73 63  lock() will disc
14a20 61 72 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72  ard all in-memor
14a30 79 20 70 61 67 65 73 2c 20 75 6e 6c 6f 63 6b 0a  y pages, unlock.
14a40 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
14a50 66 69 6c 65 20 61 6e 64 20 6d 6f 76 65 20 74 68  file and move th
14a60 65 20 70 61 67 65 72 20 62 61 63 6b 20 74 6f 20  e pager back to 
14a70 4f 50 45 4e 20 73 74 61 74 65 2e 20 49 66 20 74  OPEN state. If t
14a80 68 69 73 20 0a 2a 2a 20 6d 65 61 6e 73 20 74 68  his .** means th
14a90 61 74 20 74 68 65 72 65 20 69 73 20 61 20 68 6f  at there is a ho
14aa0 74 2d 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 69  t-journal left i
14ab0 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
14ac0 6d 2c 20 74 68 65 20 6e 65 78 74 20 0a 2a 2a 20  m, the next .** 
14ad0 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6f 62  connection to ob
14ae0 74 61 69 6e 20 61 20 73 68 61 72 65 64 20 6c 6f  tain a shared lo
14af0 63 6b 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20  ck on the pager 
14b00 28 77 68 69 63 68 20 6d 61 79 20 62 65 20 74 68  (which may be th
14b10 69 73 20 6f 6e 65 29 20 0a 2a 2a 20 77 69 6c 6c  is one) .** will
14b20 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a   roll it back..*
14b30 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
14b40 72 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64  r has not alread
14b50 79 20 65 6e 74 65 72 65 64 20 74 68 65 20 45 52  y entered the ER
14b60 52 4f 52 20 73 74 61 74 65 2c 20 62 75 74 20 61  ROR state, but a
14b70 6e 20 49 4f 20 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f  n IO or.** mallo
14b80 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  c error occurs d
14b90 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
14ba0 2c 20 74 68 65 6e 20 74 68 69 73 20 77 69 6c 6c  , then this will
14bb0 20 69 74 73 65 6c 66 20 63 61 75 73 65 20 0a 2a   itself cause .*
14bc0 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 65  * the pager to e
14bd0 6e 74 65 72 20 74 68 65 20 45 52 52 4f 52 20 73  nter the ERROR s
14be0 74 61 74 65 2e 20 57 68 69 63 68 20 77 69 6c 6c  tate. Which will
14bf0 20 62 65 20 63 6c 65 61 72 65 64 20 62 79 20 74   be cleared by t
14c00 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61  he.** call to pa
14c10 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 2c 20 61 73  ger_unlock(), as
14c20 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65   described above
14c30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
14c40 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52   pagerUnlockAndR
14c50 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70  ollback(Pager *p
14c60 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50  Pager){.  if( pP
14c70 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
14c80 47 45 52 5f 45 52 52 4f 52 20 26 26 20 70 50 61  GER_ERROR && pPa
14c90 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
14ca0 45 52 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20 61  ER_OPEN ){.    a
14cb0 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
14cc0 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
14cd0 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  ) );.    if( pPa
14ce0 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
14cf0 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
14d00 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
14d10 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
14d20 6f 63 28 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  oc();.      sqli
14d30 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
14d40 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
14d50 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
14d60 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 7d 65  Malloc();.    }e
14d70 6c 73 65 20 69 66 28 20 21 70 50 61 67 65 72 2d  lse if( !pPager-
14d80 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
14d90 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
14da0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
14db0 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a  PAGER_READER );.
14dc0 20 20 20 20 20 20 70 61 67 65 72 5f 65 6e 64 5f        pager_end_
14dd0 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
14de0 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  er, 0, 0);.    }
14df0 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c  .  }.  pager_unl
14e00 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a  ock(pPager);.}..
14e10 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  /*.** Parameter 
14e20 61 44 61 74 61 20 6d 75 73 74 20 70 6f 69 6e 74  aData must point
14e30 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20   to a buffer of 
14e40 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
14e50 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74   bytes.** of dat
14e60 61 2e 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72  a. Compute and r
14e70 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d  eturn a checksum
14e80 20 62 61 73 65 64 20 6f 6e 74 20 74 68 65 20 63   based ont the c
14e90 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a  ontents of the .
14ea0 2a 2a 20 70 61 67 65 20 6f 66 20 64 61 74 61 20  ** page of data 
14eb0 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  and the current 
14ec0 76 61 6c 75 65 20 6f 66 20 70 50 61 67 65 72 2d  value of pPager-
14ed0 3e 63 6b 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a  >cksumInit..**.*
14ee0 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20  * This is not a 
14ef0 72 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 49  real checksum. I
14f00 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74  t is really just
14f10 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
14f20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69  .** random initi
14f30 61 6c 20 76 61 6c 75 65 20 28 70 50 61 67 65 72  al value (pPager
14f40 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 20 61 6e 64  ->cksumInit) and
14f50 20 65 76 65 72 79 20 32 30 30 74 68 20 62 79 74   every 200th byt
14f60 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65  e.** of the page
14f70 20 64 61 74 61 2c 20 73 74 61 72 74 69 6e 67 20   data, starting 
14f80 77 69 74 68 20 62 79 74 65 20 6f 66 66 73 65 74  with byte offset
14f90 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69   (pPager->pageSi
14fa0 7a 65 25 32 30 30 29 2e 0a 2a 2a 20 45 61 63 68  ze%200)..** Each
14fb0 20 62 79 74 65 20 69 73 20 69 6e 74 65 72 70 72   byte is interpr
14fc0 65 74 65 64 20 61 73 20 61 6e 20 38 2d 62 69 74  eted as an 8-bit
14fd0 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65   unsigned intege
14fe0 72 2e 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e  r..**.** Changin
14ff0 67 20 74 68 65 20 66 6f 72 6d 75 6c 61 20 75 73  g the formula us
15000 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ed to compute th
15010 69 73 20 63 68 65 63 6b 73 75 6d 20 72 65 73 75  is checksum resu
15020 6c 74 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63  lts in an.** inc
15030 6f 6d 70 61 74 69 62 6c 65 20 6a 6f 75 72 6e 61  ompatible journa
15040 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a  l file format..*
15050 2a 0a 2a 2a 20 49 66 20 6a 6f 75 72 6e 61 6c 20  *.** If journal 
15060 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72  corruption occur
15070 73 20 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72  s due to a power
15080 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f   failure, the mo
15090 73 74 20 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73 63  st likely .** sc
150a0 65 6e 61 72 69 6f 20 69 73 20 74 68 61 74 20 6f  enario is that o
150b0 6e 65 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74  ne end or the ot
150c0 68 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72  her of the recor
150d0 64 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65  d will be change
150e0 64 2e 20 0a 2a 2a 20 49 74 20 69 73 20 6d 75 63  d. .** It is muc
150f0 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68  h less likely th
15100 61 74 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20  at the two ends 
15110 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72  of the journal r
15120 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a  ecord will be.**
15130 20 63 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65   correct and the
15140 20 6d 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75   middle be corru
15150 70 74 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20  pt.  Thus, this 
15160 22 63 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d  "checksum" schem
15170 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73  e,.** though fas
15180 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61  t and simple, ca
15190 74 63 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79  tches the mostly
151a0 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20   likely kind of 
151b0 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73  corruption..*/.s
151c0 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f  tatic u32 pager_
151d0 63 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61  cksum(Pager *pPa
151e0 67 65 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61  ger, const u8 *a
151f0 44 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73  Data){.  u32 cks
15200 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73  um = pPager->cks
15210 75 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20  umInit;         
15220 2f 2a 20 43 68 65 63 6b 73 75 6d 20 76 61 6c 75  /* Checksum valu
15230 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20  e to return */. 
15240 20 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d   int i = pPager-
15250 3e 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 20 20  >pageSize-200;  
15260 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
15270 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 77 68 69  counter */.  whi
15280 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63  le( i>0 ){.    c
15290 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d  ksum += aData[i]
152a0 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a  ;.    i -= 200;.
152b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73    }.  return cks
152c0 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70  um;.}../*.** Rep
152d0 6f 72 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  ort the current 
152e0 70 61 67 65 20 73 69 7a 65 20 61 6e 64 20 6e 75  page size and nu
152f0 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64  mber of reserved
15300 20 62 79 74 65 73 20 62 61 63 6b 0a 2a 2a 20 74   bytes back.** t
15310 6f 20 74 68 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a  o the codec..*/.
15320 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
15330 53 5f 43 4f 44 45 43 0a 73 74 61 74 69 63 20 76  S_CODEC.static v
15340 6f 69 64 20 70 61 67 65 72 52 65 70 6f 72 74 53  oid pagerReportS
15350 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
15360 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r){.  if( pPager
15370 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67  ->xCodecSizeChng
15380 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
15390 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 28 70  xCodecSizeChng(p
153a0 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 2c 20 70  Pager->pCodec, p
153b0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
153c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
153d0 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74              (int
153e0 29 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76  )pPager->nReserv
153f0 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a  e);.  }.}.#else.
15400 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 52 65  # define pagerRe
15410 70 6f 72 74 53 69 7a 65 28 58 29 20 20 20 20 20  portSize(X)     
15420 2f 2a 20 4e 6f 2d 6f 70 20 69 66 20 77 65 20 64  /* No-op if we d
15430 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 20  o not support a 
15440 63 6f 64 65 63 20 2a 2f 0a 23 65 6e 64 69 66 0a  codec */.#endif.
15450 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69  ./*.** Read a si
15460 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 65  ngle page from e
15470 69 74 68 65 72 20 74 68 65 20 6a 6f 75 72 6e 61  ither the journa
15480 6c 20 66 69 6c 65 20 28 69 66 20 69 73 4d 61 69  l file (if isMai
15490 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a 2a 2a 20  nJrnl==1) or.** 
154a0 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
154b0 72 6e 61 6c 20 28 69 66 20 69 73 4d 61 69 6e 4a  rnal (if isMainJ
154c0 72 6e 6c 3d 3d 30 29 20 61 6e 64 20 70 6c 61 79  rnl==0) and play
154d0 62 61 63 6b 20 74 68 61 74 20 70 61 67 65 2e 0a  back that page..
154e0 2a 2a 20 54 68 65 20 70 61 67 65 20 62 65 67 69  ** The page begi
154f0 6e 73 20 61 74 20 6f 66 66 73 65 74 20 2a 70 4f  ns at offset *pO
15500 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20 66  ffset into the f
15510 69 6c 65 2e 20 54 68 65 20 2a 70 4f 66 66 73 65  ile. The *pOffse
15520 74 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20 69 6e  t.** value is in
15530 63 72 65 61 73 65 64 20 74 6f 20 74 68 65 20 73  creased to the s
15540 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74  tart of the next
15550 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75   page in the jou
15560 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rnal..**.** The 
15570 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  main rollback jo
15580 75 72 6e 61 6c 20 75 73 65 73 20 63 68 65 63 6b  urnal uses check
15590 73 75 6d 73 20 2d 20 74 68 65 20 73 74 61 74 65  sums - the state
155a0 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 64 6f 65  ment journal doe
155b0 73 20 0a 2a 2a 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a  s .** not..**.**
155c0 20 49 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d   If the page num
155d0 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
155e0 72 65 63 6f 72 64 20 72 65 61 64 20 66 72 6f 6d  record read from
155f0 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e   the (sub-)journ
15600 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72  al file.** is gr
15610 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63  eater than the c
15620 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20  urrent value of 
15630 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68  Pager.dbSize, th
15640 65 6e 20 70 6c 61 79 62 61 63 6b 20 69 73 0a 2a  en playback is.*
15650 2a 20 73 6b 69 70 70 65 64 20 61 6e 64 20 53 51  * skipped and SQ
15660 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
15670 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44  ned..**.** If pD
15680 6f 6e 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  one is not NULL,
15690 20 74 68 65 6e 20 69 74 20 69 73 20 61 20 72 65   then it is a re
156a0 63 6f 72 64 20 6f 66 20 70 61 67 65 73 20 74 68  cord of pages th
156b0 61 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a  at have already.
156c0 2a 2a 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62  ** been played b
156d0 61 63 6b 2e 20 20 49 66 20 74 68 65 20 70 61 67  ack.  If the pag
156e0 65 20 61 74 20 2a 70 4f 66 66 73 65 74 20 68 61  e at *pOffset ha
156f0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70  s already been p
15700 6c 61 79 65 64 20 62 61 63 6b 0a 2a 2a 20 28 69  layed back.** (i
15710 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  f the correspond
15720 69 6e 67 20 70 44 6f 6e 65 20 62 69 74 20 69 73  ing pDone bit is
15730 20 73 65 74 29 20 74 68 65 6e 20 73 6b 69 70 20   set) then skip 
15740 74 68 65 20 70 6c 61 79 62 61 63 6b 2e 0a 2a 2a  the playback..**
15750 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 70   Make sure the p
15760 44 6f 6e 65 20 62 69 74 20 63 6f 72 72 65 73 70  Done bit corresp
15770 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 2a 70  onding to the *p
15780 4f 66 66 73 65 74 20 70 61 67 65 20 69 73 20 73  Offset page is s
15790 65 74 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 72  et.** prior to r
157a0 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
157b0 49 66 20 74 68 65 20 70 61 67 65 20 72 65 63 6f  If the page reco
157c0 72 64 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  rd is successful
157d0 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ly read from the
157e0 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66   (sub-)journal f
157f0 69 6c 65 0a 2a 2a 20 61 6e 64 20 70 6c 61 79 65  ile.** and playe
15800 64 20 62 61 63 6b 2c 20 74 68 65 6e 20 53 51 4c  d back, then SQL
15810 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
15820 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  ed. If an IO err
15830 6f 72 20 6f 63 63 75 72 73 0a 2a 2a 20 77 68 69  or occurs.** whi
15840 6c 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 72  le reading the r
15850 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 28  ecord from the (
15860 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c  sub-)journal fil
15870 65 20 6f 72 20 77 68 69 6c 65 20 77 72 69 74 69  e or while writi
15880 6e 67 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74  ng.** to the dat
15890 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e  abase file, then
158a0 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
158b0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
158c0 49 66 20 64 61 74 61 0a 2a 2a 20 69 73 20 73 75  If data.** is su
158d0 63 63 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20  ccessfully read 
158e0 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a  from the (sub-)j
158f0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 75 74 20  ournal file but 
15900 61 70 70 65 61 72 73 20 74 6f 20 62 65 0a 2a 2a  appears to be.**
15910 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49   corrupted, SQLI
15920 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72  TE_DONE is retur
15930 6e 65 64 2e 20 44 61 74 61 20 69 73 20 63 6f 6e  ned. Data is con
15940 73 69 64 65 72 65 64 20 63 6f 72 72 75 70 74 65  sidered corrupte
15950 64 20 69 6e 0a 2a 2a 20 74 77 6f 20 63 69 72 63  d in.** two circ
15960 75 6d 73 74 61 6e 63 65 73 3a 0a 2a 2a 20 0a 2a  umstances:.** .*
15970 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72 65 63  *   * If the rec
15980 6f 72 64 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  ord page-number 
15990 69 73 20 69 6c 6c 65 67 61 6c 20 28 30 20 6f 72  is illegal (0 or
159a0 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 29 2c   PAGER_MJ_PGNO),
159b0 20 6f 72 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68   or.**   * If th
159c0 65 20 72 65 63 6f 72 64 20 69 73 20 62 65 69 6e  e record is bein
159d0 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 66 72  g rolled back fr
159e0 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  om the main jour
159f0 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20  nal file.**     
15a00 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d  and the checksum
15a10 20 66 69 65 6c 64 20 64 6f 65 73 20 6e 6f 74 20   field does not 
15a20 6d 61 74 63 68 20 74 68 65 20 72 65 63 6f 72 64  match the record
15a30 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   content..**.** 
15a40 4e 65 69 74 68 65 72 20 6f 66 20 74 68 65 73 65  Neither of these
15a50 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 20 61   two scenarios a
15a60 72 65 20 70 6f 73 73 69 62 6c 65 20 64 75 72 69  re possible duri
15a70 6e 67 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72  ng a savepoint r
15a80 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  ollback..**.** I
15a90 66 20 74 68 69 73 20 69 73 20 61 20 73 61 76 65  f this is a save
15aa0 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2c 20  point rollback, 
15ab0 74 68 65 6e 20 6d 65 6d 6f 72 79 20 6d 61 79 20  then memory may 
15ac0 68 61 76 65 20 74 6f 20 62 65 20 64 79 6e 61 6d  have to be dynam
15ad0 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61  ically.** alloca
15ae0 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ted by this func
15af0 74 69 6f 6e 2e 20 49 66 20 74 68 69 73 20 69 73  tion. If this is
15b00 20 74 68 65 20 63 61 73 65 20 61 6e 64 20 61 6e   the case and an
15b10 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
15b20 73 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d  s,.** SQLITE_NOM
15b30 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  EM is returned..
15b40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
15b50 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
15b60 5f 70 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a  _page(.  Pager *
15b70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
15b80 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
15b90 67 65 72 20 62 65 69 6e 67 20 70 6c 61 79 65 64  ger being played
15ba0 20 62 61 63 6b 20 2a 2f 0a 20 20 69 36 34 20 2a   back */.  i64 *
15bb0 70 4f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20  pOffset,        
15bc0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
15bd0 65 74 20 6f 66 20 72 65 63 6f 72 64 20 74 6f 20  et of record to 
15be0 70 6c 61 79 62 61 63 6b 20 2a 2f 0a 20 20 42 69  playback */.  Bi
15bf0 74 76 65 63 20 2a 70 44 6f 6e 65 2c 20 20 20 20  tvec *pDone,    
15c00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
15c10 69 74 76 65 63 20 6f 66 20 70 61 67 65 73 20 61  itvec of pages a
15c20 6c 72 65 61 64 79 20 70 6c 61 79 65 64 20 62 61  lready played ba
15c30 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61  ck */.  int isMa
15c40 69 6e 4a 72 6e 6c 2c 20 20 20 20 20 20 20 20 20  inJrnl,         
15c50 20 20 20 20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61        /* 1 -> ma
15c60 69 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e  in journal. 0 ->
15c70 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f   sub-journal. */
15c80 0a 20 20 69 6e 74 20 69 73 53 61 76 65 70 6e 74  .  int isSavepnt
15c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ca0 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 73   /* True for a s
15cb0 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63  avepoint rollbac
15cc0 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  k */.){.  int rc
15cd0 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20  ;.  PgHdr *pPg; 
15ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15cf0 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67    /* An existing
15d00 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63   page in the cac
15d10 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  he */.  Pgno pgn
15d20 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
15d30 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
15d40 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61  e number of a pa
15d50 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f  ge in journal */
15d60 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20  .  u32 cksum;   
15d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d80 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65   /* Checksum use
15d90 64 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65  d for sanity che
15da0 63 6b 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20  cking */.  char 
15db0 2a 61 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  *aData;         
15dc0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
15dd0 6f 72 61 72 79 20 73 74 6f 72 61 67 65 20 66 6f  orary storage fo
15de0 72 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  r the page */.  
15df0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66  sqlite3_file *jf
15e00 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d;            /*
15e10 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   The file descri
15e20 70 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 75  ptor for the jou
15e30 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
15e40 6e 74 20 69 73 53 79 6e 63 65 64 3b 20 20 20 20  nt isSynced;    
15e50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15e60 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20  True if journal 
15e70 70 61 67 65 20 69 73 20 73 79 6e 63 65 64 20 2a  page is synced *
15e80 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 28 69 73  /..  assert( (is
15e90 4d 61 69 6e 4a 72 6e 6c 26 7e 31 29 3d 3d 30 20  MainJrnl&~1)==0 
15ea0 29 3b 20 20 20 20 20 20 2f 2a 20 69 73 4d 61 69  );      /* isMai
15eb0 6e 4a 72 6e 6c 20 69 73 20 30 20 6f 72 20 31 20  nJrnl is 0 or 1 
15ec0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 69 73  */.  assert( (is
15ed0 53 61 76 65 70 6e 74 26 7e 31 29 3d 3d 30 20 29  Savepnt&~1)==0 )
15ee0 3b 20 20 20 20 20 20 20 2f 2a 20 69 73 53 61 76  ;       /* isSav
15ef0 65 70 6e 74 20 69 73 20 30 20 6f 72 20 31 20 2a  epnt is 0 or 1 *
15f00 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4d 61  /.  assert( isMa
15f10 69 6e 4a 72 6e 6c 20 7c 7c 20 70 44 6f 6e 65 20  inJrnl || pDone 
15f20 29 3b 20 20 20 20 20 2f 2a 20 70 44 6f 6e 65 20  );     /* pDone 
15f30 61 6c 77 61 79 73 20 75 73 65 64 20 6f 6e 20 73  always used on s
15f40 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20  ub-journals */. 
15f50 20 61 73 73 65 72 74 28 20 69 73 53 61 76 65 70   assert( isSavep
15f60 6e 74 20 7c 7c 20 70 44 6f 6e 65 3d 3d 30 20 29  nt || pDone==0 )
15f70 3b 20 20 20 2f 2a 20 70 44 6f 6e 65 20 6e 65 76  ;   /* pDone nev
15f80 65 72 20 75 73 65 64 20 6f 6e 20 6e 6f 6e 2d 73  er used on non-s
15f90 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 61  avepoint */..  a
15fa0 44 61 74 61 20 3d 20 70 50 61 67 65 72 2d 3e 70  Data = pPager->p
15fb0 54 6d 70 53 70 61 63 65 3b 0a 20 20 61 73 73 65  TmpSpace;.  asse
15fc0 72 74 28 20 61 44 61 74 61 20 29 3b 20 20 20 20  rt( aData );    
15fd0 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f       /* Temp sto
15fe0 72 61 67 65 20 6d 75 73 74 20 68 61 76 65 20 61  rage must have a
15ff0 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
16000 63 61 74 65 64 20 2a 2f 0a 20 20 61 73 73 65 72  cated */.  asser
16010 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  t( pagerUseWal(p
16020 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20 28 21 69  Pager)==0 || (!i
16030 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 69 73 53  sMainJrnl && isS
16040 61 76 65 70 6e 74 29 20 29 3b 0a 0a 20 20 2f 2a  avepnt) );..  /*
16050 20 45 69 74 68 65 72 20 74 68 65 20 73 74 61 74   Either the stat
16060 65 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  e is greater tha
16070 6e 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  n PAGER_WRITER_C
16080 41 43 48 45 4d 4f 44 20 28 61 20 74 72 61 6e 73  ACHEMOD (a trans
16090 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 72 20  action .  ** or 
160a0 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61  savepoint rollba
160b0 63 6b 20 64 6f 6e 65 20 61 74 20 74 68 65 20 72  ck done at the r
160c0 65 71 75 65 73 74 20 6f 66 20 74 68 65 20 63 61  equest of the ca
160d0 6c 6c 65 72 29 20 6f 72 20 74 68 69 73 20 69 73  ller) or this is
160e0 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72  .  ** a hot-jour
160f0 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 66  nal rollback. If
16100 20 69 74 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75   it is a hot-jou
16110 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 74  rnal rollback, t
16120 68 65 20 70 61 67 65 72 0a 20 20 2a 2a 20 69 73  he pager.  ** is
16130 20 69 6e 20 73 74 61 74 65 20 4f 50 45 4e 20 61   in state OPEN a
16140 6e 64 20 68 6f 6c 64 73 20 61 6e 20 45 58 43 4c  nd holds an EXCL
16150 55 53 49 56 45 20 6c 6f 63 6b 2e 20 48 6f 74 2d  USIVE lock. Hot-
16160 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
16170 0a 20 20 2a 2a 20 6f 6e 6c 79 20 72 65 61 64 73  .  ** only reads
16180 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a   from the main j
16190 6f 75 72 6e 61 6c 2c 20 6e 6f 74 20 74 68 65 20  ournal, not the 
161a0 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a  sub-journal..  *
161b0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
161c0 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
161d0 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
161e0 44 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61  D.       || (pPa
161f0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
16200 45 52 5f 4f 50 45 4e 20 26 26 20 70 50 61 67 65  ER_OPEN && pPage
16210 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  r->eLock==EXCLUS
16220 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 20  IVE_LOCK).  );. 
16230 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
16240 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
16250 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 7c  RITER_CACHEMOD |
16260 7c 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 3b 0a  | isMainJrnl );.
16270 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70  .  /* Read the p
16280 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70  age number and p
16290 61 67 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68  age data from th
162a0 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62  e journal or sub
162b0 2d 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69  -journal.  ** fi
162c0 6c 65 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72  le. Return an er
162d0 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20  ror code to the 
162e0 63 61 6c 6c 65 72 20 69 66 20 61 6e 20 49 4f 20  caller if an IO 
162f0 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 20 20  error occurs..  
16300 2a 2f 0a 20 20 6a 66 64 20 3d 20 69 73 4d 61 69  */.  jfd = isMai
16310 6e 4a 72 6e 6c 20 3f 20 70 50 61 67 65 72 2d 3e  nJrnl ? pPager->
16320 6a 66 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 6a  jfd : pPager->sj
16330 66 64 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 33  fd;.  rc = read3
16340 32 62 69 74 73 28 6a 66 64 2c 20 2a 70 4f 66 66  2bits(jfd, *pOff
16350 73 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69  set, &pgno);.  i
16360 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
16370 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
16380 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
16390 61 64 28 6a 66 64 2c 20 28 75 38 2a 29 61 44 61  ad(jfd, (u8*)aDa
163a0 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
163b0 53 69 7a 65 2c 20 28 2a 70 4f 66 66 73 65 74 29  Size, (*pOffset)
163c0 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  +4);.  if( rc!=S
163d0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
163e0 6e 20 72 63 3b 0a 20 20 2a 70 4f 66 66 73 65 74  n rc;.  *pOffset
163f0 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65   += pPager->page
16400 53 69 7a 65 20 2b 20 34 20 2b 20 69 73 4d 61 69  Size + 4 + isMai
16410 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20 53  nJrnl*4;..  /* S
16420 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f  anity checking o
16430 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69  n the page.  Thi
16440 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74  s is more import
16450 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67 69  ant that I origi
16460 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67  nally.  ** thoug
16470 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20  ht.  If a power 
16480 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77  failure occurs w
16490 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
164a0 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
164b0 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64  n,.  ** it could
164c0 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64   cause invalid d
164d0 61 74 61 20 74 6f 20 62 65 20 77 72 69 74 74 65  ata to be writte
164e0 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
164f0 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a  al.  We need to.
16500 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73    ** detect this
16510 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77   invalid data (w
16520 69 74 68 20 68 69 67 68 20 70 72 6f 62 61 62 69  ith high probabi
16530 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65  lity) and ignore
16540 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   it..  */.  if( 
16550 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d  pgno==0 || pgno=
16560 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
16570 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73  Pager) ){.    as
16580 73 65 72 74 28 20 21 69 73 53 61 76 65 70 6e 74  sert( !isSavepnt
16590 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   );.    return S
165a0 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a  QLITE_DONE;.  }.
165b0 20 20 69 66 28 20 70 67 6e 6f 3e 28 50 67 6e 6f    if( pgno>(Pgno
165c0 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  )pPager->dbSize 
165d0 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  || sqlite3Bitvec
165e0 54 65 73 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f  Test(pDone, pgno
165f0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
16600 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
16610 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20   if( isMainJrnl 
16620 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  ){.    rc = read
16630 33 32 62 69 74 73 28 6a 66 64 2c 20 28 2a 70 4f  32bits(jfd, (*pO
16640 66 66 73 65 74 29 2d 34 2c 20 26 63 6b 73 75 6d  ffset)-4, &cksum
16650 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
16660 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69  return rc;.    i
16670 66 28 20 21 69 73 53 61 76 65 70 6e 74 20 26 26  f( !isSavepnt &&
16680 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61   pager_cksum(pPa
16690 67 65 72 2c 20 28 75 38 2a 29 61 44 61 74 61 29  ger, (u8*)aData)
166a0 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20  !=cksum ){.     
166b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
166c0 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ONE;.    }.  }..
166d0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67    /* If this pag
166e0 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
166f0 65 6e 20 70 6c 61 79 65 64 20 62 79 20 62 65 66  en played by bef
16700 6f 72 65 20 64 75 72 69 6e 67 20 74 68 65 20 63  ore during the c
16710 75 72 72 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c 6c  urrent.  ** roll
16720 62 61 63 6b 2c 20 74 68 65 6e 20 64 6f 6e 27 74  back, then don't
16730 20 62 6f 74 68 65 72 20 74 6f 20 70 6c 61 79 20   bother to play 
16740 69 74 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 20  it back again.. 
16750 20 2a 2f 0a 20 20 69 66 28 20 70 44 6f 6e 65 20   */.  if( pDone 
16760 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  && (rc = sqlite3
16770 42 69 74 76 65 63 53 65 74 28 70 44 6f 6e 65 2c  BitvecSet(pDone,
16780 20 70 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45 5f   pgno))!=SQLITE_
16790 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
167a0 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57   rc;.  }..  /* W
167b0 68 65 6e 20 70 6c 61 79 69 6e 67 20 62 61 63 6b  hen playing back
167c0 20 70 61 67 65 20 31 2c 20 72 65 73 74 6f 72 65   page 1, restore
167d0 20 74 68 65 20 6e 52 65 73 65 72 76 65 20 73 65   the nReserve se
167e0 74 74 69 6e 67 0a 20 20 2a 2f 0a 20 20 69 66 28  tting.  */.  if(
167f0 20 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 67   pgno==1 && pPag
16800 65 72 2d 3e 6e 52 65 73 65 72 76 65 21 3d 28 28  er->nReserve!=((
16810 75 38 2a 29 61 44 61 74 61 29 5b 32 30 5d 20 29  u8*)aData)[20] )
16820 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52  {.    pPager->nR
16830 65 73 65 72 76 65 20 3d 20 28 28 75 38 2a 29 61  eserve = ((u8*)a
16840 44 61 74 61 29 5b 32 30 5d 3b 0a 20 20 20 20 70  Data)[20];.    p
16850 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70  agerReportSize(p
16860 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Pager);.  }..  /
16870 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
16880 73 20 69 6e 20 43 41 43 48 45 4d 4f 44 20 73 74  s in CACHEMOD st
16890 61 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20  ate, then there 
168a0 6d 75 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f  must be a copy o
168b0 66 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65  f this.  ** page
168c0 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   in the pager ca
168d0 63 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  che. In this cas
168e0 65 20 6a 75 73 74 20 75 70 64 61 74 65 20 74 68  e just update th
168f0 65 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20  e pager cache,. 
16900 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61   ** not the data
16910 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70  base file. The p
16920 61 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b  age is left mark
16930 65 64 20 64 69 72 74 79 20 69 6e 20 74 68 69 73  ed dirty in this
16940 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   case..  **.  **
16950 20 41 6e 20 65 78 63 65 70 74 69 6f 6e 20 74 6f   An exception to
16960 20 74 68 65 20 61 62 6f 76 65 20 72 75 6c 65 3a   the above rule:
16970 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
16980 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d   is in no-sync m
16990 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70  ode.  ** and a p
169a0 61 67 65 20 69 73 20 6d 6f 76 65 64 20 64 75 72  age is moved dur
169b0 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74  ing an increment
169c0 61 6c 20 76 61 63 75 75 6d 20 74 68 65 6e 20 74  al vacuum then t
169d0 68 65 20 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a  he page may.  **
169e0 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20 70   not be in the p
169f0 61 67 65 72 20 63 61 63 68 65 2e 20 4c 61 74 65  ager cache. Late
16a00 72 3a 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29  r: if a malloc()
16a10 20 6f 72 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   or IO error occ
16a20 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20  urs.  ** during 
16a30 61 20 4d 6f 76 65 70 61 67 65 28 29 20 63 61 6c  a Movepage() cal
16a40 6c 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  l, then the page
16a50 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 20 74   may not be in t
16a60 68 65 20 63 61 63 68 65 0a 20 20 2a 2a 20 65 69  he cache.  ** ei
16a70 74 68 65 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e  ther. So the con
16a80 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64  dition described
16a90 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 70 61   in the above pa
16aa0 72 61 67 72 61 70 68 20 69 73 20 6e 6f 74 0a 20  ragraph is not. 
16ab0 20 2a 2a 20 61 73 73 65 72 74 28 29 61 62 6c 65   ** assert()able
16ac0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69  ..  **.  ** If i
16ad0 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 2c 20  n WRITER_DBMOD, 
16ae0 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
16af0 6f 72 20 4f 50 45 4e 20 73 74 61 74 65 2c 20 74  or OPEN state, t
16b00 68 65 6e 20 77 65 20 75 70 64 61 74 65 20 74 68  hen we update th
16b10 65 0a 20 20 2a 2a 20 70 61 67 65 72 20 63 61 63  e.  ** pager cac
16b20 68 65 20 69 66 20 69 74 20 65 78 69 73 74 73 20  he if it exists 
16b30 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c  and the main fil
16b40 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 74  e. The page is t
16b50 68 65 6e 20 6d 61 72 6b 65 64 20 0a 20 20 2a 2a  hen marked .  **
16b60 20 6e 6f 74 20 64 69 72 74 79 2e 20 53 69 6e 63   not dirty. Sinc
16b70 65 20 74 68 69 73 20 63 6f 64 65 20 69 73 20 6f  e this code is o
16b80 6e 6c 79 20 65 78 65 63 75 74 65 64 20 69 6e 20  nly executed in 
16b90 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65  PAGER_OPEN state
16ba0 20 66 6f 72 0a 20 20 2a 2a 20 61 20 68 6f 74 2d   for.  ** a hot-
16bb0 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
16bc0 2c 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65  , it is guarante
16bd0 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ed that the page
16be0 2d 63 61 63 68 65 20 69 73 20 65 6d 70 74 79 0a  -cache is empty.
16bf0 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65    ** if the page
16c00 72 20 69 73 20 69 6e 20 4f 50 45 4e 20 73 74 61  r is in OPEN sta
16c10 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69  te..  **.  ** Ti
16c20 63 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68 65  cket #1171:  The
16c30 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
16c40 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  al might contain
16c50 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68   page content th
16c60 61 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65  at is.  ** diffe
16c70 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61  rent from the pa
16c80 67 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68  ge content at th
16c90 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74  e start of the t
16ca0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a  ransaction..  **
16cb0 20 54 68 69 73 20 6f 63 63 75 72 73 20 77 68 65   This occurs whe
16cc0 6e 20 61 20 70 61 67 65 20 69 73 20 63 68 61 6e  n a page is chan
16cd0 67 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65  ged prior to the
16ce0 20 73 74 61 72 74 20 6f 66 20 61 20 73 74 61 74   start of a stat
16cf0 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20  ement.  ** then 
16d00 63 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69  changed again wi
16d10 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  thin the stateme
16d20 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e  nt.  When rollin
16d30 67 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20  g back such a.  
16d40 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20  ** statement we 
16d50 6d 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74  must not write t
16d60 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  o the original d
16d70 61 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77  atabase unless w
16d80 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20  e know.  ** for 
16d90 63 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69  certain that ori
16da0 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65  ginal page conte
16db0 6e 74 73 20 61 72 65 20 73 79 6e 63 65 64 20 69  nts are synced i
16dc0 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c  nto the main rol
16dd0 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e  lback.  ** journ
16de0 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20  al.  Otherwise, 
16df0 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67  a power loss mig
16e00 68 74 20 6c 65 61 76 65 20 6d 6f 64 69 66 69 65  ht leave modifie
16e10 64 20 64 61 74 61 20 69 6e 20 74 68 65 0a 20 20  d data in the.  
16e20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
16e30 20 77 69 74 68 6f 75 74 20 61 6e 20 65 6e 74 72   without an entr
16e40 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  y in the rollbac
16e50 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 63  k journal that c
16e60 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 20  an.  ** restore 
16e70 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
16e80 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72  its original for
16e90 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f  m.  Two conditio
16ea0 6e 73 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20  ns must be.  ** 
16eb0 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69 74 69  met before writi
16ec0 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
16ed0 73 65 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68  se files. (1) th
16ee0 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
16ef0 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20  be.  ** locked. 
16f00 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61   (2) we know tha
16f10 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  t the original p
16f20 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 66  age content is f
16f30 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a  ully synced.  **
16f40 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   in the main jou
16f50 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63 61  rnal either beca
16f60 75 73 65 20 74 68 65 20 70 61 67 65 20 69 73 20  use the page is 
16f70 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20  not in cache or 
16f80 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20 70 61  else.  ** the pa
16f90 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  ge is marked as 
16fa0 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a  needSync==0..  *
16fb0 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31  *.  ** 2008-04-1
16fc0 34 3a 20 20 57 68 65 6e 20 61 74 74 65 6d 70 74  4:  When attempt
16fd0 69 6e 67 20 74 6f 20 76 61 63 75 75 6d 20 61 20  ing to vacuum a 
16fe0 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
16ff0 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69   file, it.  ** i
17000 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 66 61  s possible to fa
17010 69 6c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f  il a statement o
17020 6e 20 61 20 64 61 74 61 62 61 73 65 20 74 68 61  n a database tha
17030 74 20 64 6f 65 73 20 6e 6f 74 20 79 65 74 20 65  t does not yet e
17040 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f  xist..  ** Do no
17050 74 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69  t attempt to wri
17060 74 65 20 69 66 20 64 61 74 61 62 61 73 65 20 66  te if database f
17070 69 6c 65 20 68 61 73 20 6e 65 76 65 72 20 62 65  ile has never be
17080 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a  en opened..  */.
17090 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
170a0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
170b0 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73   pPg = 0;.  }els
170c0 65 7b 0a 20 20 20 20 70 50 67 20 3d 20 73 71 6c  e{.    pPg = sql
170d0 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
170e0 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
170f0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 67   }.  assert( pPg
17100 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20   || !MEMDB );.  
17110 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
17120 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50  eState!=PAGER_OP
17130 45 4e 20 7c 7c 20 70 50 67 3d 3d 30 20 29 3b 0a  EN || pPg==0 );.
17140 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 50    PAGERTRACE(("P
17150 4c 41 59 42 41 43 4b 20 25 64 20 70 61 67 65 20  LAYBACK %d page 
17160 25 64 20 68 61 73 68 28 25 30 38 78 29 20 25 73  %d hash(%08x) %s
17170 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
17180 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
17190 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74   pgno, pager_dat
171a0 61 68 61 73 68 28 70 50 61 67 65 72 2d 3e 70 61  ahash(pPager->pa
171b0 67 65 53 69 7a 65 2c 20 28 75 38 2a 29 61 44 61  geSize, (u8*)aDa
171c0 74 61 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ta),.           
171d0 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69  (isMainJrnl?"mai
171e0 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22 73 75 62 2d  n-journal":"sub-
171f0 6a 6f 75 72 6e 61 6c 22 29 0a 20 20 29 29 3b 0a  journal").  ));.
17200 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c    if( isMainJrnl
17210 20 29 7b 0a 20 20 20 20 69 73 53 79 6e 63 65 64   ){.    isSynced
17220 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e   = pPager->noSyn
17230 63 20 7c 7c 20 28 2a 70 4f 66 66 73 65 74 20 3c  c || (*pOffset <
17240 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
17250 6c 48 64 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  lHdr);.  }else{.
17260 20 20 20 20 69 73 53 79 6e 63 65 64 20 3d 20 28      isSynced = (
17270 70 50 67 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70 50  pPg==0 || 0==(pP
17280 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52  g->flags & PGHDR
17290 5f 4e 45 45 44 5f 53 59 4e 43 29 29 3b 0a 20 20  _NEED_SYNC));.  
172a0 7d 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70  }.  if( isOpen(p
172b0 50 61 67 65 72 2d 3e 66 64 29 0a 20 20 20 26 26  Pager->fd).   &&
172c0 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65   (pPager->eState
172d0 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  >=PAGER_WRITER_D
172e0 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e  BMOD || pPager->
172f0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
17300 45 4e 29 0a 20 20 20 26 26 20 69 73 53 79 6e 63  EN).   && isSync
17310 65 64 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20  ed.  ){.    i64 
17320 6f 66 73 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a  ofst = (pgno-1)*
17330 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
17340 65 53 69 7a 65 3b 0a 20 20 20 20 74 65 73 74 63  eSize;.    testc
17350 61 73 65 28 20 21 69 73 53 61 76 65 70 6e 74 20  ase( !isSavepnt 
17360 26 26 20 70 50 67 21 3d 30 20 26 26 20 28 70 50  && pPg!=0 && (pP
17370 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
17380 45 45 44 5f 53 59 4e 43 29 21 3d 30 20 29 3b 0a  EED_SYNC)!=0 );.
17390 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67      assert( !pag
173a0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
173b0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
173c0 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
173d0 65 72 2d 3e 66 64 2c 20 28 75 38 20 2a 29 61 44  er->fd, (u8 *)aD
173e0 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
173f0 65 53 69 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20  eSize, ofst);.  
17400 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65    if( pgno>pPage
17410 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b  r->dbFileSize ){
17420 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
17430 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f  bFileSize = pgno
17440 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
17450 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20  pPager->pBackup 
17460 29 7b 0a 20 20 20 20 20 20 43 4f 44 45 43 31 28  ){.      CODEC1(
17470 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70  pPager, aData, p
17480 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54  gno, 3, rc=SQLIT
17490 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 20 20  E_NOMEM);.      
174a0 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64  sqlite3BackupUpd
174b0 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63  ate(pPager->pBac
174c0 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29  kup, pgno, (u8*)
174d0 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 43 4f  aData);.      CO
174e0 44 45 43 32 28 70 50 61 67 65 72 2c 20 61 44 61  DEC2(pPager, aDa
174f0 74 61 2c 20 70 67 6e 6f 2c 20 37 2c 20 72 63 3d  ta, pgno, 7, rc=
17500 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 61 44  SQLITE_NOMEM, aD
17510 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ata);.    }.  }e
17520 6c 73 65 20 69 66 28 20 21 69 73 4d 61 69 6e 4a  lse if( !isMainJ
17530 72 6e 6c 20 26 26 20 70 50 67 3d 3d 30 20 29 7b  rnl && pPg==0 ){
17540 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
17550 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 66  is a rollback of
17560 20 61 20 73 61 76 65 70 6f 69 6e 74 20 61 6e 64   a savepoint and
17570 20 64 61 74 61 20 77 61 73 20 6e 6f 74 20 77 72   data was not wr
17580 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 2a 2a 20  itten to.    ** 
17590 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64  the database and
175a0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
175b0 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20 74 68 65 72   in-memory, ther
175c0 65 20 69 73 20 61 20 70 6f 74 65 6e 74 69 61 6c  e is a potential
175d0 0a 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 2e  .    ** problem.
175e0 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 20 69   When the page i
175f0 73 20 6e 65 78 74 20 66 65 74 63 68 65 64 20 62  s next fetched b
17600 79 20 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79  y the b-tree lay
17610 65 72 2c 20 69 74 20 0a 20 20 20 20 2a 2a 20 77  er, it .    ** w
17620 69 6c 6c 20 62 65 20 72 65 61 64 20 66 72 6f 6d  ill be read from
17630 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
17640 6c 65 2c 20 77 68 69 63 68 20 6d 61 79 20 6f 72  le, which may or
17650 20 6d 61 79 20 6e 6f 74 20 62 65 20 0a 20 20 20   may not be .   
17660 20 2a 2a 20 63 75 72 72 65 6e 74 2e 20 0a 20 20   ** current. .  
17670 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 72    **.    ** Ther
17680 65 20 61 72 65 20 61 20 63 6f 75 70 6c 65 20 6f  e are a couple o
17690 66 20 64 69 66 66 65 72 65 6e 74 20 77 61 79 73  f different ways
176a0 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e   this can happen
176b0 2e 20 41 6c 6c 20 61 72 65 20 71 75 69 74 65 0a  . All are quite.
176c0 20 20 20 20 2a 2a 20 6f 62 73 63 75 72 65 2e 20      ** obscure. 
176d0 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20  When running in 
176e0 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65  synchronous mode
176f0 2c 20 74 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20  , this can only 
17700 68 61 70 70 65 6e 20 0a 20 20 20 20 2a 2a 20 69  happen .    ** i
17710 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6f 6e  f the page is on
17720 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61   the free-list a
17730 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
17740 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
17750 74 68 65 6e 0a 20 20 20 20 2a 2a 20 70 6f 70 75  then.    ** popu
17760 6c 61 74 65 64 2c 20 74 68 65 6e 20 6d 6f 76 65  lated, then move
17770 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 50  d using sqlite3P
17780 61 67 65 72 4d 6f 76 65 70 61 67 65 28 29 2e 0a  agerMovepage()..
17790 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
177a0 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f  e solution is to
177b0 20 61 64 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   add an in-memor
177c0 79 20 70 61 67 65 20 74 6f 20 74 68 65 20 63 61  y page to the ca
177d0 63 68 65 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20  che containing. 
177e0 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 20 6a     ** the data j
177f0 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20 74 68  ust read from th
17800 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 4d  e sub-journal. M
17810 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
17820 64 69 72 74 79 20 0a 20 20 20 20 2a 2a 20 61 6e  dirty .    ** an
17830 64 20 69 66 20 74 68 65 20 70 61 67 65 72 20 72  d if the pager r
17840 65 71 75 69 72 65 73 20 61 20 6a 6f 75 72 6e 61  equires a journa
17850 6c 2d 73 79 6e 63 2c 20 74 68 65 6e 20 6d 61 72  l-sync, then mar
17860 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 0a 20  k the page as . 
17870 20 20 20 2a 2a 20 72 65 71 75 69 72 69 6e 67 20     ** requiring 
17880 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 20 62  a journal-sync b
17890 65 66 6f 72 65 20 69 74 20 69 73 20 77 72 69 74  efore it is writ
178a0 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ten..    */.    
178b0 61 73 73 65 72 74 28 20 69 73 53 61 76 65 70 6e  assert( isSavepn
178c0 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t );.    assert(
178d0 20 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53   (pPager->doNotS
178e0 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47  pill & SPILLFLAG
178f0 5f 52 4f 4c 4c 42 41 43 4b 29 3d 3d 30 20 29 3b  _ROLLBACK)==0 );
17900 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
17910 6f 74 53 70 69 6c 6c 20 7c 3d 20 53 50 49 4c 4c  otSpill |= SPILL
17920 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20  FLAG_ROLLBACK;. 
17930 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
17940 61 67 65 72 41 63 71 75 69 72 65 28 70 50 61 67  agerAcquire(pPag
17950 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20  er, pgno, &pPg, 
17960 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1);.    assert( 
17970 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70  (pPager->doNotSp
17980 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f  ill & SPILLFLAG_
17990 52 4f 4c 4c 42 41 43 4b 29 21 3d 30 20 29 3b 0a  ROLLBACK)!=0 );.
179a0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
179b0 74 53 70 69 6c 6c 20 26 3d 20 7e 53 50 49 4c 4c  tSpill &= ~SPILL
179c0 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20  FLAG_ROLLBACK;. 
179d0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
179e0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
179f0 3b 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73  ;.    pPg->flags
17a00 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f   &= ~PGHDR_NEED_
17a10 52 45 41 44 3b 0a 20 20 20 20 73 71 6c 69 74 65  READ;.    sqlite
17a20 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79  3PcacheMakeDirty
17a30 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28  (pPg);.  }.  if(
17a40 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e   pPg ){.    /* N
17a50 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76  o page should ev
17a60 65 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79  er be explicitly
17a70 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61   rolled back tha
17a80 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63  t is in use, exc
17a90 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70  ept.    ** for p
17aa0 61 67 65 20 31 20 77 68 69 63 68 20 69 73 20 68  age 1 which is h
17ab0 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72  eld in use in or
17ac0 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20  der to keep the 
17ad0 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
17ae0 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63 74 69  ** database acti
17af0 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68  ve. However such
17b00 20 61 20 70 61 67 65 20 6d 61 79 20 62 65 20 72   a page may be r
17b10 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20  olled back as a 
17b20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66  result.    ** of
17b30 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72   an internal err
17b40 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20  or resulting in 
17b50 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c  an automatic cal
17b60 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69  l to.    ** sqli
17b70 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
17b80 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76  ()..    */.    v
17b90 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20  oid *pData;.    
17ba0 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61  pData = pPg->pDa
17bb0 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  ta;.    memcpy(p
17bc0 44 61 74 61 2c 20 28 75 38 2a 29 61 44 61 74 61  Data, (u8*)aData
17bd0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
17be0 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ze);.    pPager-
17bf0 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b  >xReiniter(pPg);
17c00 0a 20 20 20 20 69 66 28 20 69 73 4d 61 69 6e 4a  .    if( isMainJ
17c10 72 6e 6c 20 26 26 20 28 21 69 73 53 61 76 65 70  rnl && (!isSavep
17c20 6e 74 20 7c 7c 20 2a 70 4f 66 66 73 65 74 3c 3d  nt || *pOffset<=
17c30 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
17c40 64 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  dr) ){.      /* 
17c50 49 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  If the contents 
17c60 6f 66 20 74 68 69 73 20 70 61 67 65 20 77 65 72  of this page wer
17c70 65 20 6a 75 73 74 20 72 65 73 74 6f 72 65 64 20  e just restored 
17c80 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 0a 20  from the main . 
17c90 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
17ca0 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 73 20 63  file, then its c
17cb0 6f 6e 74 65 6e 74 20 6d 75 73 74 20 62 65 20 61  ontent must be a
17cc0 73 20 74 68 65 79 20 77 65 72 65 20 77 68 65 6e  s they were when
17cd0 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 74   the .      ** t
17ce0 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 66  ransaction was f
17cf0 69 72 73 74 20 6f 70 65 6e 65 64 2e 20 49 6e 20  irst opened. In 
17d00 74 68 69 73 20 63 61 73 65 20 77 65 20 63 61 6e  this case we can
17d10 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 0a 20   mark the page. 
17d20 20 20 20 20 20 2a 2a 20 61 73 20 63 6c 65 61 6e       ** as clean
17d30 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 69  , since there wi
17d40 6c 6c 20 62 65 20 6e 6f 20 6e 65 65 64 20 74 6f  ll be no need to
17d50 20 77 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f   write it out to
17d60 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61   the.      ** da
17d70 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2a  tabase..      **
17d80 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20  .      ** There 
17d90 69 73 20 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e  is one exception
17da0 20 74 6f 20 74 68 69 73 20 72 75 6c 65 2e 20 49   to this rule. I
17db0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65  f the page is be
17dc0 69 6e 67 20 72 6f 6c 6c 65 64 0a 20 20 20 20 20  ing rolled.     
17dd0 20 2a 2a 20 62 61 63 6b 20 61 73 20 70 61 72 74   ** back as part
17de0 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   of a savepoint 
17df0 28 6f 72 20 73 74 61 74 65 6d 65 6e 74 29 20 72  (or statement) r
17e00 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 61 6e 20  ollback from an 
17e10 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73 79 6e 63  .      ** unsync
17e20 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  ed portion of th
17e30 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
17e40 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ile, then it is 
17e50 6e 6f 74 20 73 61 66 65 0a 20 20 20 20 20 20 2a  not safe.      *
17e60 2a 20 74 6f 20 6d 61 72 6b 20 74 68 65 20 70 61  * to mark the pa
17e70 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 54 68 69  ge as clean. Thi
17e80 73 20 69 73 20 62 65 63 61 75 73 65 20 6d 61 72  s is because mar
17e90 6b 69 6e 67 20 74 68 65 20 70 61 67 65 20 61 73  king the page as
17ea0 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 6e 20  .      ** clean 
17eb0 77 69 6c 6c 20 63 6c 65 61 72 20 74 68 65 20 50  will clear the P
17ec0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
17ed0 6c 61 67 2e 20 53 69 6e 63 65 20 74 68 65 20 70  lag. Since the p
17ee0 61 67 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  age is.      ** 
17ef0 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a  already in the j
17f00 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 72 65 63  ournal file (rec
17f10 6f 72 64 65 64 20 69 6e 20 50 61 67 65 72 2e 70  orded in Pager.p
17f20 49 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e 64 0a 20  InJournal) and. 
17f30 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44       ** the PGHD
17f40 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
17f50 20 69 73 20 63 6c 65 61 72 65 64 2c 20 69 66 20   is cleared, if 
17f60 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74  the page is writ
17f70 74 65 6e 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ten to.      ** 
17f80 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 69  again within thi
17f90 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  s transaction, i
17fa0 74 20 77 69 6c 6c 20 62 65 20 6d 61 72 6b 65 64  t will be marked
17fb0 20 61 73 20 64 69 72 74 79 20 62 75 74 0a 20 20   as dirty but.  
17fc0 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52      ** the PGHDR
17fd0 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20  _NEED_SYNC flag 
17fe0 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65 74 2e  will not be set.
17ff0 20 49 74 20 63 6f 75 6c 64 20 74 68 65 6e 20 70   It could then p
18000 6f 74 65 6e 74 69 61 6c 6c 79 0a 20 20 20 20 20  otentially.     
18010 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20 6f   ** be written o
18020 75 74 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ut into the data
18030 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65  base file before
18040 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   its journal fil
18050 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d 65  e.      ** segme
18060 6e 74 20 69 73 20 73 79 6e 63 65 64 2e 20 49 66  nt is synced. If
18070 20 61 20 63 72 61 73 68 20 6f 63 63 75 72 73 20   a crash occurs 
18080 64 75 72 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77  during or follow
18090 69 6e 67 20 74 68 69 73 2c 0a 20 20 20 20 20 20  ing this,.      
180a0 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  ** database corr
180b0 75 70 74 69 6f 6e 20 6d 61 79 20 65 6e 73 75 65  uption may ensue
180c0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
180d0 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
180e0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
180f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63  .      sqlite3Pc
18100 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50  acheMakeClean(pP
18110 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61  g);.    }.    pa
18120 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
18130 28 70 50 67 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  (pPg);..    /* I
18140 66 20 74 68 69 73 20 77 61 73 20 70 61 67 65 20  f this was page 
18150 31 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65 20  1, then restore 
18160 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67  the value of Pag
18170 65 72 2e 64 62 46 69 6c 65 56 65 72 73 2e 0a 20  er.dbFileVers.. 
18180 20 20 20 2a 2a 20 44 6f 20 74 68 69 73 20 62 65     ** Do this be
18190 66 6f 72 65 20 61 6e 79 20 64 65 63 6f 64 69 6e  fore any decodin
181a0 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67  g. */.    if( pg
181b0 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 6d  no==1 ){.      m
181c0 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64  emcpy(&pPager->d
181d0 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75 38  bFileVers, &((u8
181e0 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c 73 69 7a  *)pData)[24],siz
181f0 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
18200 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a  leVers));.    }.
18210 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20 74  .    /* Decode t
18220 68 65 20 70 61 67 65 20 6a 75 73 74 20 72 65 61  he page just rea
18230 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20  d from disk */. 
18240 20 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72     CODEC1(pPager
18250 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
18260 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45  no, 3, rc=SQLITE
18270 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 73 71 6c  _NOMEM);.    sql
18280 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61 73  ite3PcacheReleas
18290 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65  e(pPg);.  }.  re
182a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
182b0 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61 73  * Parameter zMas
182c0 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ter is the name 
182d0 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
182e0 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e 67  nal file. A sing
182f0 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  le journal.** fi
18300 6c 65 20 74 68 61 74 20 72 65 66 65 72 72 65 64  le that referred
18310 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a   to the master j
18320 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20  ournal file has 
18330 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64  just been rolled
18340 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72   back..** This r
18350 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
18360 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
18370 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  to delete the ma
18380 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
18390 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73  e,.** and does s
183a0 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a  o if it is..**.*
183b0 2a 20 41 72 67 75 6d 65 6e 74 20 7a 4d 61 73 74  * Argument zMast
183c0 65 72 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20  er may point to 
183d0 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 2e  Pager.pTmpSpace.
183e0 20 53 6f 20 74 68 61 74 20 62 75 66 66 65 72 20   So that buffer 
183f0 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 76 61 69 6c  is not .** avail
18400 61 62 6c 65 20 66 6f 72 20 75 73 65 20 77 69 74  able for use wit
18410 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hin this functio
18420 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20  n..**.** When a 
18430 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
18440 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c 20  ile is created, 
18450 69 74 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  it is populated 
18460 77 69 74 68 20 74 68 65 20 6e 61 6d 65 73 20 0a  with the names .
18470 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 69 74 73  ** of all of its
18480 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c   child journals,
18490 20 6f 6e 65 20 61 66 74 65 72 20 61 6e 6f 74 68   one after anoth
184a0 65 72 2c 20 66 6f 72 6d 61 74 74 65 64 20 61 73  er, formatted as
184b0 20 75 74 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64   utf-8 .** encod
184c0 65 64 20 74 65 78 74 2e 20 54 68 65 20 65 6e 64  ed text. The end
184d0 20 6f 66 20 65 61 63 68 20 63 68 69 6c 64 20 6a   of each child j
184e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6d  ournal file is m
184f0 61 72 6b 65 64 20 77 69 74 68 20 61 20 0a 2a 2a  arked with a .**
18500 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20   nul-terminator 
18510 62 79 74 65 20 28 30 78 30 30 29 2e 20 69 2e 65  byte (0x00). i.e
18520 2e 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e  . the entire con
18530 74 65 6e 74 73 20 6f 66 20 61 20 6d 61 73 74 65  tents of a maste
18540 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  r journal.** fil
18550 65 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74  e for a transact
18560 69 6f 6e 20 69 6e 76 6f 6c 76 69 6e 67 20 74 77  ion involving tw
18570 6f 20 64 61 74 61 62 61 73 65 73 20 6d 69 67 68  o databases migh
18580 74 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f  t be:.**.**   "/
18590 68 6f 6d 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a  home/bill/a.db-j
185a0 6f 75 72 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f  ournal\x00/home/
185b0 62 69 6c 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61  bill/b.db-journa
185c0 6c 5c 78 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d  l\x00".**.** A m
185d0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
185e0 6c 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 64  le may only be d
185f0 65 6c 65 74 65 64 20 6f 6e 63 65 20 61 6c 6c 20  eleted once all 
18600 6f 66 20 69 74 73 20 63 68 69 6c 64 20 0a 2a 2a  of its child .**
18610 20 6a 6f 75 72 6e 61 6c 73 20 68 61 76 65 20 62   journals have b
18620 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  een rolled back.
18630 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
18640 74 69 6f 6e 20 72 65 61 64 73 20 74 68 65 20 63  tion reads the c
18650 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d  ontents of the m
18660 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69  aster-journal fi
18670 6c 65 20 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f  le into .** memo
18680 72 79 20 61 6e 64 20 6c 6f 6f 70 73 20 74 68 72  ry and loops thr
18690 6f 75 67 68 20 65 61 63 68 20 6f 66 20 74 68 65  ough each of the
186a0 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e   child journal n
186b0 61 6d 65 73 2e 20 46 6f 72 0a 2a 2a 20 65 61 63  ames. For.** eac
186c0 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c  h child journal,
186d0 20 69 74 20 63 68 65 63 6b 73 20 69 66 3a 0a 2a   it checks if:.*
186e0 2a 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20  *.**   * if the 
186f0 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 65 78  child journal ex
18700 69 73 74 73 2c 20 61 6e 64 20 69 66 20 73 6f 0a  ists, and if so.
18710 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63 68  **   * if the ch
18720 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74  ild journal cont
18730 61 69 6e 73 20 61 20 72 65 66 65 72 65 6e 63 65  ains a reference
18740 20 74 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   to master journ
18750 61 6c 20 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20  al .**     file 
18760 7a 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66  zMaster.**.** If
18770 20 61 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c   a child journal
18780 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 74 68   can be found th
18790 61 74 20 6d 61 74 63 68 65 73 20 62 6f 74 68 20  at matches both 
187a0 6f 66 20 74 68 65 20 63 72 69 74 65 72 69 61 0a  of the criteria.
187b0 2a 2a 20 61 62 6f 76 65 2c 20 74 68 69 73 20 66  ** above, this f
187c0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
187d0 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e  without doing an
187e0 79 74 68 69 6e 67 2e 20 4f 74 68 65 72 77 69 73  ything. Otherwis
187f0 65 2c 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68  e, if.** no such
18800 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63   child journal c
18810 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 66 69 6c  an be found, fil
18820 65 20 7a 4d 61 73 74 65 72 20 69 73 20 64 65 6c  e zMaster is del
18830 65 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65  eted from.** the
18840 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 75 73 69   file-system usi
18850 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65  ng sqlite3OsDele
18860 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  te()..**.** If a
18870 6e 20 49 4f 20 65 72 72 6f 72 20 77 69 74 68 69  n IO error withi
18880 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  n this function,
18890 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
188a0 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73  s returned. This
188b0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c  .** function all
188c0 6f 63 61 74 65 73 20 6d 65 6d 6f 72 79 20 62 79  ocates memory by
188d0 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   calling sqlite3
188e0 4d 61 6c 6c 6f 63 28 29 2e 20 49 66 20 61 6e 20  Malloc(). If an 
188f0 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66 61  allocation.** fa
18900 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ils, SQLITE_NOME
18910 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  M is returned. O
18920 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e 6f 20  therwise, if no 
18930 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72  IO or malloc err
18940 6f 72 73 20 0a 2a 2a 20 6f 63 63 75 72 2c 20 53  ors .** occur, S
18950 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
18960 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f  rned..**.** TODO
18970 3a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  : This function 
18980 61 6c 6c 6f 63 61 74 65 73 20 61 20 73 69 6e 67  allocates a sing
18990 6c 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f  le block of memo
189a0 72 79 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68  ry to load.** th
189b0 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  e entire content
189c0 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  s of the master 
189d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
189e0 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 61  is could be.** a
189f0 20 63 6f 75 70 6c 65 20 6f 66 20 6b 69 6c 6f 62   couple of kilob
18a00 79 74 65 73 20 6f 72 20 73 6f 20 2d 20 70 6f 74  ytes or so - pot
18a10 65 6e 74 69 61 6c 6c 79 20 6c 61 72 67 65 72 20  entially larger 
18a20 74 68 61 6e 20 74 68 65 20 70 61 67 65 20 0a 2a  than the page .*
18a30 2a 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  * size..*/.stati
18a40 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d  c int pager_delm
18a50 61 73 74 65 72 28 50 61 67 65 72 20 2a 70 50 61  aster(Pager *pPa
18a60 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ger, const char 
18a70 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73 71 6c  *zMaster){.  sql
18a80 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
18a90 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
18aa0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
18ab0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
18ac0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73  turn code */.  s
18ad0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61  qlite3_file *pMa
18ae0 73 74 65 72 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c  ster;    /* Mall
18af0 6f 63 27 64 20 6d 61 73 74 65 72 2d 6a 6f 75 72  oc'd master-jour
18b00 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
18b10 74 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  tor */.  sqlite3
18b20 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b  _file *pJournal;
18b30 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 63     /* Malloc'd c
18b40 68 69 6c 64 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  hild-journal fil
18b50 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
18b60 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a    char *zMasterJ
18b70 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43  ournal = 0; /* C
18b80 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73 74 65  ontents of maste
18b90 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  r journal file *
18ba0 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74 65 72 4a  /.  i64 nMasterJ
18bb0 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a  ournal;       /*
18bc0 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65 72 20   Size of master 
18bd0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
18be0 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
18bf0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ;           /* P
18c00 6f 69 6e 74 65 72 20 74 6f 20 6f 6e 65 20 6a 6f  ointer to one jo
18c10 75 72 6e 61 6c 20 77 69 74 68 69 6e 20 4d 4a 20  urnal within MJ 
18c20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
18c30 7a 4d 61 73 74 65 72 50 74 72 3b 20 20 20 20 20  zMasterPtr;     
18c40 20 20 20 20 2f 2a 20 53 70 61 63 65 20 74 6f 20      /* Space to 
18c50 68 6f 6c 64 20 4d 4a 20 66 69 6c 65 6e 61 6d 65  hold MJ filename
18c60 20 66 72 6f 6d 20 61 20 6a 6f 75 72 6e 61 6c 20   from a journal 
18c70 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  file */.  int nM
18c80 61 73 74 65 72 50 74 72 3b 20 20 20 20 20 20 20  asterPtr;       
18c90 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66      /* Amount of
18ca0 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
18cb0 20 74 6f 20 7a 4d 61 73 74 65 72 50 74 72 5b 5d   to zMasterPtr[]
18cc0 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   */..  /* Alloca
18cd0 74 65 20 73 70 61 63 65 20 66 6f 72 20 62 6f 74  te space for bot
18ce0 68 20 74 68 65 20 70 4a 6f 75 72 6e 61 6c 20 61  h the pJournal a
18cf0 6e 64 20 70 4d 61 73 74 65 72 20 66 69 6c 65 20  nd pMaster file 
18d00 64 65 73 63 72 69 70 74 6f 72 73 2e 0a 20 20 2a  descriptors..  *
18d10 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
18d20 20 6f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72   open the master
18d30 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
18d40 72 20 72 65 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a  r reading..  */.
18d50 20 20 70 4d 61 73 74 65 72 20 3d 20 28 73 71 6c    pMaster = (sql
18d60 69 74 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69  ite3_file *)sqli
18d70 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 56  te3MallocZero(pV
18d80 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32  fs->szOsFile * 2
18d90 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20  );.  pJournal = 
18da0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
18db0 28 28 28 75 38 20 2a 29 70 4d 61 73 74 65 72 29  (((u8 *)pMaster)
18dc0 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c   + pVfs->szOsFil
18dd0 65 29 3b 0a 20 20 69 66 28 20 21 70 4d 61 73 74  e);.  if( !pMast
18de0 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  er ){.    rc = S
18df0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
18e00 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20  else{.    const 
18e10 69 6e 74 20 66 6c 61 67 73 20 3d 20 0a 23 69 66  int flags = .#if
18e20 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44   SQLITE_ENABLE_D
18e30 41 54 41 5f 50 52 4f 54 45 43 54 49 4f 4e 0a 20  ATA_PROTECTION. 
18e40 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 76 66       (pPager->vf
18e50 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50  sFlags&SQLITE_OP
18e60 45 4e 5f 46 49 4c 45 50 52 4f 54 45 43 54 49 4f  EN_FILEPROTECTIO
18e70 4e 5f 4d 41 53 4b 29 7c 0a 23 65 6e 64 69 66 0a  N_MASK)|.#endif.
18e80 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50        (SQLITE_OP
18e90 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49  EN_READONLY|SQLI
18ea0 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
18eb0 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63 20  OURNAL);.    rc 
18ec0 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
18ed0 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 70  pVfs, zMaster, p
18ee0 4d 61 73 74 65 72 2c 20 66 6c 61 67 73 2c 20 30  Master, flags, 0
18ef0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  );.  }.  if( rc!
18f00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
18f10 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
18f20 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20  ..  /* Load the 
18f30 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f  entire master jo
18f40 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20  urnal file into 
18f50 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66  space obtained f
18f60 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  rom.  ** sqlite3
18f70 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f  _malloc() and po
18f80 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73  inted to by zMas
18f90 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 20 20 41 6c  terJournal.   Al
18fa0 73 6f 20 6f 62 74 61 69 6e 0a 20 20 2a 2a 20 73  so obtain.  ** s
18fb0 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20  ufficient space 
18fc0 28 69 6e 20 7a 4d 61 73 74 65 72 50 74 72 29 20  (in zMasterPtr) 
18fd0 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65  to hold the name
18fe0 73 20 6f 66 20 6d 61 73 74 65 72 0a 20 20 2a 2a  s of master.  **
18ff0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 65   journal files e
19000 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 72 65  xtracted from re
19010 67 75 6c 61 72 20 72 6f 6c 6c 62 61 63 6b 2d 6a  gular rollback-j
19020 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20  ournals..  */.  
19030 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
19040 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72 2c 20  leSize(pMaster, 
19050 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  &nMasterJournal)
19060 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
19070 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
19080 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6e 4d  master_out;.  nM
19090 61 73 74 65 72 50 74 72 20 3d 20 70 56 66 73 2d  asterPtr = pVfs-
190a0 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20  >mxPathname+1;. 
190b0 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20   zMasterJournal 
190c0 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
190d0 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 2b  nMasterJournal +
190e0 20 6e 4d 61 73 74 65 72 50 74 72 20 2b 20 31 29   nMasterPtr + 1)
190f0 3b 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72  ;.  if( !zMaster
19100 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 72  Journal ){.    r
19110 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
19120 3b 0a 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61  ;.    goto delma
19130 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  ster_out;.  }.  
19140 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 26 7a 4d  zMasterPtr = &zM
19150 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61  asterJournal[nMa
19160 73 74 65 72 4a 6f 75 72 6e 61 6c 2b 31 5d 3b 0a  sterJournal+1];.
19170 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
19180 52 65 61 64 28 70 4d 61 73 74 65 72 2c 20 7a 4d  Read(pMaster, zM
19190 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 28 69  asterJournal, (i
191a0 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  nt)nMasterJourna
191b0 6c 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  l, 0);.  if( rc!
191c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
191d0 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
191e0 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  .  zMasterJourna
191f0 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  l[nMasterJournal
19200 5d 20 3d 20 30 3b 0a 0a 20 20 7a 4a 6f 75 72 6e  ] = 0;..  zJourn
19210 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72  al = zMasterJour
19220 6e 61 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28 7a  nal;.  while( (z
19230 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a  Journal-zMasterJ
19240 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a  ournal)<nMasterJ
19250 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 69 6e  ournal ){.    in
19260 74 20 65 78 69 73 74 73 3b 0a 20 20 20 20 72 63  t exists;.    rc
19270 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
19280 73 73 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61  ss(pVfs, zJourna
19290 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  l, SQLITE_ACCESS
192a0 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73 74 73  _EXISTS, &exists
192b0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
192c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
192d0 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
192e0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
192f0 69 66 28 20 65 78 69 73 74 73 20 29 7b 0a 20 20  if( exists ){.  
19300 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
19310 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74  e journals point
19320 65 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73  ed to by the mas
19330 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  ter journal exis
19340 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20 4f 70 65  ts..      ** Ope
19350 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b 20 69  n it and check i
19360 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 74  f it points at t
19370 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
19380 6c 2e 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 73  l. If.      ** s
19390 6f 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75  o, return withou
193a0 74 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6d  t deleting the m
193b0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
193c0 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  le..      */.   
193d0 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20     int c;.      
193e0 69 6e 74 20 66 6c 61 67 73 20 3d 20 0a 23 69 66  int flags = .#if
193f0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44   SQLITE_ENABLE_D
19400 41 54 41 5f 50 52 4f 54 45 43 54 49 4f 4e 0a 20  ATA_PROTECTION. 
19410 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
19420 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f  vfsFlags&SQLITE_
19430 4f 50 45 4e 5f 46 49 4c 45 50 52 4f 54 45 43 54  OPEN_FILEPROTECT
19440 49 4f 4e 5f 4d 41 53 4b 29 7c 0a 23 65 6e 64 69  ION_MASK)|.#endi
19450 66 0a 20 20 20 20 20 20 20 20 28 53 51 4c 49 54  f.        (SQLIT
19460 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c  E_OPEN_READONLY|
19470 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
19480 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20  _JOURNAL);.     
19490 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
194a0 70 65 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e  pen(pVfs, zJourn
194b0 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c  al, pJournal, fl
194c0 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ags, 0);.      i
194d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
194e0 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
194f0 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
19500 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 72        }..      r
19510 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  c = readMasterJo
19520 75 72 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20  urnal(pJournal, 
19530 7a 4d 61 73 74 65 72 50 74 72 2c 20 6e 4d 61 73  zMasterPtr, nMas
19540 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20 73  terPtr);.      s
19550 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a  qlite3OsClose(pJ
19560 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69  ournal);.      i
19570 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
19580 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
19590 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
195a0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63        }..      c
195b0 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d   = zMasterPtr[0]
195c0 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d  !=0 && strcmp(zM
195d0 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65  asterPtr, zMaste
195e0 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 69 66 28  r)==0;.      if(
195f0 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a   c ){.        /*
19600 20 57 65 20 68 61 76 65 20 61 20 6d 61 74 63 68   We have a match
19610 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20  . Do not delete 
19620 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
19630 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  al file. */.    
19640 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
19650 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  er_out;.      }.
19660 20 20 20 20 7d 0a 20 20 20 20 7a 4a 6f 75 72 6e      }.    zJourn
19670 61 6c 20 2b 3d 20 28 73 71 6c 69 74 65 33 53 74  al += (sqlite3St
19680 72 6c 65 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c 29  rlen30(zJournal)
19690 2b 31 29 3b 0a 20 20 7d 0a 20 0a 20 20 73 71 6c  +1);.  }. .  sql
196a0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73  ite3OsClose(pMas
196b0 74 65 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ter);.  rc = sql
196c0 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
196d0 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
196e0 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a  .delmaster_out:.
196f0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
19700 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a  MasterJournal);.
19710 20 20 69 66 28 20 70 4d 61 73 74 65 72 20 29 7b    if( pMaster ){
19720 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
19730 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ose(pMaster);.  
19740 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65    assert( !isOpe
19750 6e 28 70 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a 20  n(pJournal) );. 
19760 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
19770 70 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20  pMaster);.  }.  
19780 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
19790 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
197a0 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63 68  on is used to ch
197b0 61 6e 67 65 20 74 68 65 20 61 63 74 75 61 6c 20  ange the actual 
197c0 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
197d0 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 69 6e  base .** file in
197e0 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
197f0 2e 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70  . This only happ
19800 65 6e 73 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74  ens when committ
19810 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ing a transactio
19820 6e 2c 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67  n,.** or rolling
19830 20 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74   back a transact
19840 69 6f 6e 20 28 69 6e 63 6c 75 64 69 6e 67 20 72  ion (including r
19850 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f  olling back a ho
19860 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a  t-journal)..**.*
19870 2a 20 49 66 20 74 68 65 20 6d 61 69 6e 20 64 61  * If the main da
19880 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e  tabase file is n
19890 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 74 68 65 20  ot open, or the 
198a0 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20  pager is not in 
198b0 65 69 74 68 65 72 0a 2a 2a 20 44 42 4d 4f 44 20  either.** DBMOD 
198c0 6f 72 20 4f 50 45 4e 20 73 74 61 74 65 2c 20 74  or OPEN state, t
198d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
198e0 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69  a no-op. Otherwi
198f0 73 65 2c 20 74 68 65 20 73 69 7a 65 20 0a 2a 2a  se, the size .**
19900 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   of the file is 
19910 63 68 61 6e 67 65 64 20 74 6f 20 6e 50 61 67 65  changed to nPage
19920 20 70 61 67 65 73 20 28 6e 50 61 67 65 2a 70 50   pages (nPage*pP
19930 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
19940 79 74 65 73 29 2e 20 0a 2a 2a 20 49 66 20 74 68  ytes). .** If th
19950 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69  e file on disk i
19960 73 20 63 75 72 72 65 6e 74 6c 79 20 6c 61 72 67  s currently larg
19970 65 72 20 74 68 61 6e 20 6e 50 61 67 65 20 70 61  er than nPage pa
19980 67 65 73 2c 20 74 68 65 6e 20 75 73 65 20 74 68  ges, then use th
19990 65 20 56 46 53 0a 2a 2a 20 78 54 72 75 6e 63 61  e VFS.** xTrunca
199a0 74 65 28 29 20 6d 65 74 68 6f 64 20 74 6f 20 74  te() method to t
199b0 72 75 6e 63 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a  runcate it..**.*
199c0 2a 20 4f 72 2c 20 69 74 20 6d 69 67 68 74 20 62  * Or, it might b
199d0 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20  e the case that 
199e0 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
199f0 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
19a00 20 0a 2a 2a 20 6e 50 61 67 65 20 70 61 67 65 73   .** nPage pages
19a10 2e 20 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67  . Some operating
19a20 20 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e   system implemen
19a30 74 61 74 69 6f 6e 73 20 63 61 6e 20 67 65 74 20  tations can get 
19a40 63 6f 6e 66 75 73 65 64 20 69 66 20 0a 2a 2a 20  confused if .** 
19a50 79 6f 75 20 74 72 79 20 74 6f 20 74 72 75 6e 63  you try to trunc
19a60 61 74 65 20 61 20 66 69 6c 65 20 74 6f 20 73 6f  ate a file to so
19a70 6d 65 20 73 69 7a 65 20 74 68 61 74 20 69 73 20  me size that is 
19a80 6c 61 72 67 65 72 20 74 68 61 6e 20 69 74 20 0a  larger than it .
19a90 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 69 73 2c  ** currently is,
19aa0 20 73 6f 20 64 65 74 65 63 74 20 74 68 69 73 20   so detect this 
19ab0 63 61 73 65 20 61 6e 64 20 77 72 69 74 65 20 61  case and write a
19ac0 20 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74   single zero byt
19ad0 65 20 74 6f 20 0a 2a 2a 20 74 68 65 20 65 6e 64  e to .** the end
19ae0 20 6f 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65   of the new file
19af0 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20   instead..**.** 
19b00 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72  If successful, r
19b10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
19b20 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
19b30 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6d 6f 64  occurs while mod
19b40 69 66 79 69 6e 67 0a 2a 2a 20 74 68 65 20 64 61  ifying.** the da
19b50 74 61 62 61 73 65 20 66 69 6c 65 2c 20 72 65 74  tabase file, ret
19b60 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f  urn the error co
19b70 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  de to the caller
19b80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
19b90 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50  pager_truncate(P
19ba0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
19bb0 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74  no nPage){.  int
19bc0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
19bd0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
19be0 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
19bf0 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65  _ERROR );.  asse
19c00 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
19c10 74 65 21 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te!=PAGER_READER
19c20 20 29 3b 0a 20 20 0a 20 20 69 66 28 20 69 73 4f   );.  .  if( isO
19c30 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
19c40 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e  .   && (pPager->
19c50 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
19c60 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50  ITER_DBMOD || pP
19c70 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
19c80 47 45 52 5f 4f 50 45 4e 29 20 0a 20 20 29 7b 0a  GER_OPEN) .  ){.
19c90 20 20 20 20 69 36 34 20 63 75 72 72 65 6e 74 53      i64 currentS
19ca0 69 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20  ize, newSize;.  
19cb0 20 20 69 6e 74 20 73 7a 50 61 67 65 20 3d 20 70    int szPage = p
19cc0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
19cd0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
19ce0 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c  ger->eLock==EXCL
19cf0 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  USIVE_LOCK );.  
19d00 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 69 74    /* TODO: Is it
19d10 20 73 61 66 65 20 74 6f 20 75 73 65 20 50 61 67   safe to use Pag
19d20 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 68 65  er.dbFileSize he
19d30 72 65 3f 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  re? */.    rc = 
19d40 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
19d50 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 63  e(pPager->fd, &c
19d60 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20  urrentSize);.   
19d70 20 6e 65 77 53 69 7a 65 20 3d 20 73 7a 50 61 67   newSize = szPag
19d80 65 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a 20 20  e*(i64)nPage;.  
19d90 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
19da0 5f 4f 4b 20 26 26 20 63 75 72 72 65 6e 74 53 69  _OK && currentSi
19db0 7a 65 21 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20  ze!=newSize ){. 
19dc0 20 20 20 20 20 69 66 28 20 63 75 72 72 65 6e 74       if( current
19dd0 53 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a  Size>newSize ){.
19de0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
19df0 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
19e00 50 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69  Pager->fd, newSi
19e10 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ze);.      }else
19e20 20 69 66 28 20 28 63 75 72 72 65 6e 74 53 69 7a   if( (currentSiz
19e30 65 2b 73 7a 50 61 67 65 29 3c 3d 6e 65 77 53 69  e+szPage)<=newSi
19e40 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  ze ){.        ch
19e50 61 72 20 2a 70 54 6d 70 20 3d 20 70 50 61 67 65  ar *pTmp = pPage
19e60 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20  r->pTmpSpace;.  
19e70 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 54 6d        memset(pTm
19e80 70 2c 20 30 2c 20 73 7a 50 61 67 65 29 3b 0a 20  p, 0, szPage);. 
19e90 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
19ea0 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65   (newSize-szPage
19eb0 29 20 3d 3d 20 63 75 72 72 65 6e 74 53 69 7a 65  ) == currentSize
19ec0 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
19ed0 63 61 73 65 28 20 28 6e 65 77 53 69 7a 65 2d 73  case( (newSize-s
19ee0 7a 50 61 67 65 29 20 3e 20 20 63 75 72 72 65 6e  zPage) >  curren
19ef0 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20  tSize );.       
19f00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
19f10 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
19f20 20 70 54 6d 70 2c 20 73 7a 50 61 67 65 2c 20 6e   pTmp, szPage, n
19f30 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 3b 0a  ewSize-szPage);.
19f40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
19f50 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
19f60 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
19f70 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20  r->dbFileSize = 
19f80 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20  nPage;.      }. 
19f90 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
19fa0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
19fb0 65 74 75 72 6e 20 61 20 73 61 6e 69 74 69 7a 65  eturn a sanitize
19fc0 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65  d version of the
19fd0 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 6f 66 20   sector-size of 
19fe0 4f 53 20 66 69 6c 65 20 70 46 69 6c 65 2e 20 54  OS file pFile. T
19ff0 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c  he.** return val
1a000 75 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  ue is guaranteed
1a010 20 74 6f 20 6c 69 65 20 62 65 74 77 65 65 6e 20   to lie between 
1a020 33 32 20 61 6e 64 20 4d 41 58 5f 53 45 43 54 4f  32 and MAX_SECTO
1a030 52 5f 53 49 5a 45 2e 0a 2a 2f 0a 69 6e 74 20 73  R_SIZE..*/.int s
1a040 71 6c 69 74 65 33 53 65 63 74 6f 72 53 69 7a 65  qlite3SectorSize
1a050 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
1a060 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 69 52 65  File){.  int iRe
1a070 74 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63  t = sqlite3OsSec
1a080 74 6f 72 53 69 7a 65 28 70 46 69 6c 65 29 3b 0a  torSize(pFile);.
1a090 20 20 69 66 28 20 69 52 65 74 3c 33 32 20 29 7b    if( iRet<32 ){
1a0a0 0a 20 20 20 20 69 52 65 74 20 3d 20 35 31 32 3b  .    iRet = 512;
1a0b0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 52 65  .  }else if( iRe
1a0c0 74 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  t>MAX_SECTOR_SIZ
1a0d0 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  E ){.    assert(
1a0e0 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
1a0f0 3e 3d 35 31 32 20 29 3b 0a 20 20 20 20 69 52 65  >=512 );.    iRe
1a100 74 20 3d 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  t = MAX_SECTOR_S
1a110 49 5a 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  IZE;.  }.  retur
1a120 6e 20 69 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n iRet;.}../*.**
1a130 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f   Set the value o
1a140 66 20 74 68 65 20 50 61 67 65 72 2e 73 65 63 74  f the Pager.sect
1a150 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  orSize variable 
1a160 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  for the given.**
1a170 20 70 61 67 65 72 20 62 61 73 65 64 20 6f 6e 20   pager based on 
1a180 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
1a190 65 64 20 62 79 20 74 68 65 20 78 53 65 63 74 6f  ed by the xSecto
1a1a0 72 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a 20  rSize method.** 
1a1b0 6f 66 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  of the open data
1a1c0 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 73  base file. The s
1a1d0 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20  ector size will 
1a1e0 62 65 20 75 73 65 64 20 0a 2a 2a 20 74 6f 20 64  be used .** to d
1a1f0 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73 69 7a  etermine the siz
1a200 65 20 61 6e 64 20 61 6c 69 67 6e 6d 65 6e 74 20  e and alignment 
1a210 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  of journal heade
1a220 72 20 61 6e 64 20 0a 2a 2a 20 6d 61 73 74 65 72  r and .** master
1a230 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
1a240 73 20 77 69 74 68 69 6e 20 63 72 65 61 74 65 64  s within created
1a250 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a   journal files..
1a260 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72  **.** For tempor
1a270 61 72 79 20 66 69 6c 65 73 20 74 68 65 20 65 66  ary files the ef
1a280 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73  fective sector s
1a290 69 7a 65 20 69 73 20 61 6c 77 61 79 73 20 35 31  ize is always 51
1a2a0 32 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f  2 bytes..**.** O
1a2b0 74 68 65 72 77 69 73 65 2c 20 66 6f 72 20 6e 6f  therwise, for no
1a2c0 6e 2d 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  n-temporary file
1a2d0 73 2c 20 74 68 65 20 65 66 66 65 63 74 69 76 65  s, the effective
1a2e0 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 0a   sector size is.
1a2f0 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  ** the value ret
1a300 75 72 6e 65 64 20 62 79 20 74 68 65 20 78 53 65  urned by the xSe
1a310 63 74 6f 72 53 69 7a 65 28 29 20 6d 65 74 68 6f  ctorSize() metho
1a320 64 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20  d rounded up to 
1a330 33 32 20 69 66 0a 2a 2a 20 69 74 20 69 73 20 6c  32 if.** it is l
1a340 65 73 73 20 74 68 61 6e 20 33 32 2c 20 6f 72 20  ess than 32, or 
1a350 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20 74 6f 20  rounded down to 
1a360 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20  MAX_SECTOR_SIZE 
1a370 69 66 20 69 74 0a 2a 2a 20 69 73 20 67 72 65 61  if it.** is grea
1a380 74 65 72 20 74 68 61 6e 20 4d 41 58 5f 53 45 43  ter than MAX_SEC
1a390 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2a 0a 2a 2a 20  TOR_SIZE..**.** 
1a3a0 49 66 20 74 68 65 20 66 69 6c 65 20 68 61 73 20  If the file has 
1a3b0 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  the SQLITE_IOCAP
1a3c0 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57  _POWERSAFE_OVERW
1a3d0 52 49 54 45 20 70 72 6f 70 65 72 74 79 2c 20 74  RITE property, t
1a3e0 68 65 6e 20 73 65 74 0a 2a 2a 20 74 68 65 20 65  hen set.** the e
1a3f0 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20  ffective sector 
1a400 73 69 7a 65 20 74 6f 20 69 74 73 20 6d 69 6e 69  size to its mini
1a410 6d 75 6d 20 76 61 6c 75 65 20 28 35 31 32 29 2e  mum value (512).
1a420 20 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66    The purpose of
1a430 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 73 65 63 74  .** pPager->sect
1a440 6f 72 53 69 7a 65 20 69 73 20 74 6f 20 64 65 66  orSize is to def
1a450 69 6e 65 20 74 68 65 20 22 62 6c 61 73 74 20 72  ine the "blast r
1a460 61 64 69 75 73 22 20 6f 66 20 62 79 74 65 73 20  adius" of bytes 
1a470 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68  that.** might ch
1a480 61 6e 67 65 20 69 66 20 61 20 63 72 61 73 68 20  ange if a crash 
1a490 6f 63 63 75 72 73 20 77 68 69 6c 65 20 77 72 69  occurs while wri
1a4a0 74 69 6e 67 20 74 6f 20 61 20 73 69 6e 67 6c 65  ting to a single
1a4b0 20 62 79 74 65 20 69 6e 0a 2a 2a 20 74 68 61 74   byte in.** that
1a4c0 20 72 61 6e 67 65 2e 20 20 42 75 74 20 77 69 74   range.  But wit
1a4d0 68 20 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  h POWERSAFE_OVER
1a4e0 57 52 49 54 45 2c 20 74 68 65 20 62 6c 61 73 74  WRITE, the blast
1a4f0 20 72 61 64 69 75 73 20 69 73 20 7a 65 72 6f 0a   radius is zero.
1a500 2a 2a 20 28 74 68 61 74 20 69 73 20 77 68 61 74  ** (that is what
1a510 20 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57   POWERSAFE_OVERW
1a520 52 49 54 45 20 6d 65 61 6e 73 29 2c 20 73 6f 20  RITE means), so 
1a530 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20  we minimize the 
1a540 73 65 63 74 6f 72 0a 2a 2a 20 73 69 7a 65 2e 20  sector.** size. 
1a550 20 46 6f 72 20 62 61 63 6b 77 61 72 64 73 20 63   For backwards c
1a560 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 6f 66 20  ompatibility of 
1a570 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
1a580 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74  rnal file format
1a590 2c 0a 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20 72  ,.** we cannot r
1a5a0 65 64 75 63 65 20 74 68 65 20 65 66 66 65 63 74  educe the effect
1a5b0 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  ive sector size 
1a5c0 62 65 6c 6f 77 20 35 31 32 2e 0a 2a 2f 0a 73 74  below 512..*/.st
1a5d0 61 74 69 63 20 76 6f 69 64 20 73 65 74 53 65 63  atic void setSec
1a5e0 74 6f 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70  torSize(Pager *p
1a5f0 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74  Pager){.  assert
1a600 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
1a610 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  >fd) || pPager->
1a620 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 69  tempFile );..  i
1a630 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  f( pPager->tempF
1a640 69 6c 65 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74  ile.   || (sqlit
1a650 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
1a660 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
1a670 2d 3e 66 64 29 20 26 20 0a 20 20 20 20 20 20 20  ->fd) & .       
1a680 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
1a690 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  CAP_POWERSAFE_OV
1a6a0 45 52 57 52 49 54 45 29 21 3d 30 0a 20 20 29 7b  ERWRITE)!=0.  ){
1a6b0 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73  .    /* Sector s
1a6c0 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d 61 74 74  ize doesn't matt
1a6d0 65 72 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79  er for temporary
1a6e0 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68   files. Also, th
1a6f0 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61  e file.    ** ma
1a700 79 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20  y not have been 
1a710 6f 70 65 6e 65 64 20 79 65 74 2c 20 69 6e 20 77  opened yet, in w
1a720 68 69 63 68 20 63 61 73 65 20 74 68 65 20 4f 73  hich case the Os
1a730 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20  SectorSize().   
1a740 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65   ** call will se
1a750 67 66 61 75 6c 74 2e 20 2a 2f 0a 20 20 20 20 70  gfault. */.    p
1a760 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
1a770 65 20 3d 20 35 31 32 3b 0a 20 20 7d 65 6c 73 65  e = 512;.  }else
1a780 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  {.    pPager->se
1a790 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74  ctorSize = sqlit
1a7a0 65 33 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  e3SectorSize(pPa
1a7b0 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a 7d 0a  ger->fd);.  }.}.
1a7c0 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20  ./*.** Playback 
1a7d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  the journal and 
1a7e0 74 68 75 73 20 72 65 73 74 6f 72 65 20 74 68 65  thus restore the
1a7f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
1a800 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69  o.** the state i
1a810 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20  t was in before 
1a820 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e  we started makin
1a830 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a  g changes.  .**.
1a840 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
1a850 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73  ile format is as
1a860 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a   follows: .**.**
1a870 20 20 28 31 29 20 20 38 20 62 79 74 65 20 70 72    (1)  8 byte pr
1a880 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66  efix.  A copy of
1a890 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
1a8a0 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74  ..**  (2)  4 byt
1a8b0 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
1a8c0 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
1a8d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69  e number of vali
1a8e0 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a  d page records.*
1a8f0 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a  *       in the j
1a900 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73  ournal.  If this
1a910 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66   value is 0xffff
1a920 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75  ffff, then compu
1a930 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  te the.**       
1a940 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72  number of page r
1a950 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20  ecords from the 
1a960 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a  journal size..**
1a970 20 20 28 33 29 20 20 34 20 62 79 74 65 20 62 69    (3)  4 byte bi
1a980 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
1a990 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e   which is the in
1a9a0 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20  itial value for 
1a9b0 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61  the .**       sa
1a9c0 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a  nity checksum..*
1a9d0 2a 20 20 28 34 29 20 20 34 20 62 79 74 65 20 69  *  (4)  4 byte i
1a9e0 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
1a9f0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
1aa00 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20  ges to truncate 
1aa10 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74  the.**       dat
1aa20 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20  abase to during 
1aa30 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20  a rollback..**  
1aa40 28 35 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (5)  4 byte big-
1aa50 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
1aa60 68 69 63 68 20 69 73 20 74 68 65 20 73 65 63 74  hich is the sect
1aa70 6f 72 20 73 69 7a 65 2e 20 20 54 68 65 20 68 65  or size.  The he
1aa80 61 64 65 72 0a 2a 2a 20 20 20 20 20 20 20 69 73  ader.**       is
1aa90 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73   this many bytes
1aaa0 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 36   in size..**  (6
1aab0 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
1aac0 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
1aad0 63 68 20 69 73 20 74 68 65 20 70 61 67 65 20 73  ch is the page s
1aae0 69 7a 65 2e 0a 2a 2a 20 20 28 37 29 20 20 7a 65  ize..**  (7)  ze
1aaf0 72 6f 20 70 61 64 64 69 6e 67 20 6f 75 74 20 74  ro padding out t
1ab00 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  o the next secto
1ab10 72 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 38 29 20  r size..**  (8) 
1ab20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61   Zero or more pa
1ab30 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65  ges instances, e
1ab40 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ach as follows:.
1ab50 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62  **        +  4 b
1ab60 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  yte page number.
1ab70 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50  .**        +  pP
1ab80 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
1ab90 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a  ytes of data..**
1aba0 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74          +  4 byt
1abb0 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a  e checksum.**.**
1abc0 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f   When we speak o
1abd0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
1abe0 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68  ader, we mean th
1abf0 65 20 66 69 72 73 74 20 37 20 69 74 65 6d 73 20  e first 7 items 
1ac00 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65  above..** Each e
1ac10 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72  ntry in the jour
1ac20 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e  nal is an instan
1ac30 63 65 20 6f 66 20 74 68 65 20 38 74 68 20 69 74  ce of the 8th it
1ac40 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74  em..**.** Call t
1ac50 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68  he value from th
1ac60 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20  e second bullet 
1ac70 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73  "nRec".  nRec is
1ac80 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
1ac90 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74  * valid page ent
1aca0 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72  ries in the jour
1acb0 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61  nal.  In most ca
1acc0 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d  ses, you can com
1acd0 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75  pute the.** valu
1ace0 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74  e of nRec from t
1acf0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
1ad00 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75  ournal file.  Bu
1ad10 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20  t if a power.** 
1ad20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64  failure occurred
1ad30 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
1ad40 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72 69  al was being wri
1ad50 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62  tten, it could b
1ad60 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68  e the.** case th
1ad70 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  at the size of t
1ad80 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1ad90 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e  had already been
1ada0 20 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a   increased but.*
1adb0 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e 74 72  * the extra entr
1adc0 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20  ies had not yet 
1add0 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79 20 74  made it safely t
1ade0 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68  o disk.  In such
1adf0 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20   a case,.** the 
1ae00 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f  value of nRec co
1ae10 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mputed from the 
1ae20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20  file size would 
1ae30 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46  be too large.  F
1ae40 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f  or.** that reaso
1ae50 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65  n, we always use
1ae60 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
1ae70 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a  in the header..*
1ae80 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63  *.** If the nRec
1ae90 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66   value is 0xffff
1aea0 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68  ffff it means th
1aeb0 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62  at nRec should b
1aec0 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72  e computed.** fr
1aed0 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  om the file size
1aee0 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 69 73  .  This value is
1aef0 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 75   used when the u
1af00 73 65 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a  ser selects the.
1af10 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f  ** no-sync optio
1af20 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  n for the journa
1af30 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c  l.  A power fail
1af40 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74  ure could lead t
1af50 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20  o corruption.** 
1af60 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 42  in this case.  B
1af70 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69  ut for things li
1af80 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ke temporary tab
1af90 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62  le (which will b
1afa0 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65  e.** deleted whe
1afb0 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73 20 72  n the power is r
1afc0 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27  estored) we don'
1afd0 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20  t care.  .**.** 
1afe0 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e  If the file open
1aff0 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61  ed as the journa
1b000 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20  l file is not a 
1b010 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a  well-formed.** j
1b020 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e  ournal file then
1b030 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f   all pages up to
1b040 20 74 68 65 20 66 69 72 73 74 20 63 6f 72 72 75   the first corru
1b050 70 74 65 64 20 70 61 67 65 20 61 72 65 20 72 6f  pted page are ro
1b060 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72  lled.** back (or
1b070 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68 65   no pages if the
1b080 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
1b090 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54  is corrupted). T
1b0a0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
1b0b0 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74  ** is then delet
1b0c0 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ed and SQLITE_OK
1b0d0 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20   returned, just 
1b0e0 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74  as if no corrupt
1b0f0 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20  ion had.** been 
1b100 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a  encountered..**.
1b110 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20  ** If an I/O or 
1b120 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f  malloc() error o
1b130 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e  ccurs, the journ
1b140 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64  al-file is not d
1b150 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e  eleted.** and an
1b160 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
1b170 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eturned..**.** T
1b180 68 65 20 69 73 48 6f 74 20 70 61 72 61 6d 65 74  he isHot paramet
1b190 65 72 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  er indicates tha
1b1a0 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 20  t we are trying 
1b1b0 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 6a 6f  to rollback a jo
1b1c0 75 72 6e 61 6c 0a 2a 2a 20 74 68 61 74 20 6d 69  urnal.** that mi
1b1d0 67 68 74 20 62 65 20 61 20 68 6f 74 20 6a 6f 75  ght be a hot jou
1b1e0 72 6e 61 6c 2e 20 20 4f 72 2c 20 69 74 20 63 6f  rnal.  Or, it co
1b1f0 75 6c 64 20 62 65 20 74 68 61 74 20 74 68 65 20  uld be that the 
1b200 6a 6f 75 72 6e 61 6c 20 69 73 20 0a 2a 2a 20 70  journal is .** p
1b210 72 65 73 65 72 76 65 64 20 62 65 63 61 75 73 65  reserved because
1b220 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f   of JOURNALMODE_
1b230 50 45 52 53 49 53 54 20 6f 72 20 4a 4f 55 52 4e  PERSIST or JOURN
1b240 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 2e  ALMODE_TRUNCATE.
1b250 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
1b260 61 6c 20 72 65 61 6c 6c 79 20 69 73 20 68 6f 74  al really is hot
1b270 2c 20 72 65 73 65 74 20 74 68 65 20 70 61 67 65  , reset the page
1b280 72 20 63 61 63 68 65 20 70 72 69 6f 72 20 72 6f  r cache prior ro
1b290 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b 20 61 6e  lling.** back an
1b2a0 79 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66 20 74  y content.  If t
1b2b0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6d 65  he journal is me
1b2c0 72 65 6c 79 20 70 65 72 73 69 73 74 65 6e 74 2c  rely persistent,
1b2d0 20 6e 6f 20 72 65 73 65 74 20 69 73 0a 2a 2a 20   no reset is.** 
1b2e0 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  needed..*/.stati
1b2f0 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79  c int pager_play
1b300 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
1b310 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b 0a  er, int isHot){.
1b320 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
1b330 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
1b340 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20  fs;.  i64 szJ;  
1b350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b360 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  * Size of the jo
1b370 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79  urnal file in by
1b380 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65  tes */.  u32 nRe
1b390 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1b3a0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52    /* Number of R
1b3b0 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a 6f  ecords in the jo
1b3c0 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75  urnal */.  u32 u
1b3d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b3e0 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20      /* Unsigned 
1b3f0 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  loop counter */.
1b400 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b    Pgno mxPg = 0;
1b410 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1b420 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e  ze of the origin
1b430 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73  al file in pages
1b440 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
1b450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b460 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66  * Result code of
1b470 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f   a subroutine */
1b480 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b 20  .  int res = 1; 
1b490 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
1b4a0 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
1b4b0 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
1b4c0 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d  () */.  char *zM
1b4d0 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20  aster = 0;      
1b4e0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74   /* Name of mast
1b4f0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
1b500 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20  if any */.  int 
1b510 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 3b 20  needPagerReset; 
1b520 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
1b530 72 65 73 65 74 20 70 61 67 65 20 70 72 69 6f 72  reset page prior
1b540 20 74 6f 20 66 69 72 73 74 20 70 61 67 65 20 72   to first page r
1b550 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74  ollback */.  int
1b560 20 6e 50 6c 61 79 62 61 63 6b 20 3d 20 30 3b 20   nPlayback = 0; 
1b570 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e        /* Total n
1b580 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 72  umber of pages r
1b590 65 73 74 6f 72 65 64 20 66 72 6f 6d 20 6a 6f 75  estored from jou
1b5a0 72 6e 61 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69  rnal */..  /* Fi
1b5b0 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
1b5c0 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e  y records are in
1b5d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41   the journal.  A
1b5e0 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20  bort early if.  
1b5f0 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ** the journal i
1b600 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20  s empty..  */.  
1b610 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
1b620 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
1b630 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
1b640 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
1b650 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66  jfd, &szJ);.  if
1b660 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1b670 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  ){.    goto end_
1b680 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20  playback;.  }.. 
1b690 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73   /* Read the mas
1b6a0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
1b6b0 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
1b6c0 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73  l, if it is pres
1b6d0 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d  ent..  ** If a m
1b6e0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1b6f0 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69  le name is speci
1b700 66 69 65 64 2c 20 62 75 74 20 74 68 65 20 66 69  fied, but the fi
1b710 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70  le is not.  ** p
1b720 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20  resent on disk, 
1b730 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
1b740 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20   is not hot and 
1b750 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
1b760 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20   be.  ** played 
1b770 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  back..  **.  ** 
1b780 54 4f 44 4f 3a 20 54 65 63 68 6e 69 63 61 6c 6c  TODO: Technicall
1b790 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  y the following 
1b7a0 69 73 20 61 6e 20 65 72 72 6f 72 20 62 65 63 61  is an error beca
1b7b0 75 73 65 20 69 74 20 61 73 73 75 6d 65 73 20 74  use it assumes t
1b7c0 68 61 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 20  hat.  ** buffer 
1b7d0 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20  Pager.pTmpSpace 
1b7e0 69 73 20 28 6d 78 50 61 74 68 6e 61 6d 65 2b 31  is (mxPathname+1
1b7f0 29 20 62 79 74 65 73 20 6f 72 20 6c 61 72 67 65  ) bytes or large
1b800 72 2e 20 69 2e 65 2e 20 74 68 61 74 0a 20 20 2a  r. i.e. that.  *
1b810 2a 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53  * (pPager->pageS
1b820 69 7a 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e 70  ize >= pPager->p
1b830 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
1b840 31 29 2e 20 55 73 69 6e 67 20 6f 73 5f 75 6e 69  1). Using os_uni
1b850 78 2e 63 2c 0a 20 20 2a 2a 20 20 6d 78 50 61 74  x.c,.  **  mxPat
1b860 68 6e 61 6d 65 20 69 73 20 35 31 32 2c 20 77 68  hname is 512, wh
1b870 69 63 68 20 69 73 20 74 68 65 20 73 61 6d 65 20  ich is the same 
1b880 61 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61  as the minimum a
1b890 6c 6c 6f 77 61 62 6c 65 20 76 61 6c 75 65 0a 20  llowable value. 
1b8a0 20 2a 2a 20 66 6f 72 20 70 61 67 65 53 69 7a 65   ** for pageSize
1b8b0 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72  ..  */.  zMaster
1b8c0 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
1b8d0 70 61 63 65 3b 0a 20 20 72 63 20 3d 20 72 65 61  pace;.  rc = rea
1b8e0 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
1b8f0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73  Pager->jfd, zMas
1b900 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66  ter, pPager->pVf
1b910 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s->mxPathname+1)
1b920 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1b930 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72  TE_OK && zMaster
1b940 5b 30 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  [0] ){.    rc = 
1b950 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
1b960 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53  pVfs, zMaster, S
1b970 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
1b980 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a  STS, &res);.  }.
1b990 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20    zMaster = 0;. 
1b9a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1b9b0 4f 4b 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20  OK || !res ){.  
1b9c0 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
1b9d0 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  ack;.  }.  pPage
1b9e0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
1b9f0 30 3b 0a 20 20 6e 65 65 64 50 61 67 65 72 52 65  0;.  needPagerRe
1ba00 73 65 74 20 3d 20 69 73 48 6f 74 3b 0a 0a 20 20  set = isHot;..  
1ba10 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72  /* This loop ter
1ba20 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72 20 77  minates either w
1ba30 68 65 6e 20 61 20 72 65 61 64 4a 6f 75 72 6e 61  hen a readJourna
1ba40 6c 48 64 72 28 29 20 6f 72 20 0a 20 20 2a 2a 20  lHdr() or .  ** 
1ba50 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
1ba60 6e 65 5f 70 61 67 65 28 29 20 63 61 6c 6c 20 72  ne_page() call r
1ba70 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f  eturns SQLITE_DO
1ba80 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f  NE or an IO erro
1ba90 72 20 0a 20 20 2a 2a 20 6f 63 63 75 72 73 2e 20  r .  ** occurs. 
1baa0 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31  .  */.  while( 1
1bab0 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65 61 64 20   ){.    /* Read 
1bac0 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c  the next journal
1bad0 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65   header from the
1bae0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
1baf0 49 66 20 74 68 65 72 65 20 61 72 65 0a 20 20 20  If there are.   
1bb00 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62   ** not enough b
1bb10 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65  ytes left in the
1bb20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
1bb30 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61  r a complete hea
1bb40 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69  der, or.    ** i
1bb50 74 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20  t is corrupted, 
1bb60 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d  then a process m
1bb70 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20  ust have failed 
1bb80 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74  while writing it
1bb90 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e  ..    ** This in
1bba0 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20  dicates nothing 
1bbb0 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65  more needs to be
1bbc0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20   rolled back..  
1bbd0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65    */.    rc = re
1bbe0 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  adJournalHdr(pPa
1bbf0 67 65 72 2c 20 69 73 48 6f 74 2c 20 73 7a 4a 2c  ger, isHot, szJ,
1bc00 20 26 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a   &nRec, &mxPg);.
1bc10 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1bc20 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20  TE_OK ){ .      
1bc30 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
1bc40 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ONE ){.        r
1bc50 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1bc60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
1bc70 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
1bc80 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
1bc90 20 6e 52 65 63 20 69 73 20 30 78 66 66 66 66 66   nRec is 0xfffff
1bca0 66 66 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a  fff, then this j
1bcb0 6f 75 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74  ournal was creat
1bcc0 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a  ed by a process.
1bcd0 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69      ** working i
1bce0 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20  n no-sync mode. 
1bcf0 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
1bd00 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20  the rest of the 
1bd10 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66  journal.    ** f
1bd20 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ile consists of 
1bd30 70 61 67 65 73 2c 20 74 68 65 72 65 20 61 72 65  pages, there are
1bd40 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c   no more journal
1bd50 20 68 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74   headers. Comput
1bd60 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c  e.    ** the val
1bd70 75 65 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64  ue of nRec based
1bd80 20 6f 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74   on this assumpt
1bd90 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
1bda0 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66  if( nRec==0xffff
1bdb0 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73  ffff ){.      as
1bdc0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
1bdd0 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41  urnalOff==JOURNA
1bde0 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
1bdf0 20 29 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d   );.      nRec =
1be00 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 4a 4f   (int)((szJ - JO
1be10 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
1be20 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47  ger))/JOURNAL_PG
1be30 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20  _SZ(pPager));.  
1be40 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
1be50 52 65 63 20 69 73 20 30 20 61 6e 64 20 74 68 69  Rec is 0 and thi
1be60 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66  s rollback is of
1be70 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63   a transaction c
1be80 72 65 61 74 65 64 20 62 79 20 74 68 69 73 0a 20  reated by this. 
1be90 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e     ** process an
1bea0 64 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  d if this is the
1beb0 20 66 69 6e 61 6c 20 68 65 61 64 65 72 20 69 6e   final header in
1bec0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68   the journal, th
1bed0 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20 20 20  en it means.    
1bee0 2a 2a 20 74 68 61 74 20 74 68 69 73 20 70 61 72  ** that this par
1bef0 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
1bf00 20 77 61 73 20 62 65 69 6e 67 20 66 69 6c 6c 65   was being fille
1bf10 64 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65  d but has not ye
1bf20 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79  t been.    ** sy
1bf30 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 43  nced to disk.  C
1bf40 6f 6d 70 75 74 65 20 74 68 65 20 6e 75 6d 62 65  ompute the numbe
1bf50 72 20 6f 66 20 70 61 67 65 73 20 62 61 73 65 64  r of pages based
1bf60 20 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e 69 6e   on the remainin
1bf70 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66  g.    ** size of
1bf80 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a   the file..    *
1bf90 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 68 69  *.    ** The thi
1bfa0 72 64 20 74 65 72 6d 20 6f 66 20 74 68 65 20 74  rd term of the t
1bfb0 65 73 74 20 77 61 73 20 61 64 64 65 64 20 74 6f  est was added to
1bfc0 20 66 69 78 20 74 69 63 6b 65 74 20 23 32 35 36   fix ticket #256
1bfd0 35 2e 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20 72  5..    ** When r
1bfe0 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f  olling back a ho
1bff0 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e 52 65 63 3d  t journal, nRec=
1c000 3d 30 20 61 6c 77 61 79 73 20 6d 65 61 6e 73 20  =0 always means 
1c010 74 68 61 74 20 74 68 65 20 6e 65 78 74 0a 20 20  that the next.  
1c020 20 20 2a 2a 20 63 68 75 6e 6b 20 6f 66 20 74 68    ** chunk of th
1c030 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69  e journal contai
1c040 6e 73 20 7a 65 72 6f 20 70 61 67 65 73 20 74 6f  ns zero pages to
1c050 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
1c060 20 20 42 75 74 0a 20 20 20 20 2a 2a 20 77 68 65    But.    ** whe
1c070 6e 20 64 6f 69 6e 67 20 61 20 52 4f 4c 4c 42 41  n doing a ROLLBA
1c080 43 4b 20 61 6e 64 20 74 68 65 20 6e 52 65 63 3d  CK and the nRec=
1c090 3d 30 20 63 68 75 6e 6b 20 69 73 20 74 68 65 20  =0 chunk is the 
1c0a0 6c 61 73 74 20 63 68 75 6e 6b 20 69 6e 0a 20 20  last chunk in.  
1c0b0 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
1c0c0 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
1c0d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  the journal migh
1c0e0 74 20 63 6f 6e 74 61 69 6e 20 61 64 64 69 74 69  t contain additi
1c0f0 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65  onal.    ** page
1c100 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62  s that need to b
1c110 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e  e rolled back an
1c120 64 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65  d that the numbe
1c130 72 20 6f 66 20 70 61 67 65 73 20 0a 20 20 20 20  r of pages .    
1c140 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d  ** should be com
1c150 70 75 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74  puted based on t
1c160 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1c170 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
1c180 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20   if( nRec==0 && 
1c190 21 69 73 48 6f 74 20 26 26 0a 20 20 20 20 20 20  !isHot &&.      
1c1a0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1c1b0 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52  lHdr+JOURNAL_HDR
1c1c0 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61  _SZ(pPager)==pPa
1c1d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
1c1e0 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20  ){.      nRec = 
1c1f0 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 70 50 61  (int)((szJ - pPa
1c200 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
1c210 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a   / JOURNAL_PG_SZ
1c220 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d  (pPager));.    }
1c230 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
1c240 20 69 73 20 74 68 65 20 66 69 72 73 74 20 68 65   is the first he
1c250 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20 74  ader read from t
1c260 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e  he journal, trun
1c270 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  cate the.    ** 
1c280 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 61  database file ba
1c290 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ck to its origin
1c2a0 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a  al size..    */.
1c2b0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1c2c0 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52  journalOff==JOUR
1c2d0 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
1c2e0 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  r) ){.      rc =
1c2f0 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
1c300 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20  pPager, mxPg);. 
1c310 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1c320 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1c330 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
1c340 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ack;.      }.   
1c350 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
1c360 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a  e = mxPg;.    }.
1c370 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69  .    /* Copy ori
1c380 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20  ginal pages out 
1c390 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  of the journal a
1c3a0 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  nd back into the
1c3b0 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73   .    ** databas
1c3c0 65 20 66 69 6c 65 20 61 6e 64 2f 6f 72 20 70 61  e file and/or pa
1c3d0 67 65 20 63 61 63 68 65 2e 0a 20 20 20 20 2a 2f  ge cache..    */
1c3e0 0a 20 20 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c  .    for(u=0; u<
1c3f0 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a 20 20 20 20  nRec; u++){.    
1c400 20 20 69 66 28 20 6e 65 65 64 50 61 67 65 72 52    if( needPagerR
1c410 65 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  eset ){.        
1c420 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
1c430 65 72 29 3b 0a 20 20 20 20 20 20 20 20 6e 65 65  er);.        nee
1c440 64 50 61 67 65 72 52 65 73 65 74 20 3d 20 30 3b  dPagerReset = 0;
1c450 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
1c460 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
1c470 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
1c480 65 72 2c 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72  er,&pPager->jour
1c490 6e 61 6c 4f 66 66 2c 30 2c 31 2c 30 29 3b 0a 20  nalOff,0,1,0);. 
1c4a0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1c4b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1c4c0 20 20 6e 50 6c 61 79 62 61 63 6b 2b 2b 3b 0a 20    nPlayback++;. 
1c4d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1c4e0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1c4f0 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
1c500 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
1c510 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20  rnalOff = szJ;. 
1c520 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1c530 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
1c540 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
1c550 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
1c560 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
1c570 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73   the journal has
1c580 20 62 65 65 6e 20 74 72 75 6e 63 61 74 65 64 2c   been truncated,
1c590 20 73 69 6d 70 6c 79 20 73 74 6f 70 20 72 65 61   simply stop rea
1c5a0 64 69 6e 67 20 61 6e 64 0a 20 20 20 20 20 20 20  ding and.       
1c5b0 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67     ** processing
1c5c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 68   the journal. Th
1c5d0 69 73 20 6d 69 67 68 74 20 68 61 70 70 65 6e 20  is might happen 
1c5e0 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  if the journal w
1c5f0 61 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  as.          ** 
1c600 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 77  not completely w
1c610 72 69 74 74 65 6e 20 61 6e 64 20 73 79 6e 63 65  ritten and synce
1c620 64 20 70 72 69 6f 72 20 74 6f 20 61 20 63 72 61  d prior to a cra
1c630 73 68 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 20  sh.  In that.   
1c640 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 2c 20         ** case, 
1c650 74 68 65 20 64 61 74 61 62 61 73 65 20 73 68 6f  the database sho
1c660 75 6c 64 20 68 61 76 65 20 6e 65 76 65 72 20 62  uld have never b
1c670 65 65 6e 20 77 72 69 74 74 65 6e 20 69 6e 20 74  een written in t
1c680 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
1c690 66 69 72 73 74 20 70 6c 61 63 65 20 73 6f 20 69  first place so i
1c6a0 74 20 69 73 20 4f 4b 20 74 6f 20 73 69 6d 70 6c  t is OK to simpl
1c6b0 79 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 72 6f  y abandon the ro
1c6c0 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 20 20 20 20 20  llback. */.     
1c6d0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1c6e0 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67  _OK;.          g
1c6f0 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
1c700 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1c710 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
1c720 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74   we are unable t
1c730 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 71 75 69 74  o rollback, quit
1c740 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
1c750 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20  error.          
1c760 2a 2a 20 63 6f 64 65 2e 20 20 54 68 69 73 20 77  ** code.  This w
1c770 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 70 61  ill cause the pa
1c780 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65  ger to enter the
1c790 20 65 72 72 6f 72 20 73 74 61 74 65 0a 20 20 20   error state.   
1c7a0 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 74 68 61         ** so tha
1c7b0 74 20 6e 6f 20 66 75 72 74 68 65 72 20 68 61 72  t no further har
1c7c0 6d 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 2e 20  m will be done. 
1c7d0 20 50 65 72 68 61 70 73 20 74 68 65 20 6e 65 78   Perhaps the nex
1c7e0 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  t.          ** p
1c7f0 72 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65 20 61  rocess to come a
1c800 6c 6f 6e 67 20 77 69 6c 6c 20 62 65 20 61 62 6c  long will be abl
1c810 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68  e to rollback th
1c820 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20  e database..    
1c830 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1c840 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
1c850 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  back;.        }.
1c860 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1c870 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44  }.  /*NOTREACHED
1c880 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 20 29  */.  assert( 0 )
1c890 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a  ;..end_playback:
1c8a0 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20  .  /* Following 
1c8b0 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20  a rollback, the 
1c8c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68  database file sh
1c8d0 6f 75 6c 64 20 62 65 20 62 61 63 6b 20 69 6e 20  ould be back in 
1c8e0 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a  its original.  *
1c8f0 2a 20 73 74 61 74 65 20 70 72 69 6f 72 20 74 6f  * state prior to
1c900 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
1c910 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 73  e transaction, s
1c920 6f 20 69 6e 76 6f 6b 65 20 74 68 65 0a 20 20 2a  o invoke the.  *
1c930 2a 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44  * SQLITE_FCNTL_D
1c940 42 5f 55 4e 43 48 41 4e 47 45 44 20 66 69 6c 65  B_UNCHANGED file
1c950 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20  -control method 
1c960 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 0a 20  to disable the. 
1c970 20 2a 2a 20 61 73 73 65 72 74 69 6f 6e 20 74 68   ** assertion th
1c980 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  at the transacti
1c990 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20 6d  on counter was m
1c9a0 6f 64 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 23 69  odified..  */.#i
1c9b0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1c9c0 47 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  G.  if( pPager->
1c9d0 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  fd->pMethods ){.
1c9e0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c      sqlite3OsFil
1c9f0 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61  eControlHint(pPa
1ca00 67 65 72 2d 3e 66 64 2c 53 51 4c 49 54 45 5f 46  ger->fd,SQLITE_F
1ca10 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45  CNTL_DB_UNCHANGE
1ca20 44 2c 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  D,0);.  }.#endif
1ca30 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70  ..  /* If this p
1ca40 6c 61 79 62 61 63 6b 20 69 73 20 68 61 70 70 65  layback is happe
1ca50 6e 69 6e 67 20 61 75 74 6f 6d 61 74 69 63 61 6c  ning automatical
1ca60 6c 79 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ly as a result o
1ca70 66 20 61 6e 20 49 4f 20 6f 72 20 0a 20 20 2a 2a  f an IO or .  **
1ca80 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 74 68   malloc error th
1ca90 61 74 20 6f 63 63 75 72 72 65 64 20 61 66 74 65  at occurred afte
1caa0 72 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  r the change-cou
1cab0 6e 74 65 72 20 77 61 73 20 75 70 64 61 74 65 64  nter was updated
1cac0 20 62 75 74 20 0a 20 20 2a 2a 20 62 65 66 6f 72   but .  ** befor
1cad0 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
1cae0 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74 65 64 2c  n was committed,
1caf0 20 74 68 65 6e 20 74 68 65 20 63 68 61 6e 67 65   then the change
1cb00 2d 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20 6d  -counter .  ** m
1cb10 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d 61 79 20  odification may 
1cb20 6a 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 72  just have been r
1cb30 65 76 65 72 74 65 64 2e 20 49 66 20 74 68 69 73  everted. If this
1cb40 20 68 61 70 70 65 6e 73 20 69 6e 20 65 78 63 6c   happens in excl
1cb50 75 73 69 76 65 20 0a 20 20 2a 2a 20 6d 6f 64 65  usive .  ** mode
1cb60 2c 20 74 68 65 6e 20 73 75 62 73 65 71 75 65 6e  , then subsequen
1cb70 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 70  t transactions p
1cb80 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68 65 20  erformed by the 
1cb90 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20  connection will 
1cba0 6e 6f 74 0a 20 20 2a 2a 20 75 70 64 61 74 65 20  not.  ** update 
1cbb0 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
1cbc0 65 72 20 61 74 20 61 6c 6c 2e 20 54 68 69 73 20  er at all. This 
1cbd0 6d 61 79 20 6c 65 61 64 20 74 6f 20 63 61 63 68  may lead to cach
1cbe0 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 79 0a  e inconsistency.
1cbf0 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 73 20 66 6f    ** problems fo
1cc00 72 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  r other processe
1cc10 73 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20  s at some point 
1cc20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e 20 53  in the future. S
1cc30 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a 20 69 6e 20  o, just.  ** in 
1cc40 63 61 73 65 20 74 68 69 73 20 68 61 73 20 68 61  case this has ha
1cc50 70 70 65 6e 65 64 2c 20 63 6c 65 61 72 20 74 68  ppened, clear th
1cc60 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  e changeCountDon
1cc70 65 20 66 6c 61 67 20 6e 6f 77 2e 0a 20 20 2a 2f  e flag now..  */
1cc80 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  .  pPager->chang
1cc90 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61  eCountDone = pPa
1cca0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a  ger->tempFile;..
1ccb0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1ccc0 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74  _OK ){.    zMast
1ccd0 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d  er = pPager->pTm
1cce0 70 53 70 61 63 65 3b 0a 20 20 20 20 72 63 20 3d  pSpace;.    rc =
1ccf0 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
1cd00 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  al(pPager->jfd, 
1cd10 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d  zMaster, pPager-
1cd20 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
1cd30 65 2b 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61  e+1);.    testca
1cd40 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
1cd50 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  K );.  }.  if( r
1cd60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20  c==SQLITE_OK.   
1cd70 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61  && (pPager->eSta
1cd80 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
1cd90 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72  _DBMOD || pPager
1cda0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
1cdb0 4f 50 45 4e 29 0a 20 20 29 7b 0a 20 20 20 20 72  OPEN).  ){.    r
1cdc0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1cdd0 53 79 6e 63 28 70 50 61 67 65 72 2c 20 30 29 3b  Sync(pPager, 0);
1cde0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
1cdf0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ce00 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74  rc = pager_end_t
1ce10 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
1ce20 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d 27  r, zMaster[0]!='
1ce30 5c 30 27 2c 20 30 29 3b 0a 20 20 20 20 74 65 73  \0', 0);.    tes
1ce40 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
1ce50 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66  E_OK );.  }.  if
1ce60 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1ce70 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26 26  && zMaster[0] &&
1ce80 20 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49   res ){.    /* I
1ce90 66 20 74 68 65 72 65 20 77 61 73 20 61 20 6d 61  f there was a ma
1cea0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  ster journal and
1ceb0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
1cec0 6c 6c 20 72 65 74 75 72 6e 20 73 75 63 63 65 73  ll return succes
1ced0 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66  s,.    ** see if
1cee0 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
1cef0 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  to delete the ma
1cf00 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20  ster journal..  
1cf10 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61    */.    rc = pa
1cf20 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 70 50  ger_delmaster(pP
1cf30 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  ager, zMaster);.
1cf40 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
1cf50 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
1cf60 20 7d 0a 20 20 69 66 28 20 69 73 48 6f 74 20 26   }.  if( isHot &
1cf70 26 20 6e 50 6c 61 79 62 61 63 6b 20 29 7b 0a 20  & nPlayback ){. 
1cf80 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
1cf90 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43  QLITE_NOTICE_REC
1cfa0 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 2c 20 22  OVER_ROLLBACK, "
1cfb0 72 65 63 6f 76 65 72 65 64 20 25 64 20 70 61 67  recovered %d pag
1cfc0 65 73 20 66 72 6f 6d 20 25 73 22 2c 0a 20 20 20  es from %s",.   
1cfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 50 6c               nPl
1cfe0 61 79 62 61 63 6b 2c 20 70 50 61 67 65 72 2d 3e  ayback, pPager->
1cff0 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 0a 0a  zJournal);.  }..
1d000 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73    /* The Pager.s
1d010 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62  ectorSize variab
1d020 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  le may have been
1d030 20 75 70 64 61 74 65 64 20 77 68 69 6c 65 20 72   updated while r
1d040 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b  olling.  ** back
1d050 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74   a journal creat
1d060 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20  ed by a process 
1d070 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74  with a different
1d080 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a   sector size.  *
1d090 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69  * value. Reset i
1d0a0 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  t to the correct
1d0b0 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20   value for this 
1d0c0 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  process..  */.  
1d0d0 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50  setSectorSize(pP
1d0e0 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
1d0f0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  rc;.}.../*.** Re
1d100 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 66  ad the content f
1d110 6f 72 20 70 61 67 65 20 70 50 67 20 6f 75 74 20  or page pPg out 
1d120 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1d130 66 69 6c 65 20 61 6e 64 20 69 6e 74 6f 20 0a 2a  file and into .*
1d140 2a 20 70 50 67 2d 3e 70 44 61 74 61 2e 20 41 20  * pPg->pData. A 
1d150 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 72 20 67  shared lock or g
1d160 72 65 61 74 65 72 20 6d 75 73 74 20 62 65 20 68  reater must be h
1d170 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  eld on the datab
1d180 61 73 65 0a 2a 2a 20 66 69 6c 65 20 62 65 66 6f  ase.** file befo
1d190 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  re this function
1d1a0 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
1d1b0 2a 20 49 66 20 70 61 67 65 20 31 20 69 73 20 72  * If page 1 is r
1d1c0 65 61 64 2c 20 74 68 65 6e 20 74 68 65 20 76 61  ead, then the va
1d1d0 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46  lue of Pager.dbF
1d1e0 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 73 65 74  ileVers[] is set
1d1f0 20 74 6f 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65   to.** the value
1d200 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
1d210 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
1d220 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72  .** If an IO err
1d230 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  or occurs, then 
1d240 74 68 65 20 49 4f 20 65 72 72 6f 72 20 69 73 20  the IO error is 
1d250 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
1d260 63 61 6c 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65 72  caller..** Other
1d270 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  wise, SQLITE_OK 
1d280 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
1d290 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 44  static int readD
1d2a0 62 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  bPage(PgHdr *pPg
1d2b0 2c 20 75 33 32 20 69 46 72 61 6d 65 29 7b 0a 20  , u32 iFrame){. 
1d2c0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1d2d0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a   pPg->pPager; /*
1d2e0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 73   Pager object as
1d2f0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 61  sociated with pa
1d300 67 65 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e 6f  ge pPg */.  Pgno
1d310 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e   pgno = pPg->pgn
1d320 6f 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65  o;       /* Page
1d330 20 6e 75 6d 62 65 72 20 74 6f 20 72 65 61 64 20   number to read 
1d340 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
1d350 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
1d360 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
1d370 20 2a 2f 0a 20 20 69 6e 74 20 70 67 73 7a 20 3d   */.  int pgsz =
1d380 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1d390 65 3b 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  e; /* Number of 
1d3a0 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a 2f  bytes to read */
1d3b0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
1d3c0 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
1d3d0 52 5f 52 45 41 44 45 52 20 26 26 20 21 4d 45 4d  R_READER && !MEM
1d3e0 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
1d3f0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
1d400 64 29 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  d) );..#ifndef S
1d410 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
1d420 20 69 66 28 20 69 46 72 61 6d 65 20 29 7b 0a 20   if( iFrame ){. 
1d430 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 70 75 6c     /* Try to pul
1d440 6c 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  l the page from 
1d450 74 68 65 20 77 72 69 74 65 2d 61 68 65 61 64 20  the write-ahead 
1d460 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  log. */.    rc =
1d470 20 73 71 6c 69 74 65 33 57 61 6c 52 65 61 64 46   sqlite3WalReadF
1d480 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61  rame(pPager->pWa
1d490 6c 2c 20 69 46 72 61 6d 65 2c 20 70 67 73 7a 2c  l, iFrame, pgsz,
1d4a0 20 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20   pPg->pData);.  
1d4b0 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b  }else.#endif.  {
1d4c0 0a 20 20 20 20 69 36 34 20 69 4f 66 66 73 65 74  .    i64 iOffset
1d4d0 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34   = (pgno-1)*(i64
1d4e0 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
1d4f0 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e;.    rc = sqli
1d500 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
1d510 2d 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61 74 61  ->fd, pPg->pData
1d520 2c 20 70 67 73 7a 2c 20 69 4f 66 66 73 65 74 29  , pgsz, iOffset)
1d530 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1d540 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
1d550 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72  _READ ){.      r
1d560 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1d570 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
1d580 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 69  pgno==1 ){.    i
1d590 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 2f  f( rc ){.      /
1d5a0 2a 20 49 66 20 74 68 65 20 72 65 61 64 20 69 73  * If the read is
1d5b0 20 75 6e 73 75 63 63 65 73 73 66 75 6c 2c 20 73   unsuccessful, s
1d5c0 65 74 20 74 68 65 20 64 62 46 69 6c 65 56 65 72  et the dbFileVer
1d5d0 73 5b 5d 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67  s[] to something
1d5e0 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77  .      ** that w
1d5f0 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 61 20 76  ill never be a v
1d600 61 6c 69 64 20 66 69 6c 65 20 76 65 72 73 69 6f  alid file versio
1d610 6e 2e 20 20 64 62 46 69 6c 65 56 65 72 73 5b 5d  n.  dbFileVers[]
1d620 20 69 73 20 61 20 63 6f 70 79 0a 20 20 20 20 20   is a copy.     
1d630 20 2a 2a 20 6f 66 20 62 79 74 65 73 20 32 34 2e   ** of bytes 24.
1d640 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74 61 62  .39 of the datab
1d650 61 73 65 2e 20 20 42 79 74 65 73 20 32 38 2e 2e  ase.  Bytes 28..
1d660 33 31 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73  31 should always
1d670 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72   be.      ** zer
1d680 6f 20 6f 72 20 74 68 65 20 73 69 7a 65 20 6f 66  o or the size of
1d690 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   the database in
1d6a0 20 70 61 67 65 2e 20 42 79 74 65 73 20 33 32 2e   page. Bytes 32.
1d6b0 2e 33 35 20 61 6e 64 20 33 35 2e 2e 33 39 0a 20  .35 and 35..39. 
1d6c0 20 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62       ** should b
1d6d0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 77  e page numbers w
1d6e0 68 69 63 68 20 61 72 65 20 6e 65 76 65 72 20 30  hich are never 0
1d6f0 78 66 66 66 66 66 66 66 66 2e 20 20 53 6f 20 66  xffffffff.  So f
1d700 69 6c 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  illing.      ** 
1d710 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1d720 72 73 5b 5d 20 77 69 74 68 20 61 6c 6c 20 30 78  rs[] with all 0x
1d730 66 66 20 62 79 74 65 73 20 73 68 6f 75 6c 64 20  ff bytes should 
1d740 73 75 66 66 69 63 65 2e 0a 20 20 20 20 20 20 2a  suffice..      *
1d750 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61  *.      ** For a
1d760 6e 20 65 6e 63 72 79 70 74 65 64 20 64 61 74 61  n encrypted data
1d770 62 61 73 65 2c 20 74 68 65 20 73 69 74 75 61 74  base, the situat
1d780 69 6f 6e 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70  ion is more comp
1d790 6c 65 78 3a 20 20 62 79 74 65 73 0a 20 20 20 20  lex:  bytes.    
1d7a0 20 20 2a 2a 20 32 34 2e 2e 33 39 20 6f 66 20 74    ** 24..39 of t
1d7b0 68 65 20 64 61 74 61 62 61 73 65 20 61 72 65 20  he database are 
1d7c0 77 68 69 74 65 20 6e 6f 69 73 65 2e 20 20 42 75  white noise.  Bu
1d7d0 74 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74  t the probabilit
1d7e0 79 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 77 68  y of.      ** wh
1d7f0 69 74 65 20 6e 6f 69 73 65 20 65 71 75 61 6c 69  ite noise equali
1d800 6e 67 20 31 36 20 62 79 74 65 73 20 6f 66 20 30  ng 16 bytes of 0
1d810 78 66 66 20 69 73 20 76 61 6e 69 73 68 69 6e 67  xff is vanishing
1d820 6c 79 20 73 6d 61 6c 6c 20 73 6f 0a 20 20 20 20  ly small so.    
1d830 20 20 2a 2a 20 77 65 20 73 68 6f 75 6c 64 20 73    ** we should s
1d840 74 69 6c 6c 20 62 65 20 6f 6b 2e 0a 20 20 20 20  till be ok..    
1d850 20 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d 73 65    */.      memse
1d860 74 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  t(pPager->dbFile
1d870 56 65 72 73 2c 20 30 78 66 66 2c 20 73 69 7a 65  Vers, 0xff, size
1d880 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
1d890 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 65 6c  eVers));.    }el
1d8a0 73 65 7b 0a 20 20 20 20 20 20 75 38 20 2a 64 62  se{.      u8 *db
1d8b0 46 69 6c 65 56 65 72 73 20 3d 20 26 28 28 75 38  FileVers = &((u8
1d8c0 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 5b 32 34  *)pPg->pData)[24
1d8d0 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ];.      memcpy(
1d8e0 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  &pPager->dbFileV
1d8f0 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c  ers, dbFileVers,
1d900 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
1d910 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
1d920 20 20 7d 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31    }.  }.  CODEC1
1d930 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 44  (pPager, pPg->pD
1d940 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63  ata, pgno, 3, rc
1d950 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29   = SQLITE_NOMEM)
1d960 3b 0a 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28  ;..  PAGER_INCR(
1d970 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65  sqlite3_pager_re
1d980 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50  addb_count);.  P
1d990 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72  AGER_INCR(pPager
1d9a0 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54 52  ->nRead);.  IOTR
1d9b0 41 43 45 28 28 22 50 47 49 4e 20 25 70 20 25 64  ACE(("PGIN %p %d
1d9c0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e  \n", pPager, pgn
1d9d0 6f 29 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43  o));.  PAGERTRAC
1d9e0 45 28 28 22 46 45 54 43 48 20 25 64 20 70 61 67  E(("FETCH %d pag
1d9f0 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c  e %d hash(%08x)\
1da00 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1da10 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
1da20 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f  r), pgno, pager_
1da30 70 61 67 65 68 61 73 68 28 70 50 67 29 29 29 3b  pagehash(pPg)));
1da40 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1da50 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74  ../*.** Update t
1da60 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
1da70 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61  change-counter a
1da80 74 20 6f 66 66 73 65 74 73 20 32 34 20 61 6e 64  t offsets 24 and
1da90 20 39 32 20 69 6e 0a 2a 2a 20 74 68 65 20 68 65   92 in.** the he
1daa0 61 64 65 72 20 61 6e 64 20 74 68 65 20 73 71 6c  ader and the sql
1dab0 69 74 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62  ite version numb
1dac0 65 72 20 61 74 20 6f 66 66 73 65 74 20 39 36 2e  er at offset 96.
1dad0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  .**.** This is a
1dae0 6e 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 20  n unconditional 
1daf0 75 70 64 61 74 65 2e 20 20 53 65 65 20 61 6c 73  update.  See als
1db00 6f 20 74 68 65 20 70 61 67 65 72 5f 69 6e 63 72  o the pager_incr
1db10 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29  _changecounter()
1db20 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 68 69 63  .** routine whic
1db30 68 20 6f 6e 6c 79 20 75 70 64 61 74 65 73 20 74  h only updates t
1db40 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
1db50 72 20 69 66 20 74 68 65 20 75 70 64 61 74 65 20  r if the update 
1db60 69 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6e  is actually.** n
1db70 65 65 64 65 64 2c 20 61 73 20 64 65 74 65 72 6d  eeded, as determ
1db80 69 6e 65 64 20 62 79 20 74 68 65 20 70 50 61 67  ined by the pPag
1db90 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
1dba0 6f 6e 65 20 73 74 61 74 65 20 76 61 72 69 61 62  one state variab
1dbb0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
1dbc0 69 64 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63  id pager_write_c
1dbd0 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 67 48  hangecounter(PgH
1dbe0 64 72 20 2a 70 50 67 29 7b 0a 20 20 75 33 32 20  dr *pPg){.  u32 
1dbf0 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a  change_counter;.
1dc00 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20  .  /* Increment 
1dc10 74 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72  the value just r
1dc20 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 69 74  ead and write it
1dc30 20 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34   back to byte 24
1dc40 2e 20 2a 2f 0a 20 20 63 68 61 6e 67 65 5f 63 6f  . */.  change_co
1dc50 75 6e 74 65 72 20 3d 20 73 71 6c 69 74 65 33 47  unter = sqlite3G
1dc60 65 74 34 62 79 74 65 28 28 75 38 2a 29 70 50 67  et4byte((u8*)pPg
1dc70 2d 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  ->pPager->dbFile
1dc80 56 65 72 73 29 2b 31 3b 0a 20 20 70 75 74 33 32  Vers)+1;.  put32
1dc90 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67  bits(((char*)pPg
1dca0 2d 3e 70 44 61 74 61 29 2b 32 34 2c 20 63 68 61  ->pData)+24, cha
1dcb0 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20  nge_counter);.. 
1dcc0 20 2f 2a 20 41 6c 73 6f 20 73 74 6f 72 65 20 74   /* Also store t
1dcd0 68 65 20 53 51 4c 69 74 65 20 76 65 72 73 69 6f  he SQLite versio
1dce0 6e 20 6e 75 6d 62 65 72 20 69 6e 20 62 79 74 65  n number in byte
1dcf0 73 20 39 36 2e 2e 39 39 20 61 6e 64 20 69 6e 0a  s 96..99 and in.
1dd00 20 20 2a 2a 20 62 79 74 65 73 20 39 32 2e 2e 39    ** bytes 92..9
1dd10 35 20 73 74 6f 72 65 20 74 68 65 20 63 68 61 6e  5 store the chan
1dd20 67 65 20 63 6f 75 6e 74 65 72 20 66 6f 72 20 77  ge counter for w
1dd30 68 69 63 68 20 74 68 65 20 76 65 72 73 69 6f 6e  hich the version
1dd40 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 69 73 20   number.  ** is 
1dd50 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 70 75 74 33  valid. */.  put3
1dd60 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50  2bits(((char*)pP
1dd70 67 2d 3e 70 44 61 74 61 29 2b 39 32 2c 20 63 68  g->pData)+92, ch
1dd80 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 20  ange_counter);. 
1dd90 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61   put32bits(((cha
1dda0 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 39  r*)pPg->pData)+9
1ddb0 36 2c 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f  6, SQLITE_VERSIO
1ddc0 4e 5f 4e 55 4d 42 45 52 29 3b 0a 7d 0a 0a 23 69  N_NUMBER);.}..#i
1ddd0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1dde0 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73  T_WAL./*.** This
1ddf0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76   function is inv
1de00 6f 6b 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61  oked once for ea
1de10 63 68 20 70 61 67 65 20 74 68 61 74 20 68 61 73  ch page that has
1de20 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 0a 2a   already been .*
1de30 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  * written into t
1de40 68 65 20 6c 6f 67 20 66 69 6c 65 20 77 68 65 6e  he log file when
1de50 20 61 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69   a WAL transacti
1de60 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
1de70 6b 2e 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  k..** Parameter 
1de80 69 50 67 20 69 73 20 74 68 65 20 70 61 67 65 20  iPg is the page 
1de90 6e 75 6d 62 65 72 20 6f 66 20 73 61 69 64 20 70  number of said p
1dea0 61 67 65 2e 20 54 68 65 20 70 43 74 78 20 61 72  age. The pCtx ar
1deb0 67 75 6d 65 6e 74 20 0a 2a 2a 20 69 73 20 61 63  gument .** is ac
1dec0 74 75 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72  tually a pointer
1ded0 20 74 6f 20 74 68 65 20 50 61 67 65 72 20 73 74   to the Pager st
1dee0 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49  ructure..**.** I
1def0 66 20 70 61 67 65 20 69 50 67 20 69 73 20 70 72  f page iPg is pr
1df00 65 73 65 6e 74 20 69 6e 20 74 68 65 20 63 61 63  esent in the cac
1df10 68 65 2c 20 61 6e 64 20 68 61 73 20 6e 6f 20 6f  he, and has no o
1df20 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
1df30 65 6e 63 65 73 2c 0a 2a 2a 20 69 74 20 69 73 20  ences,.** it is 
1df40 64 69 73 63 61 72 64 65 64 2e 20 4f 74 68 65 72  discarded. Other
1df50 77 69 73 65 2c 20 69 66 20 74 68 65 72 65 20 61  wise, if there a
1df60 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  re one or more o
1df70 75 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 72 65  utstanding.** re
1df80 66 65 72 65 6e 63 65 73 2c 20 74 68 65 20 70 61  ferences, the pa
1df90 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 72 65  ge content is re
1dfa0 6c 6f 61 64 65 64 20 66 72 6f 6d 20 74 68 65 20  loaded from the 
1dfb0 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65  database. If the
1dfc0 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 72  .** attempt to r
1dfd0 65 6c 6f 61 64 20 63 6f 6e 74 65 6e 74 20 66 72  eload content fr
1dfe0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
1dff0 69 73 20 72 65 71 75 69 72 65 64 20 61 6e 64 20  is required and 
1e000 66 61 69 6c 73 2c 20 0a 2a 2a 20 72 65 74 75 72  fails, .** retur
1e010 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  n an SQLite erro
1e020 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73  r code. Otherwis
1e030 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  e, SQLITE_OK..*/
1e040 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1e050 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 76 6f  rUndoCallback(vo
1e060 69 64 20 2a 70 43 74 78 2c 20 50 67 6e 6f 20 69  id *pCtx, Pgno i
1e070 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Pg){.  int rc = 
1e080 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67  SQLITE_OK;.  Pag
1e090 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61  er *pPager = (Pa
1e0a0 67 65 72 20 2a 29 70 43 74 78 3b 0a 20 20 50 67  ger *)pCtx;.  Pg
1e0b0 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73  Hdr *pPg;..  ass
1e0c0 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
1e0d0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 70 50  (pPager) );.  pP
1e0e0 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  g = sqlite3Pager
1e0f0 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 69  Lookup(pPager, i
1e100 50 67 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29  Pg);.  if( pPg )
1e110 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
1e120 33 50 63 61 63 68 65 50 61 67 65 52 65 66 63 6f  3PcachePageRefco
1e130 75 6e 74 28 70 50 67 29 3d 3d 31 20 29 7b 0a 20  unt(pPg)==1 ){. 
1e140 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63       sqlite3Pcac
1e150 68 65 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 20  heDrop(pPg);.   
1e160 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 33   }else{.      u3
1e170 32 20 69 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20  2 iFrame = 0;.  
1e180 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1e190 57 61 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61  WalFindFrame(pPa
1e1a0 67 65 72 2d 3e 70 57 61 6c 2c 20 70 50 67 2d 3e  ger->pWal, pPg->
1e1b0 70 67 6e 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a  pgno, &iFrame);.
1e1c0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1e1d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1e1e0 20 20 20 72 63 20 3d 20 72 65 61 64 44 62 50 61     rc = readDbPa
1e1f0 67 65 28 70 50 67 2c 20 69 46 72 61 6d 65 29 3b  ge(pPg, iFrame);
1e200 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1e210 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1e220 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
1e230 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50  er->xReiniter(pP
1e240 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
1e250 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
1e260 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 67 29 3b  refNotNull(pPg);
1e270 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1e280 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 20   Normally, if a 
1e290 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
1e2a0 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6e 79 20  olled back, any 
1e2b0 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73  backup processes
1e2c0 20 61 72 65 0a 20 20 2a 2a 20 75 70 64 61 74 65   are.  ** update
1e2d0 64 20 61 73 20 64 61 74 61 20 69 73 20 63 6f 70  d as data is cop
1e2e0 69 65 64 20 6f 75 74 20 6f 66 20 74 68 65 20 72  ied out of the r
1e2f0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
1e300 61 6e 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a  and into the.  *
1e310 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 69 73  * database. This
1e320 20 69 73 20 6e 6f 74 20 67 65 6e 65 72 61 6c 6c   is not generall
1e330 79 20 70 6f 73 73 69 62 6c 65 20 77 69 74 68 20  y possible with 
1e340 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 2c 20  a WAL database, 
1e350 61 73 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b  as.  ** rollback
1e360 20 69 6e 76 6f 6c 76 65 73 20 73 69 6d 70 6c 79   involves simply
1e370 20 74 72 75 6e 63 61 74 69 6e 67 20 74 68 65 20   truncating the 
1e380 6c 6f 67 20 66 69 6c 65 2e 20 54 68 65 72 65 66  log file. Theref
1e390 6f 72 65 2c 20 69 66 20 6f 6e 65 0a 20 20 2a 2a  ore, if one.  **
1e3a0 20 6f 72 20 6d 6f 72 65 20 66 72 61 6d 65 73 20   or more frames 
1e3b0 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
1e3c0 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
1e3d0 20 6c 6f 67 20 28 61 6e 64 20 74 68 65 72 65 66   log (and theref
1e3e0 6f 72 65 20 0a 20 20 2a 2a 20 61 6c 73 6f 20 63  ore .  ** also c
1e3f0 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62  opied into the b
1e400 61 63 6b 75 70 20 64 61 74 61 62 61 73 65 73 29  ackup databases)
1e410 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 69 73   as part of this
1e420 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 20 20   transaction,.  
1e430 2a 2a 20 74 68 65 20 62 61 63 6b 75 70 73 20 6d  ** the backups m
1e440 75 73 74 20 62 65 20 72 65 73 74 61 72 74 65 64  ust be restarted
1e450 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
1e460 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 70 50  BackupRestart(pP
1e470 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a  ager->pBackup);.
1e480 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1e490 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1e4a0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
1e4b0 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61  o rollback a tra
1e4c0 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 61 20 57 41  nsaction on a WA
1e4d0 4c 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73  L database..*/.s
1e4e0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 52  tatic int pagerR
1e4f0 6f 6c 6c 62 61 63 6b 57 61 6c 28 50 61 67 65 72  ollbackWal(Pager
1e500 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
1e510 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1e520 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e530 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20  Return Code */. 
1e540 20 50 67 48 64 72 20 2a 70 4c 69 73 74 3b 20 20   PgHdr *pList;  
1e550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e560 20 2f 2a 20 4c 69 73 74 20 6f 66 20 64 69 72 74   /* List of dirt
1e570 79 20 70 61 67 65 73 20 74 6f 20 72 65 76 65 72  y pages to rever
1e580 74 20 2a 2f 0a 0a 20 20 2f 2a 20 46 6f 72 20 61  t */..  /* For a
1e590 6c 6c 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  ll pages in the 
1e5a0 63 61 63 68 65 20 74 68 61 74 20 61 72 65 20 63  cache that are c
1e5b0 75 72 72 65 6e 74 6c 79 20 64 69 72 74 79 20 6f  urrently dirty o
1e5c0 72 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20  r have already. 
1e5d0 20 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e   ** been written
1e5e0 20 28 62 75 74 20 6e 6f 74 20 63 6f 6d 6d 69 74   (but not commit
1e5f0 74 65 64 29 20 74 6f 20 74 68 65 20 6c 6f 67 20  ted) to the log 
1e600 66 69 6c 65 2c 20 64 6f 20 6f 6e 65 20 6f 66 20  file, do one of 
1e610 74 68 65 20 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77  the .  ** follow
1e620 69 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ing:.  **.  **  
1e630 20 2b 20 44 69 73 63 61 72 64 20 74 68 65 20 63   + Discard the c
1e640 61 63 68 65 64 20 70 61 67 65 20 28 69 66 20 72  ached page (if r
1e650 65 66 63 6f 75 6e 74 3d 3d 30 29 2c 20 6f 72 0a  efcount==0), or.
1e660 20 20 2a 2a 20 20 20 2b 20 52 65 6c 6f 61 64 20    **   + Reload 
1e670 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f  page content fro
1e680 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28  m the database (
1e690 69 66 20 72 65 66 63 6f 75 6e 74 3e 30 29 2e 0a  if refcount>0)..
1e6a0 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64    */.  pPager->d
1e6b0 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
1e6c0 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72 63  dbOrigSize;.  rc
1e6d0 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 55 6e 64   = sqlite3WalUnd
1e6e0 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  o(pPager->pWal, 
1e6f0 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63  pagerUndoCallbac
1e700 6b 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65  k, (void *)pPage
1e710 72 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73 71  r);.  pList = sq
1e720 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79  lite3PcacheDirty
1e730 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43  List(pPager->pPC
1e740 61 63 68 65 29 3b 0a 20 20 77 68 69 6c 65 28 20  ache);.  while( 
1e750 70 4c 69 73 74 20 26 26 20 72 63 3d 3d 53 51 4c  pList && rc==SQL
1e760 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 67  ITE_OK ){.    Pg
1e770 48 64 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c 69  Hdr *pNext = pLi
1e780 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20  st->pDirty;.    
1e790 72 63 20 3d 20 70 61 67 65 72 55 6e 64 6f 43 61  rc = pagerUndoCa
1e7a0 6c 6c 62 61 63 6b 28 28 76 6f 69 64 20 2a 29 70  llback((void *)p
1e7b0 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67  Pager, pList->pg
1e7c0 6e 6f 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d  no);.    pList =
1e7d0 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 72   pNext;.  }..  r
1e7e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1e7f0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1e800 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72   is a wrapper ar
1e810 6f 75 6e 64 20 73 71 6c 69 74 65 33 57 61 6c 46  ound sqlite3WalF
1e820 72 61 6d 65 73 28 29 2e 20 41 73 20 77 65 6c 6c  rames(). As well
1e830 20 61 73 20 6c 6f 67 67 69 6e 67 0a 2a 2a 20 74   as logging.** t
1e840 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
1e850 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73  he list of pages
1e860 20 68 65 61 64 65 64 20 62 79 20 70 4c 69 73 74   headed by pList
1e870 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70   (connected by p
1e880 44 69 72 74 79 29 2c 0a 2a 2a 20 74 68 69 73 20  Dirty),.** this 
1e890 66 75 6e 63 74 69 6f 6e 20 6e 6f 74 69 66 69 65  function notifie
1e8a0 73 20 61 6e 79 20 61 63 74 69 76 65 20 62 61 63  s any active bac
1e8b0 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 74 68  kup processes th
1e8c0 61 74 20 74 68 65 20 70 61 67 65 73 20 68 61 76  at the pages hav
1e8d0 65 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 20 0a 2a  e.** changed. .*
1e8e0 2a 0a 2a 2a 20 54 68 65 20 6c 69 73 74 20 6f 66  *.** The list of
1e8f0 20 70 61 67 65 73 20 70 61 73 73 65 64 20 69 6e   pages passed in
1e900 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
1e910 69 73 20 61 6c 77 61 79 73 20 73 6f 72 74 65 64  is always sorted
1e920 20 62 79 20 70 61 67 65 20 6e 75 6d 62 65 72 2e   by page number.
1e930 0a 2a 2a 20 48 65 6e 63 65 2c 20 69 66 20 70 61  .** Hence, if pa
1e940 67 65 20 31 20 61 70 70 65 61 72 73 20 61 6e 79  ge 1 appears any
1e950 77 68 65 72 65 20 6f 6e 20 74 68 65 20 6c 69 73  where on the lis
1e960 74 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 74 68  t, it will be th
1e970 65 20 66 69 72 73 74 20 70 61 67 65 2e 0a 2a 2f  e first page..*/
1e980 20 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67   .static int pag
1e990 65 72 57 61 6c 46 72 61 6d 65 73 28 0a 20 20 50  erWalFrames(.  P
1e9a0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
1e9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e9c0 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  * Pager object *
1e9d0 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74  /.  PgHdr *pList
1e9e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1e9f0 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66      /* List of f
1ea00 72 61 6d 65 73 20 74 6f 20 6c 6f 67 20 2a 2f 0a  rames to log */.
1ea10 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63 61 74 65    Pgno nTruncate
1ea20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1ea30 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69    /* Database si
1ea40 7a 65 20 61 66 74 65 72 20 74 68 69 73 20 63 6f  ze after this co
1ea50 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73  mmit */.  int is
1ea60 43 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 20 20  Commit          
1ea70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1ea80 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 63  e if this is a c
1ea90 6f 6d 6d 69 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ommit */.){.  in
1eaa0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1eab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1eac0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1ead0 20 20 69 6e 74 20 6e 4c 69 73 74 3b 20 20 20 20    int nList;    
1eae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eaf0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
1eb00 61 67 65 73 20 69 6e 20 70 4c 69 73 74 20 2a 2f  ages in pList */
1eb10 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
1eb20 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65  ITE_DEBUG) || de
1eb30 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 48 45  fined(SQLITE_CHE
1eb40 43 4b 5f 50 41 47 45 53 29 0a 20 20 50 67 48 64  CK_PAGES).  PgHd
1eb50 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  r *p;           
1eb60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1eb70 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
1eb80 70 61 67 65 73 20 2a 2f 0a 23 65 6e 64 69 66 0a  pages */.#endif.
1eb90 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1eba0 72 2d 3e 70 57 61 6c 20 29 3b 0a 20 20 61 73 73  r->pWal );.  ass
1ebb0 65 72 74 28 20 70 4c 69 73 74 20 29 3b 0a 23 69  ert( pList );.#i
1ebc0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1ebd0 47 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68  G.  /* Verify th
1ebe0 61 74 20 74 68 65 20 70 61 67 65 20 6c 69 73 74  at the page list
1ebf0 20 69 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67   is in accending
1ec00 20 6f 72 64 65 72 20 2a 2f 0a 20 20 66 6f 72 28   order */.  for(
1ec10 70 3d 70 4c 69 73 74 3b 20 70 20 26 26 20 70 2d  p=pList; p && p-
1ec20 3e 70 44 69 72 74 79 3b 20 70 3d 70 2d 3e 70 44  >pDirty; p=p->pD
1ec30 69 72 74 79 29 7b 0a 20 20 20 20 61 73 73 65 72  irty){.    asser
1ec40 74 28 20 70 2d 3e 70 67 6e 6f 20 3c 20 70 2d 3e  t( p->pgno < p->
1ec50 70 44 69 72 74 79 2d 3e 70 67 6e 6f 20 29 3b 0a  pDirty->pgno );.
1ec60 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73    }.#endif..  as
1ec70 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 70 44 69  sert( pList->pDi
1ec80 72 74 79 3d 3d 30 20 7c 7c 20 69 73 43 6f 6d 6d  rty==0 || isComm
1ec90 69 74 20 29 3b 0a 20 20 69 66 28 20 69 73 43 6f  it );.  if( isCo
1eca0 6d 6d 69 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49  mmit ){.    /* I
1ecb0 66 20 61 20 57 41 4c 20 74 72 61 6e 73 61 63 74  f a WAL transact
1ecc0 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 6f 6d  ion is being com
1ecd0 6d 69 74 74 65 64 2c 20 74 68 65 72 65 20 69 73  mitted, there is
1ece0 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 77 72 69   no point in wri
1ecf0 74 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 79 20  ting.    ** any 
1ed00 70 61 67 65 73 20 77 69 74 68 20 70 61 67 65 20  pages with page 
1ed10 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 20  numbers greater 
1ed20 74 68 61 6e 20 6e 54 72 75 6e 63 61 74 65 20 69  than nTruncate i
1ed30 6e 74 6f 20 74 68 65 20 57 41 4c 20 66 69 6c 65  nto the WAL file
1ed40 2e 0a 20 20 20 20 2a 2a 20 54 68 65 79 20 77 69  ..    ** They wi
1ed50 6c 6c 20 6e 65 76 65 72 20 62 65 20 72 65 61 64  ll never be read
1ed60 20 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2e 20   by any client. 
1ed70 53 6f 20 72 65 6d 6f 76 65 20 74 68 65 6d 20 66  So remove them f
1ed80 72 6f 6d 20 74 68 65 20 70 44 69 72 74 79 0a 20  rom the pDirty. 
1ed90 20 20 20 2a 2a 20 6c 69 73 74 20 68 65 72 65 2e     ** list here.
1eda0 20 2a 2f 0a 20 20 20 20 50 67 48 64 72 20 2a 70   */.    PgHdr *p
1edb0 3b 0a 20 20 20 20 50 67 48 64 72 20 2a 2a 70 70  ;.    PgHdr **pp
1edc0 4e 65 78 74 20 3d 20 26 70 4c 69 73 74 3b 0a 20  Next = &pList;. 
1edd0 20 20 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20     nList = 0;.  
1ede0 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 28    for(p=pList; (
1edf0 2a 70 70 4e 65 78 74 20 3d 20 70 29 21 3d 30 3b  *ppNext = p)!=0;
1ee00 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20   p=p->pDirty){. 
1ee10 20 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f       if( p->pgno
1ee20 3c 3d 6e 54 72 75 6e 63 61 74 65 20 29 7b 0a 20  <=nTruncate ){. 
1ee30 20 20 20 20 20 20 20 70 70 4e 65 78 74 20 3d 20         ppNext = 
1ee40 26 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20  &p->pDirty;.    
1ee50 20 20 20 20 6e 4c 69 73 74 2b 2b 3b 0a 20 20 20      nList++;.   
1ee60 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
1ee70 73 73 65 72 74 28 20 70 4c 69 73 74 20 29 3b 0a  ssert( pList );.
1ee80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c 69    }else{.    nLi
1ee90 73 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 50  st = 1;.  }.  pP
1eea0 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45  ager->aStat[PAGE
1eeb0 52 5f 53 54 41 54 5f 57 52 49 54 45 5d 20 2b 3d  R_STAT_WRITE] +=
1eec0 20 6e 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70   nList;..  if( p
1eed0 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20  List->pgno==1 ) 
1eee0 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e  pager_write_chan
1eef0 67 65 63 6f 75 6e 74 65 72 28 70 4c 69 73 74 29  gecounter(pList)
1ef00 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1ef10 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72  WalFrames(pPager
1ef20 2d 3e 70 57 61 6c 2c 20 0a 20 20 20 20 20 20 70  ->pWal, .      p
1ef30 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
1ef40 20 70 4c 69 73 74 2c 20 6e 54 72 75 6e 63 61 74   pList, nTruncat
1ef50 65 2c 20 69 73 43 6f 6d 6d 69 74 2c 20 70 50 61  e, isCommit, pPa
1ef60 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67  ger->walSyncFlag
1ef70 73 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d  s.  );.  if( rc=
1ef80 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
1ef90 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b  ager->pBackup ){
1efa0 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a 20  .    PgHdr *p;. 
1efb0 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20     for(p=pList; 
1efc0 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b  p; p=p->pDirty){
1efd0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61  .      sqlite3Ba
1efe0 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65  ckupUpdate(pPage
1eff0 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 2d 3e 70  r->pBackup, p->p
1f000 67 6e 6f 2c 20 28 75 38 20 2a 29 70 2d 3e 70 44  gno, (u8 *)p->pD
1f010 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ata);.    }.  }.
1f020 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
1f030 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 70 4c 69  HECK_PAGES.  pLi
1f040 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  st = sqlite3Pcac
1f050 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67  heDirtyList(pPag
1f060 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
1f070 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20  for(p=pList; p; 
1f080 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20  p=p->pDirty){.  
1f090 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65    pager_set_page
1f0a0 68 61 73 68 28 70 29 3b 0a 20 20 7d 0a 23 65 6e  hash(p);.  }.#en
1f0b0 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  dif..  return rc
1f0c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e  ;.}../*.** Begin
1f0d0 20 61 20 72 65 61 64 20 74 72 61 6e 73 61 63 74   a read transact
1f0e0 69 6f 6e 20 6f 6e 20 74 68 65 20 57 41 4c 2e 0a  ion on the WAL..
1f0f0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1f100 6e 65 20 75 73 65 64 20 74 6f 20 62 65 20 63 61  ne used to be ca
1f110 6c 6c 65 64 20 22 70 61 67 65 72 4f 70 65 6e 53  lled "pagerOpenS
1f120 6e 61 70 73 68 6f 74 28 29 22 20 62 65 63 61 75  napshot()" becau
1f130 73 65 20 69 74 20 65 73 73 65 6e 74 69 61 6c 6c  se it essentiall
1f140 79 0a 2a 2a 20 6d 61 6b 65 73 20 61 20 73 6e 61  y.** makes a sna
1f150 70 73 68 6f 74 20 6f 66 20 74 68 65 20 64 61 74  pshot of the dat
1f160 61 62 61 73 65 20 61 74 20 74 68 65 20 63 75 72  abase at the cur
1f170 72 65 6e 74 20 70 6f 69 6e 74 20 69 6e 20 74 69  rent point in ti
1f180 6d 65 20 61 6e 64 20 70 72 65 73 65 72 76 65 73  me and preserves
1f190 0a 2a 2a 20 74 68 61 74 20 73 6e 61 70 73 68 6f  .** that snapsho
1f1a0 74 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 65  t for use by the
1f1b0 20 72 65 61 64 65 72 20 69 6e 20 73 70 69 74 65   reader in spite
1f1c0 20 6f 66 20 63 6f 6e 63 75 72 72 65 6e 74 6c 79   of concurrently
1f1d0 20 63 68 61 6e 67 65 73 20 62 79 0a 2a 2a 20 6f   changes by.** o
1f1e0 74 68 65 72 20 77 72 69 74 65 72 73 20 6f 72 20  ther writers or 
1f1f0 63 68 65 63 6b 70 6f 69 6e 74 65 72 73 2e 0a 2a  checkpointers..*
1f200 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1f210 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73  erBeginReadTrans
1f220 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50  action(Pager *pP
1f230 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
1f240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f250 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1f260 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
1f270 20 63 68 61 6e 67 65 64 20 3d 20 30 3b 20 20 20   changed = 0;   
1f280 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f290 54 72 75 65 20 69 66 20 63 61 63 68 65 20 6d 75  True if cache mu
1f2a0 73 74 20 62 65 20 72 65 73 65 74 20 2a 2f 0a 0a  st be reset */..
1f2b0 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55    assert( pagerU
1f2c0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
1f2d0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1f2e0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
1f2f0 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d  _OPEN || pPager-
1f300 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
1f310 45 41 44 45 52 20 29 3b 0a 0a 20 20 2f 2a 20 73  EADER );..  /* s
1f320 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64  qlite3WalEndRead
1f330 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 20 77 61  Transaction() wa
1f340 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 66 6f 72  s not called for
1f350 20 74 68 65 20 70 72 65 76 69 6f 75 73 0a 20 20   the previous.  
1f360 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
1f370 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45  n locking_mode=E
1f380 58 43 4c 55 53 49 56 45 2e 20 20 53 6f 20 63 61  XCLUSIVE.  So ca
1f390 6c 6c 20 69 74 20 6e 6f 77 2e 20 20 49 66 20 77  ll it now.  If w
1f3a0 65 0a 20 20 2a 2a 20 61 72 65 20 69 6e 20 6c 6f  e.  ** are in lo
1f3b0 63 6b 69 6e 67 5f 6d 6f 64 65 3d 4e 4f 52 4d 41  cking_mode=NORMA
1f3c0 4c 20 61 6e 64 20 45 6e 64 52 65 61 64 28 29 20  L and EndRead() 
1f3d0 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 63  was previously c
1f3e0 61 6c 6c 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20  alled,.  ** the 
1f3f0 64 75 70 6c 69 63 61 74 65 20 63 61 6c 6c 20 69  duplicate call i
1f400 73 20 68 61 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f  s harmless..  */
1f410 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64  .  sqlite3WalEnd
1f420 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  ReadTransaction(
1f430 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a  pPager->pWal);..
1f440 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
1f450 6c 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61  lBeginReadTransa
1f460 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57  ction(pPager->pW
1f470 61 6c 2c 20 26 63 68 61 6e 67 65 64 29 3b 0a 20  al, &changed);. 
1f480 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1f490 4f 4b 20 7c 7c 20 63 68 61 6e 67 65 64 20 29 7b  OK || changed ){
1f4a0 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74  .    pager_reset
1f4b0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
1f4c0 28 20 55 53 45 46 45 54 43 48 28 70 50 61 67 65  ( USEFETCH(pPage
1f4d0 72 29 20 29 20 73 71 6c 69 74 65 33 4f 73 55 6e  r) ) sqlite3OsUn
1f4e0 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64  fetch(pPager->fd
1f4f0 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  , 0, 0);.  }..  
1f500 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
1f510 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
1f520 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1f530 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ed as part of th
1f540 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f  e transition fro
1f550 6d 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20  m PAGER_OPEN.** 
1f560 74 6f 20 50 41 47 45 52 5f 52 45 41 44 45 52 20  to PAGER_READER 
1f570 73 74 61 74 65 20 74 6f 20 64 65 74 65 72 6d 69  state to determi
1f580 6e 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  ne the size of t
1f590 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1f5a0 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20 28 61 73  .** in pages (as
1f5b0 73 75 6d 69 6e 67 20 74 68 65 20 70 61 67 65 20  suming the page 
1f5c0 73 69 7a 65 20 63 75 72 72 65 6e 74 6c 79 20 73  size currently s
1f5d0 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e 70  tored in Pager.p
1f5e0 61 67 65 53 69 7a 65 29 2e 0a 2a 2a 0a 2a 2a 20  ageSize)..**.** 
1f5f0 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  If no error occu
1f600 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  rs, SQLITE_OK is
1f610 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
1f620 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
1f630 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 70 61 67  tabase.** in pag
1f640 65 73 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  es is stored in 
1f650 2a 70 6e 50 61 67 65 2e 20 4f 74 68 65 72 77 69  *pnPage. Otherwi
1f660 73 65 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  se, an error cod
1f670 65 20 28 70 65 72 68 61 70 73 0a 2a 2a 20 53 51  e (perhaps.** SQ
1f680 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
1f690 29 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  ) is returned an
1f6a0 64 20 2a 70 6e 50 61 67 65 20 69 73 20 6c 65 66  d *pnPage is lef
1f6b0 74 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f  t unmodified..*/
1f6c0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1f6d0 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72  rPagecount(Pager
1f6e0 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 2a   *pPager, Pgno *
1f6f0 70 6e 50 61 67 65 29 7b 0a 20 20 50 67 6e 6f 20  pnPage){.  Pgno 
1f700 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
1f710 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
1f720 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 76 69  lue to return vi
1f730 61 20 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a 20 20  a *pnPage */..  
1f740 2f 2a 20 51 75 65 72 79 20 74 68 65 20 57 41 4c  /* Query the WAL
1f750 20 73 75 62 2d 73 79 73 74 65 6d 20 66 6f 72 20   sub-system for 
1f760 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
1f770 65 2e 20 54 68 65 20 57 61 6c 44 62 73 69 7a 65  e. The WalDbsize
1f780 28 29 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  ().  ** function
1f790 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 20 69 66   returns zero if
1f7a0 20 74 68 65 20 57 41 4c 20 69 73 20 6e 6f 74 20   the WAL is not 
1f7b0 6f 70 65 6e 20 28 69 2e 65 2e 20 50 61 67 65 72  open (i.e. Pager
1f7c0 2e 70 57 61 6c 3d 3d 30 29 2c 20 6f 72 0a 20 20  .pWal==0), or.  
1f7d0 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ** if the databa
1f7e0 73 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 61  se size is not a
1f7f0 76 61 69 6c 61 62 6c 65 2e 20 54 68 65 20 64 61  vailable. The da
1f800 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 20 6e  tabase size is n
1f810 6f 74 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c  ot.  ** availabl
1f820 65 20 66 72 6f 6d 20 74 68 65 20 57 41 4c 20 73  e from the WAL s
1f830 75 62 2d 73 79 73 74 65 6d 20 69 66 20 74 68 65  ub-system if the
1f840 20 6c 6f 67 20 66 69 6c 65 20 69 73 20 65 6d 70   log file is emp
1f850 74 79 20 6f 72 0a 20 20 2a 2a 20 63 6f 6e 74 61  ty or.  ** conta
1f860 69 6e 73 20 6e 6f 20 76 61 6c 69 64 20 63 6f 6d  ins no valid com
1f870 6d 69 74 74 65 64 20 74 72 61 6e 73 61 63 74 69  mitted transacti
1f880 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ons..  */.  asse
1f890 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
1f8a0 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te==PAGER_OPEN )
1f8b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1f8c0 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45  er->eLock>=SHARE
1f8d0 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 6e 50 61 67  D_LOCK );.  nPag
1f8e0 65 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 44 62  e = sqlite3WalDb
1f8f0 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 57 61  size(pPager->pWa
1f900 6c 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  l);..  /* If the
1f910 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 77   database size w
1f920 61 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  as not available
1f930 20 66 72 6f 6d 20 74 68 65 20 57 41 4c 20 73 75   from the WAL su
1f940 62 2d 73 79 73 74 65 6d 2c 0a 20 20 2a 2a 20 64  b-system,.  ** d
1f950 65 74 65 72 6d 69 6e 65 20 69 74 20 62 61 73 65  etermine it base
1f960 64 20 6f 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  d on the size of
1f970 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1f980 6c 65 2e 20 49 66 20 74 68 65 20 73 69 7a 65 0a  le. If the size.
1f990 20 20 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61    ** of the data
1f9a0 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74  base file is not
1f9b0 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74   an integer mult
1f9c0 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65  iple of the page
1f9d0 2d 73 69 7a 65 2c 0a 20 20 2a 2a 20 72 6f 75 6e  -size,.  ** roun
1f9e0 64 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6e 65  d down to the ne
1f9f0 61 72 65 73 74 20 70 61 67 65 2e 20 45 78 63 65  arest page. Exce
1fa00 70 74 2c 20 61 6e 79 20 66 69 6c 65 20 6c 61 72  pt, any file lar
1fa10 67 65 72 20 74 68 61 6e 20 30 0a 20 20 2a 2a 20  ger than 0.  ** 
1fa20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 20 69 73  bytes in size is
1fa30 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 63   considered to c
1fa40 6f 6e 74 61 69 6e 20 61 74 20 6c 65 61 73 74 20  ontain at least 
1fa50 6f 6e 65 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20  one page..  */. 
1fa60 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b   if( nPage==0 ){
1fa70 0a 20 20 20 20 69 36 34 20 6e 20 3d 20 30 3b 20  .    i64 n = 0; 
1fa80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa90 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 62     /* Size of db
1faa0 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a   file in bytes *
1fab0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  /.    assert( is
1fac0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
1fad0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
1fae0 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66 28 20  File );.    if( 
1faf0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
1fb00 64 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  d) ){.      int 
1fb10 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
1fb20 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  leSize(pPager->f
1fb30 64 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 69 66  d, &n);.      if
1fb40 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1fb50 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1fb60 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
1fb70 20 20 7d 0a 20 20 20 20 6e 50 61 67 65 20 3d 20    }.    nPage = 
1fb80 28 50 67 6e 6f 29 28 28 6e 2b 70 50 61 67 65 72  (Pgno)((n+pPager
1fb90 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 20 2f 20  ->pageSize-1) / 
1fba0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1fbb0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
1fbc0 74 68 65 20 63 75 72 72 65 6e 74 20 6e 75 6d 62  the current numb
1fbd0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
1fbe0 68 65 20 66 69 6c 65 20 69 73 20 67 72 65 61 74  he file is great
1fbf0 65 72 20 74 68 61 6e 20 74 68 65 0a 20 20 2a 2a  er than the.  **
1fc00 20 63 6f 6e 66 69 67 75 72 65 64 20 6d 61 78 69   configured maxi
1fc10 6d 75 6d 20 70 61 67 65 72 20 6e 75 6d 62 65 72  mum pager number
1fc20 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 61  , increase the a
1fc30 6c 6c 6f 77 65 64 20 6c 69 6d 69 74 20 73 6f 0a  llowed limit so.
1fc40 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 66 69    ** that the fi
1fc50 6c 65 20 63 61 6e 20 62 65 20 72 65 61 64 2e 0a  le can be read..
1fc60 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65    */.  if( nPage
1fc70 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20  >pPager->mxPgno 
1fc80 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  ){.    pPager->m
1fc90 78 50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e 50  xPgno = (Pgno)nP
1fca0 61 67 65 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6e 50  age;.  }..  *pnP
1fcb0 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72  age = nPage;.  r
1fcc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1fcd0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
1fce0 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a  TE_OMIT_WAL./*.*
1fcf0 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 2a  * Check if the *
1fd00 2d 77 61 6c 20 66 69 6c 65 20 74 68 61 74 20 63  -wal file that c
1fd10 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68  orresponds to th
1fd20 65 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65  e database opene
1fd30 64 20 62 79 20 70 50 61 67 65 72 0a 2a 2a 20 65  d by pPager.** e
1fd40 78 69 73 74 73 20 69 66 20 74 68 65 20 64 61 74  xists if the dat
1fd50 61 62 61 73 65 20 69 73 20 6e 6f 74 20 65 6d 70  abase is not emp
1fd60 79 2c 20 6f 72 20 76 65 72 69 66 79 20 74 68 61  y, or verify tha
1fd70 74 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65  t the *-wal file
1fd80 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 69   does.** not exi
1fd90 73 74 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20  st (by deleting 
1fda0 69 74 29 20 69 66 20 74 68 65 20 64 61 74 61 62  it) if the datab
1fdb0 61 73 65 20 66 69 6c 65 20 69 73 20 65 6d 70 74  ase file is empt
1fdc0 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  y..**.** If the 
1fdd0 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  database is not 
1fde0 65 6d 70 74 79 20 61 6e 64 20 74 68 65 20 2a 2d  empty and the *-
1fdf0 77 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c  wal file exists,
1fe00 20 6f 70 65 6e 20 74 68 65 20 70 61 67 65 72 0a   open the pager.
1fe10 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20  ** in WAL mode. 
1fe20 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
1fe30 20 69 73 20 65 6d 70 74 79 20 6f 72 20 69 66 20   is empty or if 
1fe40 6e 6f 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78  no *-wal file ex
1fe50 69 73 74 73 20 61 6e 64 0a 2a 2a 20 69 66 20 6e  ists and.** if n
1fe60 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
1fe70 6d 61 6b 65 20 73 75 72 65 20 50 61 67 65 72 2e  make sure Pager.
1fe80 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 20 6e  journalMode is n
1fe90 6f 74 20 73 65 74 20 74 6f 0a 2a 2a 20 50 41 47  ot set to.** PAG
1fea0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
1feb0 41 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  AL..**.** Return
1fec0 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 61 6e   SQLITE_OK or an
1fed0 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a   error code..**.
1fee0 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
1fef0 73 74 20 68 6f 6c 64 20 61 20 53 48 41 52 45 44  st hold a SHARED
1ff00 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
1ff10 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 61  abase file to ca
1ff20 6c 6c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  ll this.** funct
1ff30 69 6f 6e 2e 20 42 65 63 61 75 73 65 20 61 6e 20  ion. Because an 
1ff40 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
1ff50 6e 20 74 68 65 20 64 62 20 66 69 6c 65 20 69 73  n the db file is
1ff60 20 72 65 71 75 69 72 65 64 20 74 6f 20 64 65 6c   required to del
1ff70 65 74 65 20 0a 2a 2a 20 61 20 57 41 4c 20 6f 6e  ete .** a WAL on
1ff80 20 61 20 6e 6f 6e 65 2d 65 6d 70 74 79 20 64 61   a none-empty da
1ff90 74 61 62 61 73 65 2c 20 74 68 69 73 20 65 6e 73  tabase, this ens
1ffa0 75 72 65 73 20 74 68 65 72 65 20 69 73 20 6e 6f  ures there is no
1ffb0 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20   race condition 
1ffc0 0a 2a 2a 20 62 65 74 77 65 65 6e 20 74 68 65 20  .** between the 
1ffd0 78 41 63 63 65 73 73 28 29 20 62 65 6c 6f 77 20  xAccess() below 
1ffe0 61 6e 64 20 61 6e 20 78 44 65 6c 65 74 65 28 29  and an xDelete()
1fff0 20 62 65 69 6e 67 20 65 78 65 63 75 74 65 64 20   being executed 
20000 62 79 20 73 6f 6d 65 20 0a 2a 2a 20 6f 74 68 65  by some .** othe
20010 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  r connection..*/
20020 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
20030 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e  rOpenWalIfPresen
20040 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
20050 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
20060 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
20070 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
20080 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  ==PAGER_OPEN );.
20090 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
200a0 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f  ->eLock>=SHARED_
200b0 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 21  LOCK );..  if( !
200c0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
200d0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 73 57 61   ){.    int isWa
200e0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
200f0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
20100 20 57 41 4c 20 66 69 6c 65 20 65 78 69 73 74 73   WAL file exists
20110 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61   */.    Pgno nPa
20120 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
20130 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
20140 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
20150 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 63 20 3d 20  le */..    rc = 
20160 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
20170 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
20180 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
20190 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20  urn rc;.    if( 
201a0 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nPage==0 ){.    
201b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
201c0 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70  Delete(pPager->p
201d0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61  Vfs, pPager->zWa
201e0 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  l, 0);.      if(
201f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
20200 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 20 29  R_DELETE_NOENT )
20210 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
20220 0a 20 20 20 20 20 20 69 73 57 61 6c 20 3d 20 30  .      isWal = 0
20230 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
20240 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
20250 73 41 63 63 65 73 73 28 0a 20 20 20 20 20 20 20  sAccess(.       
20260 20 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2c     pPager->pVfs,
20270 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 53   pPager->zWal, S
20280 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
20290 53 54 53 2c 20 26 69 73 57 61 6c 0a 20 20 20 20  STS, &isWal.    
202a0 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69    );.    }.    i
202b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
202c0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73   ){.      if( is
202d0 57 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 74  Wal ){.        t
202e0 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33  estcase( sqlite3
202f0 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28  PcachePagecount(
20300 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
20310 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  ==0 );.        r
20320 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
20330 4f 70 65 6e 57 61 6c 28 70 50 61 67 65 72 2c 20  OpenWal(pPager, 
20340 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  0);.      }else 
20350 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
20360 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
20370 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29  OURNALMODE_WAL )
20380 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
20390 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20  ->journalMode = 
203a0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
203b0 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 20 20  E_DELETE;.      
203c0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
203d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
203e0 66 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63  f../*.** Playbac
203f0 6b 20 73 61 76 65 70 6f 69 6e 74 20 70 53 61 76  k savepoint pSav
20400 65 70 6f 69 6e 74 2e 20 4f 72 2c 20 69 66 20 70  epoint. Or, if p
20410 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c  Savepoint==NULL,
20420 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 0a 2a   then playback.*
20430 2a 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73  * the entire mas
20440 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
20450 2e 20 54 68 65 20 63 61 73 65 20 70 53 61 76 65  . The case pSave
20460 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75  point==NULL occu
20470 72 73 20 77 68 65 6e 20 0a 2a 2a 20 61 20 52 4f  rs when .** a RO
20480 4c 4c 42 41 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e  LLBACK TO comman
20490 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20  d is invoked on 
204a0 61 20 53 41 56 45 50 4f 49 4e 54 20 74 68 61 74  a SAVEPOINT that
204b0 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f   is a transactio
204c0 6e 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e  n .** savepoint.
204d0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 53 61 76  .**.** When pSav
204e0 65 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 4e 55  epoint is not NU
204f0 4c 4c 20 28 6d 65 61 6e 69 6e 67 20 61 20 6e 6f  LL (meaning a no
20500 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61  n-transaction sa
20510 76 65 70 6f 69 6e 74 20 69 73 20 0a 2a 2a 20 62  vepoint is .** b
20520 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
20530 29 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c  ), then the roll
20540 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66  back consists of
20550 20 75 70 20 74 6f 20 74 68 72 65 65 20 73 74 61   up to three sta
20560 67 65 73 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d 65  ges,.** performe
20570 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 73  d in the order s
20580 70 65 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20  pecified:.**.** 
20590 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 70 6c    * Pages are pl
205a0 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74  ayed back from t
205b0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
205c0 73 74 61 72 74 69 6e 67 20 61 74 20 62 79 74 65  starting at byte
205d0 0a 2a 2a 20 20 20 20 20 6f 66 66 73 65 74 20 50  .**     offset P
205e0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f  agerSavepoint.iO
205f0 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e  ffset and contin
20600 75 69 6e 67 20 74 6f 20 0a 2a 2a 20 20 20 20 20  uing to .**     
20610 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
20620 48 64 72 4f 66 66 73 65 74 2c 20 6f 72 20 74 6f  HdrOffset, or to
20630 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
20640 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  main journal.** 
20650 20 20 20 20 66 69 6c 65 20 69 66 20 50 61 67 65      file if Page
20660 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
20670 66 66 73 65 74 20 69 73 20 7a 65 72 6f 2e 0a 2a  ffset is zero..*
20680 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 50 61 67 65  *.**   * If Page
20690 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
206a0 66 66 73 65 74 20 69 73 20 6e 6f 74 20 7a 65 72  ffset is not zer
206b0 6f 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61 72  o, then pages ar
206c0 65 20 70 6c 61 79 65 64 0a 2a 2a 20 20 20 20 20  e played.**     
206d0 62 61 63 6b 20 73 74 61 72 74 69 6e 67 20 66 72  back starting fr
206e0 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  om the journal h
206f0 65 61 64 65 72 20 69 6d 6d 65 64 69 61 74 65 6c  eader immediatel
20700 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20  y following .** 
20710 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
20720 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 74 6f  nt.iHdrOffset to
20730 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
20740 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  main journal fil
20750 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67  e..**.**   * Pag
20760 65 73 20 61 72 65 20 74 68 65 6e 20 70 6c 61 79  es are then play
20770 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  ed back from the
20780 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   sub-journal fil
20790 65 2c 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 20  e, starting.**  
207a0 20 20 20 77 69 74 68 20 74 68 65 20 50 61 67 65     with the Page
207b0 72 53 61 76 65 70 6f 69 6e 74 2e 69 53 75 62 52  rSavepoint.iSubR
207c0 65 63 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e  ec and continuin
207d0 67 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 0a  g to the end of.
207e0 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e  **     the journ
207f0 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  al file..**.** T
20800 68 72 6f 75 67 68 6f 75 74 20 74 68 65 20 72 6f  hroughout the ro
20810 6c 6c 62 61 63 6b 20 70 72 6f 63 65 73 73 2c 20  llback process, 
20820 65 61 63 68 20 74 69 6d 65 20 61 20 70 61 67 65  each time a page
20830 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c   is rolled back,
20840 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f   the.** correspo
20850 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73 65 74  nding bit is set
20860 20 69 6e 20 61 20 62 69 74 76 65 63 20 73 74 72   in a bitvec str
20870 75 63 74 75 72 65 20 28 76 61 72 69 61 62 6c 65  ucture (variable
20880 20 70 44 6f 6e 65 20 69 6e 20 74 68 65 0a 2a 2a   pDone in the.**
20890 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
208a0 62 65 6c 6f 77 29 2e 20 54 68 69 73 20 69 73 20  below). This is 
208b0 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74  used to ensure t
208c0 68 61 74 20 61 20 70 61 67 65 20 69 73 20 6f 6e  hat a page is on
208d0 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63  ly.** rolled bac
208e0 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  k the first time
208f0 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72   it is encounter
20900 65 64 20 69 6e 20 65 69 74 68 65 72 20 6a 6f 75  ed in either jou
20910 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  rnal..**.** If p
20920 53 61 76 65 70 6f 69 6e 74 20 69 73 20 4e 55 4c  Savepoint is NUL
20930 4c 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61 72  L, then pages ar
20940 65 20 6f 6e 6c 79 20 70 6c 61 79 65 64 20 62 61  e only played ba
20950 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ck from the main
20960 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
20970 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  . There is no ne
20980 65 64 20 66 6f 72 20 61 20 62 69 74 76 65 63 20  ed for a bitvec 
20990 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
209a0 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61  .** In either ca
209b0 73 65 2c 20 62 65 66 6f 72 65 20 70 6c 61 79 62  se, before playb
209c0 61 63 6b 20 63 6f 6d 6d 65 6e 63 65 73 20 74 68  ack commences th
209d0 65 20 50 61 67 65 72 2e 64 62 53 69 7a 65 20 76  e Pager.dbSize v
209e0 61 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20 72 65  ariable.** is re
209f0 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
20a00 20 74 68 61 74 20 69 74 20 68 65 6c 64 20 61 74   that it held at
20a10 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
20a20 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20  e savepoint .** 
20a30 28 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  (or transaction)
20a40 2e 20 4e 6f 20 70 61 67 65 20 77 69 74 68 20 61  . No page with a
20a50 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 67 72 65   page-number gre
20a60 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 20 76  ater than this v
20a70 61 6c 75 65 0a 2a 2a 20 69 73 20 70 6c 61 79 65  alue.** is playe
20a80 64 20 62 61 63 6b 2e 20 49 66 20 6f 6e 65 20 69  d back. If one i
20a90 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74  s encountered it
20aa0 20 69 73 20 73 69 6d 70 6c 79 20 73 6b 69 70 70   is simply skipp
20ab0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
20ac0 74 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53  t pagerPlaybackS
20ad0 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a  avepoint(Pager *
20ae0 70 50 61 67 65 72 2c 20 50 61 67 65 72 53 61 76  pPager, PagerSav
20af0 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69  epoint *pSavepoi
20b00 6e 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  nt){.  i64 szJ; 
20b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b20 2f 2a 20 45 66 66 65 63 74 69 76 65 20 73 69 7a  /* Effective siz
20b30 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  e of the main jo
20b40 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69  urnal */.  i64 i
20b50 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20  HdrOff;         
20b60 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66 69      /* End of fi
20b70 72 73 74 20 73 65 67 6d 65 6e 74 20 6f 66 20 6d  rst segment of m
20b80 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  ain-journal reco
20b90 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  rds */.  int rc 
20ba0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
20bb0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
20bc0 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44   */.  Bitvec *pD
20bd0 6f 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  one = 0;       /
20be0 2a 20 42 69 74 76 65 63 20 74 6f 20 65 6e 73 75  * Bitvec to ensu
20bf0 72 65 20 70 61 67 65 73 20 70 6c 61 79 65 64 20  re pages played 
20c00 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a  back only once *
20c10 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
20c20 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
20c30 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73  ER_ERROR );.  as
20c40 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
20c50 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
20c60 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 0a 20 20  ER_LOCKED );..  
20c70 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 62 69  /* Allocate a bi
20c80 74 76 65 63 20 74 6f 20 75 73 65 20 74 6f 20 73  tvec to use to s
20c90 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66 20  tore the set of 
20ca0 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63  pages rolled bac
20cb0 6b 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65  k */.  if( pSave
20cc0 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 70 44 6f  point ){.    pDo
20cd0 6e 65 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  ne = sqlite3Bitv
20ce0 65 63 43 72 65 61 74 65 28 70 53 61 76 65 70 6f  ecCreate(pSavepo
20cf0 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20 20  int->nOrig);.   
20d00 20 69 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a 20   if( !pDone ){. 
20d10 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
20d20 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
20d30 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68    }..  /* Set th
20d40 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
20d50 62 61 63 6b 20 74 6f 20 74 68 65 20 76 61 6c 75  back to the valu
20d60 65 20 69 74 20 77 61 73 20 62 65 66 6f 72 65 20  e it was before 
20d70 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 20  the savepoint . 
20d80 20 2a 2a 20 62 65 69 6e 67 20 72 65 76 65 72 74   ** being revert
20d90 65 64 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 20  ed was opened.. 
20da0 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62   */.  pPager->db
20db0 53 69 7a 65 20 3d 20 70 53 61 76 65 70 6f 69 6e  Size = pSavepoin
20dc0 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  t ? pSavepoint->
20dd0 6e 4f 72 69 67 20 3a 20 70 50 61 67 65 72 2d 3e  nOrig : pPager->
20de0 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 70 50  dbOrigSize;.  pP
20df0 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
20e00 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e  tDone = pPager->
20e10 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28  tempFile;..  if(
20e20 20 21 70 53 61 76 65 70 6f 69 6e 74 20 26 26 20   !pSavepoint && 
20e30 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
20e40 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  er) ){.    retur
20e50 6e 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57  n pagerRollbackW
20e60 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  al(pPager);.  }.
20e70 0a 20 20 2f 2a 20 55 73 65 20 70 50 61 67 65 72  .  /* Use pPager
20e80 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 61 73 20  ->journalOff as 
20e90 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73 69  the effective si
20ea0 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 72  ze of the main r
20eb0 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75  ollback.  ** jou
20ec0 72 6e 61 6c 2e 20 20 54 68 65 20 61 63 74 75 61  rnal.  The actua
20ed0 6c 20 66 69 6c 65 20 6d 69 67 68 74 20 62 65 20  l file might be 
20ee0 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73  larger than this
20ef0 20 69 6e 0a 20 20 2a 2a 20 50 41 47 45 52 5f 4a   in.  ** PAGER_J
20f00 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
20f10 41 54 45 20 6f 72 20 50 41 47 45 52 5f 4a 4f 55  ATE or PAGER_JOU
20f20 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
20f30 2e 20 20 42 75 74 20 61 6e 79 74 68 69 6e 67 0a  .  But anything.
20f40 20 20 2a 2a 20 70 61 73 74 20 70 50 61 67 65 72    ** past pPager
20f50 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20  ->journalOff is 
20f60 6f 66 66 2d 6c 69 6d 69 74 73 20 74 6f 20 75 73  off-limits to us
20f70 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70  ..  */.  szJ = p
20f80 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
20f90 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 61 67  f;.  assert( pag
20fa0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
20fb0 3d 3d 30 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 3b  ==0 || szJ==0 );
20fc0 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20  ..  /* Begin by 
20fd0 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63  rolling back rec
20fe0 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6d 61  ords from the ma
20ff0 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74  in journal start
21000 69 6e 67 20 61 74 0a 20 20 2a 2a 20 50 61 67 65  ing at.  ** Page
21010 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73  rSavepoint.iOffs
21020 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e  et and continuin
21030 67 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6a 6f  g to the next jo
21040 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20  urnal header..  
21050 2a 2a 20 54 68 65 72 65 20 6d 69 67 68 74 20 62  ** There might b
21060 65 20 72 65 63 6f 72 64 73 20 69 6e 20 74 68 65  e records in the
21070 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 74 68   main journal th
21080 61 74 20 68 61 76 65 20 61 20 70 61 67 65 20 6e  at have a page n
21090 75 6d 62 65 72 0a 20 20 2a 2a 20 67 72 65 61 74  umber.  ** great
210a0 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  er than the curr
210b0 65 6e 74 20 64 61 74 61 62 61 73 65 20 73 69 7a  ent database siz
210c0 65 20 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  e (pPager->dbSiz
210d0 65 29 20 62 75 74 20 74 68 6f 73 65 0a 20 20 2a  e) but those.  *
210e0 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65  * will be skippe
210f0 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e  d automatically.
21100 20 20 50 61 67 65 73 20 61 72 65 20 61 64 64 65    Pages are adde
21110 64 20 74 6f 20 70 44 6f 6e 65 20 61 73 20 74 68  d to pDone as th
21120 65 79 0a 20 20 2a 2a 20 61 72 65 20 70 6c 61 79  ey.  ** are play
21130 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20  ed back..  */.  
21140 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 26  if( pSavepoint &
21150 26 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  & !pagerUseWal(p
21160 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 69 48  Pager) ){.    iH
21170 64 72 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69  drOff = pSavepoi
21180 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3f  nt->iHdrOffset ?
21190 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64   pSavepoint->iHd
211a0 72 4f 66 66 73 65 74 20 3a 20 73 7a 4a 3b 0a 20  rOffset : szJ;. 
211b0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
211c0 61 6c 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69  alOff = pSavepoi
211d0 6e 74 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20  nt->iOffset;.   
211e0 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
211f0 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
21200 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69 48 64 72  >journalOff<iHdr
21210 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Off ){.      rc 
21220 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
21230 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
21240 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  , &pPager->journ
21250 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c  alOff, pDone, 1,
21260 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   1);.    }.    a
21270 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
21280 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 65 6c 73  E_DONE );.  }els
21290 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  e{.    pPager->j
212a0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
212b0 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 74 69 6e 75   }..  /* Continu
212c0 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72  e rolling back r
212d0 65 63 6f 72 64 73 20 6f 75 74 20 6f 66 20 74 68  ecords out of th
212e0 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73  e main journal s
212f0 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20  tarting at.  ** 
21300 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
21310 6c 20 68 65 61 64 65 72 20 73 65 65 6e 20 61 6e  l header seen an
21320 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 75 6e 74  d continuing unt
21330 69 6c 20 74 68 65 20 65 66 66 65 63 74 69 76 65  il the effective
21340 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65   end.  ** of the
21350 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   main journal fi
21360 6c 65 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f  le.  Continue to
21370 20 73 6b 69 70 20 6f 75 74 2d 6f 66 2d 72 61 6e   skip out-of-ran
21380 67 65 20 70 61 67 65 73 20 61 6e 64 0a 20 20 2a  ge pages and.  *
21390 2a 20 63 6f 6e 74 69 6e 75 65 20 61 64 64 69 6e  * continue addin
213a0 67 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62  g pages rolled b
213b0 61 63 6b 20 74 6f 20 70 44 6f 6e 65 2e 0a 20 20  ack to pDone..  
213c0 2a 2f 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  */.  while( rc==
213d0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
213e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c  ger->journalOff<
213f0 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 69  szJ ){.    u32 i
21400 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
21410 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
21420 0a 20 20 20 20 75 33 32 20 6e 4a 52 65 63 20 3d  .    u32 nJRec =
21430 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65   0;     /* Numbe
21440 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63  r of Journal Rec
21450 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75 33 32 20  ords */.    u32 
21460 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20  dummy;.    rc = 
21470 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70  readJournalHdr(p
21480 50 61 67 65 72 2c 20 30 2c 20 73 7a 4a 2c 20 26  Pager, 0, szJ, &
21490 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a  nJRec, &dummy);.
214a0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
214b0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 0a  SQLITE_DONE );..
214c0 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68      /*.    ** Th
214d0 65 20 22 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  e "pPager->journ
214e0 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alHdr+JOURNAL_HD
214f0 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50  R_SZ(pPager)==pP
21500 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
21510 22 0a 20 20 20 20 2a 2a 20 74 65 73 74 20 69 73  ".    ** test is
21520 20 72 65 6c 61 74 65 64 20 74 6f 20 74 69 63 6b   related to tick
21530 65 74 20 23 32 35 36 35 2e 20 20 53 65 65 20 74  et #2565.  See t
21540 68 65 20 64 69 73 63 75 73 73 69 6f 6e 20 69 6e  he discussion in
21550 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65   the.    ** page
21560 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 66 75 6e  r_playback() fun
21570 63 74 69 6f 6e 20 66 6f 72 20 61 64 64 69 74 69  ction for additi
21580 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
21590 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
215a0 20 6e 4a 52 65 63 3d 3d 30 20 0a 20 20 20 20 20   nJRec==0 .     
215b0 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
215c0 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alHdr+JOURNAL_HD
215d0 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50  R_SZ(pPager)==pP
215e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
215f0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 6e 4a  .    ){.      nJ
21600 52 65 63 20 3d 20 28 75 33 32 29 28 28 73 7a 4a  Rec = (u32)((szJ
21610 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   - pPager->journ
21620 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e 41 4c 5f 50  alOff)/JOURNAL_P
21630 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20  G_SZ(pPager));. 
21640 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d     }.    for(ii=
21650 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
21660 20 26 26 20 69 69 3c 6e 4a 52 65 63 20 26 26 20   && ii<nJRec && 
21670 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
21680 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29 7b 0a 20  ff<szJ; ii++){. 
21690 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
216a0 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
216b0 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65  e(pPager, &pPage
216c0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70  r->journalOff, p
216d0 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20  Done, 1, 1);.   
216e0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72   }.    assert( r
216f0 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
21700 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
21710 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
21720 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
21730 4f 66 66 3e 3d 73 7a 4a 20 29 3b 0a 0a 20 20 2f  Off>=szJ );..  /
21740 2a 20 46 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c 6c  * Finally,  roll
21750 62 61 63 6b 20 70 61 67 65 73 20 66 72 6f 6d 20  back pages from 
21760 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  the sub-journal.
21770 20 20 50 61 67 65 20 74 68 61 74 20 77 65 72 65    Page that were
21780 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79  .  ** previously
21790 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 75 74   rolled back out
217a0 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
217b0 72 6e 61 6c 20 28 61 6e 64 20 61 72 65 20 68 65  rnal (and are he
217c0 6e 63 65 20 69 6e 20 70 44 6f 6e 65 29 0a 20 20  nce in pDone).  
217d0 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70  ** will be skipp
217e0 65 64 2e 20 20 4f 75 74 2d 6f 66 2d 72 61 6e 67  ed.  Out-of-rang
217f0 65 20 70 61 67 65 73 20 61 72 65 20 61 6c 73 6f  e pages are also
21800 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20   skipped..  */. 
21810 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20   if( pSavepoint 
21820 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20  ){.    u32 ii;  
21830 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
21840 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
21850 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28 69   i64 offset = (i
21860 36 34 29 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69  64)pSavepoint->i
21870 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72  SubRec*(4+pPager
21880 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20  ->pageSize);..  
21890 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
218a0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
218b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57     rc = sqlite3W
218c0 61 6c 53 61 76 65 70 6f 69 6e 74 55 6e 64 6f 28  alSavepointUndo(
218d0 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 53  pPager->pWal, pS
218e0 61 76 65 70 6f 69 6e 74 2d 3e 61 57 61 6c 44 61  avepoint->aWalDa
218f0 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ta);.    }.    f
21900 6f 72 28 69 69 3d 70 53 61 76 65 70 6f 69 6e 74  or(ii=pSavepoint
21910 2d 3e 69 53 75 62 52 65 63 3b 20 72 63 3d 3d 53  ->iSubRec; rc==S
21920 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 70  QLITE_OK && ii<p
21930 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3b 20  Pager->nSubRec; 
21940 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73  ii++){.      ass
21950 65 72 74 28 20 6f 66 66 73 65 74 3d 3d 28 69 36  ert( offset==(i6
21960 34 29 69 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e  4)ii*(4+pPager->
21970 70 61 67 65 53 69 7a 65 29 20 29 3b 0a 20 20 20  pageSize) );.   
21980 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
21990 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
219a0 70 50 61 67 65 72 2c 20 26 6f 66 66 73 65 74 2c  pPager, &offset,
219b0 20 70 44 6f 6e 65 2c 20 30 2c 20 31 29 3b 0a 20   pDone, 0, 1);. 
219c0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
219d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
219e0 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74   );.  }..  sqlit
219f0 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
21a00 70 44 6f 6e 65 29 3b 0a 20 20 69 66 28 20 72 63  pDone);.  if( rc
21a10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
21a20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
21a30 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d  alOff = szJ;.  }
21a40 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
21a50 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
21a60 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
21a70 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  r of in-memory p
21a80 61 67 65 73 20 74 68 61 74 20 61 72 65 20 61 6c  ages that are al
21a90 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  lowed..*/.void s
21aa0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61  qlite3PagerSetCa
21ab0 63 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70  chesize(Pager *p
21ac0 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67  Pager, int mxPag
21ad0 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  e){.  sqlite3Pca
21ae0 63 68 65 53 65 74 43 61 63 68 65 73 69 7a 65 28  cheSetCachesize(
21af0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
21b00 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a   mxPage);.}../*.
21b10 2a 2a 20 49 6e 76 6f 6b 65 20 53 51 4c 49 54 45  ** Invoke SQLITE
21b20 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45  _FCNTL_MMAP_SIZE
21b30 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 75   based on the cu
21b40 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 73  rrent value of s
21b50 7a 4d 6d 61 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  zMmap..*/.static
21b60 20 76 6f 69 64 20 70 61 67 65 72 46 69 78 4d 61   void pagerFixMa
21b70 70 6c 69 6d 69 74 28 50 61 67 65 72 20 2a 70 50  plimit(Pager *pP
21b80 61 67 65 72 29 7b 0a 23 69 66 20 53 51 4c 49 54  ager){.#if SQLIT
21b90 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
21ba0 30 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  0.  sqlite3_file
21bb0 20 2a 66 64 20 3d 20 70 50 61 67 65 72 2d 3e 66   *fd = pPager->f
21bc0 64 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28  d;.  if( isOpen(
21bd0 66 64 29 20 26 26 20 66 64 2d 3e 70 4d 65 74 68  fd) && fd->pMeth
21be0 6f 64 73 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 33  ods->iVersion>=3
21bf0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
21c00 69 6e 74 36 34 20 73 7a 3b 0a 20 20 20 20 73 7a  int64 sz;.    sz
21c10 20 3d 20 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61   = pPager->szMma
21c20 70 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 62  p;.    pPager->b
21c30 55 73 65 46 65 74 63 68 20 3d 20 28 73 7a 3e 30  UseFetch = (sz>0
21c40 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  );.    sqlite3Os
21c50 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28  FileControlHint(
21c60 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49  pPager->fd, SQLI
21c70 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49  TE_FCNTL_MMAP_SI
21c80 5a 45 2c 20 26 73 7a 29 3b 0a 20 20 7d 0a 23 65  ZE, &sz);.  }.#e
21c90 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  ndif.}../*.** Ch
21ca0 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  ange the maximum
21cb0 20 73 69 7a 65 20 6f 66 20 61 6e 79 20 6d 65 6d   size of any mem
21cc0 6f 72 79 20 6d 61 70 70 69 6e 67 20 6d 61 64 65  ory mapping made
21cd0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
21ce0 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73   file..*/.void s
21cf0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d  qlite3PagerSetMm
21d00 61 70 4c 69 6d 69 74 28 50 61 67 65 72 20 2a 70  apLimit(Pager *p
21d10 50 61 67 65 72 2c 20 73 71 6c 69 74 65 33 5f 69  Pager, sqlite3_i
21d20 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b 0a 20 20  nt64 szMmap){.  
21d30 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 20 3d  pPager->szMmap =
21d40 20 73 7a 4d 6d 61 70 3b 0a 20 20 70 61 67 65 72   szMmap;.  pager
21d50 46 69 78 4d 61 70 6c 69 6d 69 74 28 70 50 61 67  FixMaplimit(pPag
21d60 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  er);.}../*.** Fr
21d70 65 65 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72  ee as much memor
21d80 79 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66 72  y as possible fr
21d90 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f  om the pager..*/
21da0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
21db0 65 72 53 68 72 69 6e 6b 28 50 61 67 65 72 20 2a  erShrink(Pager *
21dc0 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74  pPager){.  sqlit
21dd0 65 33 50 63 61 63 68 65 53 68 72 69 6e 6b 28 70  e3PcacheShrink(p
21de0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
21df0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74  .}../*.** Adjust
21e00 20 73 65 74 74 69 6e 67 73 20 6f 66 20 74 68 65   settings of the
21e10 20 70 61 67 65 72 20 74 6f 20 74 68 6f 73 65 20   pager to those 
21e20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65  specified in the
21e30 20 70 67 46 6c 61 67 73 20 70 61 72 61 6d 65 74   pgFlags paramet
21e40 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 6c  er..**.** The "l
21e50 65 76 65 6c 22 20 69 6e 20 70 67 46 6c 61 67 73  evel" in pgFlags
21e60 20 26 20 50 41 47 45 52 5f 53 59 4e 43 48 52 4f   & PAGER_SYNCHRO
21e70 4e 4f 55 53 5f 4d 41 53 4b 20 73 65 74 73 20 74  NOUS_MASK sets t
21e80 68 65 20 72 6f 62 75 73 74 6e 65 73 73 0a 2a 2a  he robustness.**
21e90 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
21ea0 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74   to damage due t
21eb0 6f 20 4f 53 20 63 72 61 73 68 65 73 20 6f 72 20  o OS crashes or 
21ec0 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20 62  power failures b
21ed0 79 0a 2a 2a 20 63 68 61 6e 67 69 6e 67 20 74 68  y.** changing th
21ee0 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63  e number of sync
21ef0 73 28 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e  s()s when writin
21f00 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2e 0a  g the journals..
21f10 2a 2a 20 54 68 65 72 65 20 61 72 65 20 74 68 72  ** There are thr
21f20 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a  ee levels:.**.**
21f30 20 20 20 20 4f 46 46 20 20 20 20 20 20 20 73 71      OFF       sq
21f40 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73  lite3OsSync() is
21f50 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20   never called.  
21f60 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61  This is the defa
21f70 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ult.**          
21f80 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72      for temporar
21f90 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20  y and transient 
21fa0 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  files..**.**    
21fb0 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f  NORMAL    The jo
21fc0 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
21fd0 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69 74  once before writ
21fe0 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a  es begin on the.
21ff0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
22000 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20  database.  This 
22010 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71  is normally adeq
22020 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c  uate protection,
22030 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20   but.**         
22040 20 20 20 20 20 69 74 20 69 73 20 74 68 65 6f 72       it is theor
22050 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c  etically possibl
22060 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20 75  e, though very u
22070 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20  nlikely,.**     
22080 20 20 20 20 20 20 20 20 20 74 68 61 74 20 61 6e           that an
22090 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65   inopertune powe
220a0 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20  r failure could 
220b0 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61  leave the journa
220c0 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  l.**            
220d0 20 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 69    in a state whi
220e0 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64  ch would cause d
220f0 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  amage to the dat
22100 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  abase.**        
22110 20 20 20 20 20 20 77 68 65 6e 20 69 74 20 69 73        when it is
22120 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
22130 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20  .**    FULL     
22140 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
22150 73 79 6e 63 65 64 20 74 77 69 63 65 20 62 65 66  synced twice bef
22160 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e  ore writes begin
22170 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   on the.**      
22180 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
22190 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69   (with some addi
221a0 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
221b0 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69  on - the nRec fi
221c0 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  eld.**          
221d0 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e      of the journ
221e0 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e  al header - bein
221f0 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74  g written in bet
22200 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20  ween the two.** 
22210 20 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e               syn
22220 63 73 29 2e 20 20 49 66 20 77 65 20 61 73 73 75  cs).  If we assu
22230 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e 67 20  me that writing 
22240 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  a.**            
22250 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65    single disk se
22260 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20  ctor is atomic, 
22270 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70  then this mode p
22280 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20  rovides.**      
22290 20 20 20 20 20 20 20 20 61 73 73 75 72 61 6e 63          assuranc
222a0 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  e that the journ
222b0 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63  al will not be c
222c0 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a  orrupted to the.
222d0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
222e0 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67  point of causing
222f0 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64   damage to the d
22300 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20 72  atabase during r
22310 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ollback..**.** T
22320 68 65 20 61 62 6f 76 65 20 69 73 20 66 6f 72 20  he above is for 
22330 61 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e  a rollback-journ
22340 61 6c 20 6d 6f 64 65 2e 20 20 46 6f 72 20 57 41  al mode.  For WA
22350 4c 20 6d 6f 64 65 2c 20 4f 46 46 20 63 6f 6e 74  L mode, OFF cont
22360 69 6e 75 65 73 0a 2a 2a 20 74 6f 20 6d 65 61 6e  inues.** to mean
22370 20 74 68 61 74 20 6e 6f 20 73 79 6e 63 73 20 65   that no syncs e
22380 76 65 72 20 6f 63 63 75 72 2e 20 20 4e 4f 52 4d  ver occur.  NORM
22390 41 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  AL means that th
223a0 65 20 57 41 4c 20 69 73 20 73 79 6e 63 65 64 0a  e WAL is synced.
223b0 2a 2a 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ** prior to the 
223c0 73 74 61 72 74 20 6f 66 20 63 68 65 63 6b 70 6f  start of checkpo
223d0 69 6e 74 20 61 6e 64 20 74 68 61 74 20 74 68 65  int and that the
223e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
223f0 73 20 73 79 6e 63 65 64 0a 2a 2a 20 61 74 20 74  s synced.** at t
22400 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66  he conclusion of
22410 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20   the checkpoint 
22420 69 66 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f  if the entire co
22430 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 57 41 4c  ntent of the WAL
22440 0a 2a 2a 20 77 61 73 20 77 72 69 74 74 65 6e 20  .** was written 
22450 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61  back into the da
22460 74 61 62 61 73 65 2e 20 20 42 75 74 20 6e 6f 20  tabase.  But no 
22470 73 79 6e 63 20 6f 70 65 72 61 74 69 6f 6e 73 20  sync operations 
22480 6f 63 63 75 72 20 66 6f 72 0a 2a 2a 20 61 6e 20  occur for.** an 
22490 6f 72 64 69 6e 61 72 79 20 63 6f 6d 6d 69 74 20  ordinary commit 
224a0 69 6e 20 4e 4f 52 4d 41 4c 20 6d 6f 64 65 20 77  in NORMAL mode w
224b0 69 74 68 20 57 41 4c 2e 20 20 46 55 4c 4c 20 6d  ith WAL.  FULL m
224c0 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 57 41  eans that the WA
224d0 4c 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73 79 6e  L.** file is syn
224e0 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61  ced following ea
224f0 63 68 20 63 6f 6d 6d 69 74 20 6f 70 65 72 61 74  ch commit operat
22500 69 6f 6e 2c 20 69 6e 20 61 64 64 69 74 69 6f 6e  ion, in addition
22510 20 74 6f 20 74 68 65 0a 2a 2a 20 73 79 6e 63 73   to the.** syncs
22520 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
22530 20 4e 4f 52 4d 41 4c 2e 0a 2a 2a 0a 2a 2a 20 44   NORMAL..**.** D
22540 6f 20 6e 6f 74 20 63 6f 6e 66 75 73 65 20 73 79  o not confuse sy
22550 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 77  nchronous=FULL w
22560 69 74 68 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ith SQLITE_SYNC_
22570 46 55 4c 4c 2e 20 20 54 68 65 0a 2a 2a 20 53 51  FULL.  The.** SQ
22580 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 20 6d  LITE_SYNC_FULL m
22590 61 63 72 6f 20 6d 65 61 6e 73 20 74 6f 20 75 73  acro means to us
225a0 65 20 74 68 65 20 4d 61 63 4f 53 58 2d 73 74 79  e the MacOSX-sty
225b0 6c 65 20 66 75 6c 6c 2d 66 73 79 6e 63 0a 2a 2a  le full-fsync.**
225c0 20 75 73 69 6e 67 20 66 63 6e 74 6c 28 46 5f 46   using fcntl(F_F
225d0 55 4c 4c 46 53 59 4e 43 29 2e 20 20 53 51 4c 49  ULLFSYNC).  SQLI
225e0 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6d  TE_SYNC_NORMAL m
225f0 65 61 6e 73 20 74 6f 20 64 6f 20 61 6e 0a 2a 2a  eans to do an.**
22600 20 6f 72 64 69 6e 61 72 79 20 66 73 79 6e 63 28   ordinary fsync(
22610 29 20 63 61 6c 6c 2e 20 20 54 68 65 72 65 20 69  ) call.  There i
22620 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20  s no difference 
22630 62 65 74 77 65 65 6e 20 53 51 4c 49 54 45 5f 53  between SQLITE_S
22640 59 4e 43 5f 46 55 4c 4c 0a 2a 2a 20 61 6e 64 20  YNC_FULL.** and 
22650 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
22660 41 4c 20 6f 6e 20 70 6c 61 74 66 6f 72 6d 73 20  AL on platforms 
22670 6f 74 68 65 72 20 74 68 61 6e 20 4d 61 63 4f 53  other than MacOS
22680 58 2e 20 20 42 75 74 20 74 68 65 0a 2a 2a 20 73  X.  But the.** s
22690 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20  ynchronous=FULL 
226a0 76 65 72 73 75 73 20 73 79 6e 63 68 72 6f 6e 6f  versus synchrono
226b0 75 73 3d 4e 4f 52 4d 41 4c 20 73 65 74 74 69 6e  us=NORMAL settin
226c0 67 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65  g determines whe
226d0 6e 0a 2a 2a 20 74 68 65 20 78 53 79 6e 63 20 70  n.** the xSync p
226e0 72 69 6d 69 74 69 76 65 20 69 73 20 63 61 6c 6c  rimitive is call
226f0 65 64 20 61 6e 64 20 69 73 20 72 65 6c 65 76 61  ed and is releva
22700 6e 74 20 74 6f 20 61 6c 6c 20 70 6c 61 74 66 6f  nt to all platfo
22710 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72  rms..**.** Numer
22720 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69  ic values associ
22730 61 74 65 64 20 77 69 74 68 20 74 68 65 73 65 20  ated with these 
22740 73 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d  states are OFF==
22750 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20  1, NORMAL=2,.** 
22760 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23  and FULL=3..*/.#
22770 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
22780 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
22790 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
227a0 65 72 53 65 74 46 6c 61 67 73 28 0a 20 20 50 61  erSetFlags(.  Pa
227b0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
227c0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
227d0 20 74 6f 20 73 65 74 20 73 61 66 65 74 79 20 6c   to set safety l
227e0 65 76 65 6c 20 66 6f 72 20 2a 2f 0a 20 20 75 6e  evel for */.  un
227f0 73 69 67 6e 65 64 20 70 67 46 6c 61 67 73 20 20  signed pgFlags  
22800 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 66      /* Various f
22810 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73  lags */.){.  uns
22820 69 67 6e 65 64 20 6c 65 76 65 6c 20 3d 20 70 67  igned level = pg
22830 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f 53 59  Flags & PAGER_SY
22840 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b 3b 0a  NCHRONOUS_MASK;.
22850 20 20 61 73 73 65 72 74 28 20 6c 65 76 65 6c 3e    assert( level>
22860 3d 31 20 26 26 20 6c 65 76 65 6c 3c 3d 33 20 29  =1 && level<=3 )
22870 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  ;.  pPager->noSy
22880 6e 63 20 3d 20 20 28 6c 65 76 65 6c 3d 3d 31 20  nc =  (level==1 
22890 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
228a0 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61  ile) ?1:0;.  pPa
228b0 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20  ger->fullSync = 
228c0 28 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21 70 50  (level==3 && !pP
228d0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20  ager->tempFile) 
228e0 3f 31 3a 30 3b 0a 20 20 69 66 28 20 70 50 61 67  ?1:0;.  if( pPag
228f0 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
22900 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c    pPager->syncFl
22910 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  ags = 0;.    pPa
22920 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61  ger->ckptSyncFla
22930 67 73 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  gs = 0;.  }else 
22940 69 66 28 20 70 67 46 6c 61 67 73 20 26 20 50 41  if( pgFlags & PA
22950 47 45 52 5f 46 55 4c 4c 46 53 59 4e 43 20 29 7b  GER_FULLFSYNC ){
22960 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  .    pPager->syn
22970 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
22980 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 20 20 70  SYNC_FULL;.    p
22990 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46  Pager->ckptSyncF
229a0 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
229b0 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65  NC_FULL;.  }else
229c0 20 69 66 28 20 70 67 46 6c 61 67 73 20 26 20 50   if( pgFlags & P
229d0 41 47 45 52 5f 43 4b 50 54 5f 46 55 4c 4c 46 53  AGER_CKPT_FULLFS
229e0 59 4e 43 20 29 7b 0a 20 20 20 20 70 50 61 67 65  YNC ){.    pPage
229f0 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53  r->syncFlags = S
22a00 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
22a10 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  L;.    pPager->c
22a20 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53  kptSyncFlags = S
22a30 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b  QLITE_SYNC_FULL;
22a40 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
22a50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20  ager->syncFlags 
22a60 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  = SQLITE_SYNC_NO
22a70 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65 72  RMAL;.    pPager
22a80 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20  ->ckptSyncFlags 
22a90 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  = SQLITE_SYNC_NO
22aa0 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 70 50 61 67  RMAL;.  }.  pPag
22ab0 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73  er->walSyncFlags
22ac0 20 3d 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46   = pPager->syncF
22ad0 6c 61 67 73 3b 0a 20 20 69 66 28 20 70 50 61 67  lags;.  if( pPag
22ae0 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a  er->fullSync ){.
22af0 20 20 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53      pPager->walS
22b00 79 6e 63 46 6c 61 67 73 20 7c 3d 20 57 41 4c 5f  yncFlags |= WAL_
22b10 53 59 4e 43 5f 54 52 41 4e 53 41 43 54 49 4f 4e  SYNC_TRANSACTION
22b20 53 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 46  S;.  }.  if( pgF
22b30 6c 61 67 73 20 26 20 50 41 47 45 52 5f 43 41 43  lags & PAGER_CAC
22b40 48 45 53 50 49 4c 4c 20 29 7b 0a 20 20 20 20 70  HESPILL ){.    p
22b50 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
22b60 6c 20 26 3d 20 7e 53 50 49 4c 4c 46 4c 41 47 5f  l &= ~SPILLFLAG_
22b70 4f 46 46 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  OFF;.  }else{.  
22b80 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53    pPager->doNotS
22b90 70 69 6c 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c 41  pill |= SPILLFLA
22ba0 47 5f 4f 46 46 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  G_OFF;.  }.}.#en
22bb0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  dif../*.** The f
22bc0 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
22bd0 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72  variable is incr
22be0 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72  emented whenever
22bf0 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20   the library.** 
22c00 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e  attempts to open
22c10 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
22c20 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  e.  This informa
22c30 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72  tion is used for
22c40 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20  .** testing and 
22c50 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20  analysis only.  
22c60 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
22c70 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
22c80 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
22c90 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  t = 0;.#endif../
22ca0 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70  *.** Open a temp
22cb0 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  orary file..**.*
22cc0 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65  * Write the file
22cd0 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f   descriptor into
22ce0 20 2a 70 46 69 6c 65 2e 20 52 65 74 75 72 6e 20   *pFile. Return 
22cf0 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
22d00 63 65 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65  cess .** or some
22d10 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64   other error cod
22d20 65 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68  e if we fail. Th
22d30 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61  e OS will automa
22d40 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65  tically .** dele
22d50 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  te the temporary
22d60 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73   file when it is
22d70 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   closed..**.** T
22d80 68 65 20 66 6c 61 67 73 20 70 61 73 73 65 64 20  he flags passed 
22d90 74 6f 20 74 68 65 20 56 46 53 20 6c 61 79 65 72  to the VFS layer
22da0 20 78 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61 72   xOpen() call ar
22db0 65 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65  e those specifie
22dc0 64 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65 74 65  d.** by paramete
22dd0 72 20 76 66 73 46 6c 61 67 73 20 4f 52 65 64 20  r vfsFlags ORed 
22de0 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69  with the followi
22df0 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51  ng:.**.**     SQ
22e00 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
22e10 49 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  ITE.**     SQLIT
22e20 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a  E_OPEN_CREATE.**
22e30 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
22e40 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20  _EXCLUSIVE.**   
22e50 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45    SQLITE_OPEN_DE
22e60 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73  LETEONCLOSE.*/.s
22e70 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f  tatic int pagerO
22e80 70 65 6e 74 65 6d 70 28 0a 20 20 50 61 67 65 72  pentemp(.  Pager
22e90 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
22ea0 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 62   /* The pager ob
22eb0 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ject */.  sqlite
22ec0 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  3_file *pFile,  
22ed0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c  /* Write the fil
22ee0 65 20 64 65 73 63 72 69 70 74 6f 72 20 68 65 72  e descriptor her
22ef0 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c  e */.  int vfsFl
22f00 61 67 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ags          /* 
22f10 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  Flags passed thr
22f20 6f 75 67 68 20 74 6f 20 74 68 65 20 56 46 53 20  ough to the VFS 
22f30 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
22f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22f50 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
22f60 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
22f70 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70  EST.  sqlite3_op
22f80 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20  entemp_count++; 
22f90 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73   /* Used for tes
22fa0 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
22fb0 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66  s only */.#endif
22fc0 0a 0a 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20  ..  vfsFlags |= 
22fd0 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41   .#if SQLITE_ENA
22fe0 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45 43 54  BLE_DATA_PROTECT
22ff0 49 4f 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ION.            
23000 28 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67  (pPager->vfsFlag
23010 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 49  s&SQLITE_OPEN_FI
23020 4c 45 50 52 4f 54 45 43 54 49 4f 4e 5f 4d 41 53  LEPROTECTION_MAS
23030 4b 29 7c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  K)|.#endif.     
23040 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
23050 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53  EN_READWRITE | S
23060 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
23070 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  E |.            
23080 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
23090 55 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f  USIVE | SQLITE_O
230a0 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
230b0 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  E;.  rc = sqlite
230c0 33 4f 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  3OsOpen(pPager->
230d0 70 56 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c 20  pVfs, 0, pFile, 
230e0 76 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20  vfsFlags, 0);.  
230f0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
23100 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28  TE_OK || isOpen(
23110 70 46 69 6c 65 29 20 29 3b 0a 20 20 72 65 74 75  pFile) );.  retu
23120 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
23130 53 65 74 20 74 68 65 20 62 75 73 79 20 68 61 6e  Set the busy han
23140 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  dler function..*
23150 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69  *.** The pager i
23160 6e 76 6f 6b 65 73 20 74 68 65 20 62 75 73 79 2d  nvokes the busy-
23170 68 61 6e 64 6c 65 72 20 69 66 20 73 71 6c 69 74  handler if sqlit
23180 65 33 4f 73 4c 6f 63 6b 28 29 20 72 65 74 75 72  e3OsLock() retur
23190 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55  ns .** SQLITE_BU
231a0 53 59 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74  SY when trying t
231b0 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 6e  o upgrade from n
231c0 6f 2d 6c 6f 63 6b 20 74 6f 20 61 20 53 48 41 52  o-lock to a SHAR
231d0 45 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72 20 77  ED lock,.** or w
231e0 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70  hen trying to up
231f0 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53  grade from a RES
23200 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61 6e  ERVED lock to an
23210 20 45 58 43 4c 55 53 49 56 45 20 0a 2a 2a 20 6c   EXCLUSIVE .** l
23220 6f 63 6b 2e 20 49 74 20 64 6f 65 73 20 2a 6e 6f  ock. It does *no
23230 74 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75  t* invoke the bu
23240 73 79 20 68 61 6e 64 6c 65 72 20 77 68 65 6e 20  sy handler when 
23250 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 0a 2a  upgrading from.*
23260 2a 20 53 48 41 52 45 44 20 74 6f 20 52 45 53 45  * SHARED to RESE
23270 52 56 45 44 2c 20 6f 72 20 77 68 65 6e 20 75 70  RVED, or when up
23280 67 72 61 64 69 6e 67 20 66 72 6f 6d 20 53 48 41  grading from SHA
23290 52 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45  RED to EXCLUSIVE
232a0 0a 2a 2a 20 28 77 68 69 63 68 20 6f 63 63 75 72  .** (which occur
232b0 73 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75  s during hot-jou
232c0 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 20  rnal rollback). 
232d0 53 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a 20 20  Summary:.**.**  
232e0 20 54 72 61 6e 73 69 74 69 6f 6e 20 20 20 20 20   Transition     
232f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23300 20 20 20 7c 20 49 6e 76 6f 6b 65 73 20 78 42 75     | Invokes xBu
23310 73 79 48 61 6e 64 6c 65 72 0a 2a 2a 20 20 20 2d  syHandler.**   -
23320 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23330 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23340 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23350 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f  -------.**   NO_
23360 4c 4f 43 4b 20 20 20 20 20 20 20 2d 3e 20 53 48  LOCK       -> SH
23370 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 20 7c  ARED_LOCK      |
23380 20 59 65 73 0a 2a 2a 20 20 20 53 48 41 52 45 44   Yes.**   SHARED
23390 5f 4c 4f 43 4b 20 20 20 2d 3e 20 52 45 53 45 52  _LOCK   -> RESER
233a0 56 45 44 5f 4c 4f 43 4b 20 20 20 20 7c 20 4e 6f  VED_LOCK    | No
233b0 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43  .**   SHARED_LOC
233c0 4b 20 20 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  K   -> EXCLUSIVE
233d0 5f 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a 2a 20  _LOCK   | No.** 
233e0 20 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20    RESERVED_LOCK 
233f0 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  -> EXCLUSIVE_LOC
23400 4b 20 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a 2a 20  K   | Yes.**.** 
23410 49 66 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64  If the busy-hand
23420 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 72 65 74  ler callback ret
23430 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  urns non-zero, t
23440 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 72  he lock is .** r
23450 65 74 72 69 65 64 2e 20 49 66 20 69 74 20 72 65  etried. If it re
23460 74 75 72 6e 73 20 7a 65 72 6f 2c 20 74 68 65 6e  turns zero, then
23470 20 74 68 65 20 53 51 4c 49 54 45 5f 42 55 53 59   the SQLITE_BUSY
23480 20 65 72 72 6f 72 20 69 73 0a 2a 2a 20 72 65 74   error is.** ret
23490 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
234a0 6c 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 72  ler of the pager
234b0 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a   API function..*
234c0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
234d0 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65  gerSetBusyhandle
234e0 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  r(.  Pager *pPag
234f0 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
23500 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
23510 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  er object */.  i
23520 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65  nt (*xBusyHandle
23530 72 29 28 76 6f 69 64 20 2a 29 2c 20 20 20 20 20  r)(void *),     
23540 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
23550 6f 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 66  o busy-handler f
23560 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69  unction */.  voi
23570 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 41  d *pBusyHandlerA
23580 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rg              
23590 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f    /* Argument to
235a0 20 70 61 73 73 20 74 6f 20 78 42 75 73 79 48 61   pass to xBusyHa
235b0 6e 64 6c 65 72 20 2a 2f 0a 29 7b 0a 20 20 70 50  ndler */.){.  pP
235c0 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c  ager->xBusyHandl
235d0 65 72 20 3d 20 78 42 75 73 79 48 61 6e 64 6c 65  er = xBusyHandle
235e0 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75  r;.  pPager->pBu
235f0 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 70  syHandlerArg = p
23600 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b 0a  BusyHandlerArg;.
23610 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50  .  if( isOpen(pP
23620 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
23630 20 76 6f 69 64 20 2a 2a 61 70 20 3d 20 28 76 6f   void **ap = (vo
23640 69 64 20 2a 2a 29 26 70 50 61 67 65 72 2d 3e 78  id **)&pPager->x
23650 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 20  BusyHandler;.   
23660 20 61 73 73 65 72 74 28 20 28 28 69 6e 74 28 2a   assert( ((int(*
23670 29 28 76 6f 69 64 20 2a 29 29 28 61 70 5b 30 5d  )(void *))(ap[0]
23680 29 29 3d 3d 78 42 75 73 79 48 61 6e 64 6c 65 72  ))==xBusyHandler
23690 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
236a0 61 70 5b 31 5d 3d 3d 70 42 75 73 79 48 61 6e 64  ap[1]==pBusyHand
236b0 6c 65 72 41 72 67 20 29 3b 0a 20 20 20 20 73 71  lerArg );.    sq
236c0 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
236d0 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66  olHint(pPager->f
236e0 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  d, SQLITE_FCNTL_
236f0 42 55 53 59 48 41 4e 44 4c 45 52 2c 20 28 76 6f  BUSYHANDLER, (vo
23700 69 64 20 2a 29 61 70 29 3b 0a 20 20 7d 0a 7d 0a  id *)ap);.  }.}.
23710 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
23720 65 20 70 61 67 65 20 73 69 7a 65 20 75 73 65 64  e page size used
23730 20 62 79 20 74 68 65 20 50 61 67 65 72 20 6f 62   by the Pager ob
23740 6a 65 63 74 2e 20 54 68 65 20 6e 65 77 20 70 61  ject. The new pa
23750 67 65 20 73 69 7a 65 20 0a 2a 2a 20 69 73 20 70  ge size .** is p
23760 61 73 73 65 64 20 69 6e 20 2a 70 50 61 67 65 53  assed in *pPageS
23770 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ize..**.** If th
23780 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68  e pager is in th
23790 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 77 68  e error state wh
237a0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
237b0 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 0a 2a   is called, it.*
237c0 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 54 68  * is a no-op. Th
237d0 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
237e0 20 69 73 20 74 68 65 20 65 72 72 6f 72 20 73 74   is the error st
237f0 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 28  ate error code (
23800 69 2e 65 2e 20 0a 2a 2a 20 6f 6e 65 20 6f 66 20  i.e. .** one of 
23810 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 61 6e  SQLITE_IOERR, an
23820 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 78 78   SQLITE_IOERR_xx
23830 78 20 73 75 62 2d 63 6f 64 65 20 6f 72 20 53 51  x sub-code or SQ
23840 4c 49 54 45 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a  LITE_FULL)..**.*
23850 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
23860 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
23870 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a  wing are true:.*
23880 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6e 65 77  *.**   * the new
23890 20 70 61 67 65 20 73 69 7a 65 20 28 76 61 6c 75   page size (valu
238a0 65 20 6f 66 20 2a 70 50 61 67 65 53 69 7a 65 29  e of *pPageSize)
238b0 20 69 73 20 76 61 6c 69 64 20 28 61 20 70 6f 77   is valid (a pow
238c0 65 72 20 0a 2a 2a 20 20 20 20 20 6f 66 20 74 77  er .**     of tw
238d0 6f 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e  o between 512 an
238e0 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  d SQLITE_MAX_PAG
238f0 45 5f 53 49 5a 45 2c 20 69 6e 63 6c 75 73 69 76  E_SIZE, inclusiv
23900 65 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20  e), and.**.**   
23910 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f  * there are no o
23920 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20  utstanding page 
23930 72 65 66 65 72 65 6e 63 65 73 2c 20 61 6e 64 0a  references, and.
23940 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 61  **.**   * the da
23950 74 61 62 61 73 65 20 69 73 20 65 69 74 68 65 72  tabase is either
23960 20 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   not an in-memor
23970 79 20 64 61 74 61 62 61 73 65 20 6f 72 20 69 74  y database or it
23980 20 69 73 0a 2a 2a 20 20 20 20 20 61 6e 20 69 6e   is.**     an in
23990 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
239a0 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20   that currently 
239b0 63 6f 6e 73 69 73 74 73 20 6f 66 20 7a 65 72 6f  consists of zero
239c0 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 74 68   pages..**.** th
239d0 65 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a  en the pager obj
239e0 65 63 74 20 70 61 67 65 20 73 69 7a 65 20 69 73  ect page size is
239f0 20 73 65 74 20 74 6f 20 2a 70 50 61 67 65 53 69   set to *pPageSi
23a00 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ze..**.** If the
23a10 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 63 68   page size is ch
23a20 61 6e 67 65 64 2c 20 74 68 65 6e 20 74 68 69 73  anged, then this
23a30 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 73 20 73   function uses s
23a40 71 6c 69 74 65 33 50 61 67 65 72 4d 61 6c 6c 6f  qlite3PagerMallo
23a50 63 28 29 20 0a 2a 2a 20 74 6f 20 6f 62 74 61 69  c() .** to obtai
23a60 6e 20 61 20 6e 65 77 20 50 61 67 65 72 2e 70 54  n a new Pager.pT
23a70 6d 70 53 70 61 63 65 20 62 75 66 66 65 72 2e 20  mpSpace buffer. 
23a80 49 66 20 74 68 69 73 20 61 6c 6c 6f 63 61 74 69  If this allocati
23a90 6f 6e 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 66  on attempt .** f
23aa0 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d  ails, SQLITE_NOM
23ab0 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  EM is returned a
23ac0 6e 64 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  nd the page size
23ad0 20 72 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67   remains unchang
23ae0 65 64 2e 20 0a 2a 2a 20 49 6e 20 61 6c 6c 20 6f  ed. .** In all o
23af0 74 68 65 72 20 63 61 73 65 73 2c 20 53 51 4c 49  ther cases, SQLI
23b00 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
23b10 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
23b20 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74  page size is not
23b30 20 63 68 61 6e 67 65 64 2c 20 65 69 74 68 65 72   changed, either
23b40 20 62 65 63 61 75 73 65 20 6f 6e 65 20 6f 66 20   because one of 
23b50 74 68 65 20 65 6e 75 6d 65 72 61 74 65 64 0a 2a  the enumerated.*
23b60 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f  * conditions abo
23b70 76 65 20 69 73 20 6e 6f 74 20 74 72 75 65 2c 20  ve is not true, 
23b80 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e  the pager was in
23b90 20 65 72 72 6f 72 20 73 74 61 74 65 20 77 68 65   error state whe
23ba0 6e 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  n this.** functi
23bb0 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 6f  on was called, o
23bc0 72 20 62 65 63 61 75 73 65 20 74 68 65 20 6d 65  r because the me
23bd0 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
23be0 61 74 74 65 6d 70 74 20 66 61 69 6c 65 64 2c 20  attempt failed, 
23bf0 0a 2a 2a 20 74 68 65 6e 20 2a 70 50 61 67 65 53  .** then *pPageS
23c00 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ize is set to th
23c10 65 20 6f 6c 64 2c 20 72 65 74 61 69 6e 65 64 20  e old, retained 
23c20 70 61 67 65 20 73 69 7a 65 20 62 65 66 6f 72 65  page size before
23c30 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69   returning..*/.i
23c40 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  nt sqlite3PagerS
23c50 65 74 50 61 67 65 73 69 7a 65 28 50 61 67 65 72  etPagesize(Pager
23c60 20 2a 70 50 61 67 65 72 2c 20 75 33 32 20 2a 70   *pPager, u32 *p
23c70 50 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52  PageSize, int nR
23c80 65 73 65 72 76 65 29 7b 0a 20 20 69 6e 74 20 72  eserve){.  int r
23c90 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
23ca0 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70    /* It is not p
23cb0 6f 73 73 69 62 6c 65 20 74 6f 20 64 6f 20 61 20  ossible to do a 
23cc0 66 75 6c 6c 20 61 73 73 65 72 74 5f 70 61 67 65  full assert_page
23cd0 72 5f 73 74 61 74 65 28 29 20 68 65 72 65 2c 20  r_state() here, 
23ce0 61 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e  as this.  ** fun
23cf0 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c  ction may be cal
23d00 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  led from within 
23d10 50 61 67 65 72 4f 70 65 6e 28 29 2c 20 62 65 66  PagerOpen(), bef
23d20 6f 72 65 20 74 68 65 20 73 74 61 74 65 0a 20 20  ore the state.  
23d30 2a 2a 20 6f 66 20 74 68 65 20 50 61 67 65 72 20  ** of the Pager 
23d40 6f 62 6a 65 63 74 20 69 73 20 69 6e 74 65 72 6e  object is intern
23d50 61 6c 6c 79 20 63 6f 6e 73 69 73 74 65 6e 74 2e  ally consistent.
23d60 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 74 20 6f 6e  .  **.  ** At on
23d70 65 20 70 6f 69 6e 74 20 74 68 69 73 20 66 75 6e  e point this fun
23d80 63 74 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 61  ction returned a
23d90 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65 20 70  n error if the p
23da0 61 67 65 72 20 77 61 73 20 69 6e 20 0a 20 20 2a  ager was in .  *
23db0 2a 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74  * PAGER_ERROR st
23dc0 61 74 65 2e 20 42 75 74 20 73 69 6e 63 65 20 50  ate. But since P
23dd0 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65  AGER_ERROR state
23de0 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74   guarantees that
23df0 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61  .  ** there is a
23e00 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73  t least one outs
23e10 74 61 6e 64 69 6e 67 20 70 61 67 65 20 72 65 66  tanding page ref
23e20 65 72 65 6e 63 65 2c 20 74 68 69 73 20 66 75 6e  erence, this fun
23e30 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 61 20  ction.  ** is a 
23e40 6e 6f 2d 6f 70 20 66 6f 72 20 74 68 61 74 20 63  no-op for that c
23e50 61 73 65 20 61 6e 79 68 6f 77 2e 0a 20 20 2a 2f  ase anyhow..  */
23e60 0a 0a 20 20 75 33 32 20 70 61 67 65 53 69 7a 65  ..  u32 pageSize
23e70 20 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a 20   = *pPageSize;. 
23e80 20 61 73 73 65 72 74 28 20 70 61 67 65 53 69 7a   assert( pageSiz
23e90 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53 69 7a  e==0 || (pageSiz
23ea0 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69  e>=512 && pageSi
23eb0 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ze<=SQLITE_MAX_P
23ec0 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20 69  AGE_SIZE) );.  i
23ed0 66 28 20 28 70 50 61 67 65 72 2d 3e 6d 65 6d 44  f( (pPager->memD
23ee0 62 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  b==0 || pPager->
23ef0 64 62 53 69 7a 65 3d 3d 30 29 0a 20 20 20 26 26  dbSize==0).   &&
23f00 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
23f10 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
23f20 50 43 61 63 68 65 29 3d 3d 30 20 0a 20 20 20 26  PCache)==0 .   &
23f30 26 20 70 61 67 65 53 69 7a 65 20 26 26 20 70 61  & pageSize && pa
23f40 67 65 53 69 7a 65 21 3d 28 75 33 32 29 70 50 61  geSize!=(u32)pPa
23f50 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a 20  ger->pageSize . 
23f60 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 4e   ){.    char *pN
23f70 65 77 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 20  ew = NULL;      
23f80 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 74 65         /* New te
23f90 6d 70 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20  mp space */.    
23fa0 69 36 34 20 6e 42 79 74 65 20 3d 20 30 3b 0a 0a  i64 nByte = 0;..
23fb0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
23fc0 65 53 74 61 74 65 3e 50 41 47 45 52 5f 4f 50 45  eState>PAGER_OPE
23fd0 4e 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67  N && isOpen(pPag
23fe0 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20  er->fd) ){.     
23ff0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
24000 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
24010 66 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20  fd, &nByte);.   
24020 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
24030 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
24040 20 20 70 4e 65 77 20 3d 20 28 63 68 61 72 20 2a    pNew = (char *
24050 29 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c  )sqlite3PageMall
24060 6f 63 28 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  oc(pageSize);.  
24070 20 20 20 20 69 66 28 20 21 70 4e 65 77 20 29 20      if( !pNew ) 
24080 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
24090 4d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  M;.    }..    if
240a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
240b0 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72  ){.      pager_r
240c0 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
240d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
240e0 50 63 61 63 68 65 53 65 74 50 61 67 65 53 69 7a  PcacheSetPageSiz
240f0 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
24100 65 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  e, pageSize);.  
24110 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
24120 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
24130 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72     sqlite3PageFr
24140 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  ee(pPager->pTmpS
24150 70 61 63 65 29 3b 0a 20 20 20 20 20 20 70 50 61  pace);.      pPa
24160 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  ger->pTmpSpace =
24170 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 70 50 61   pNew;.      pPa
24180 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 28 50  ger->dbSize = (P
24190 67 6e 6f 29 28 28 6e 42 79 74 65 2b 70 61 67 65  gno)((nByte+page
241a0 53 69 7a 65 2d 31 29 2f 70 61 67 65 53 69 7a 65  Size-1)/pageSize
241b0 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
241c0 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65  >pageSize = page
241d0 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Size;.    }else{
241e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
241f0 67 65 46 72 65 65 28 70 4e 65 77 29 3b 0a 20 20  geFree(pNew);.  
24200 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 61 67    }.  }..  *pPag
24210 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  eSize = pPager->
24220 70 61 67 65 53 69 7a 65 3b 0a 20 20 69 66 28 20  pageSize;.  if( 
24230 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
24240 0a 20 20 20 20 69 66 28 20 6e 52 65 73 65 72 76  .    if( nReserv
24250 65 3c 30 20 29 20 6e 52 65 73 65 72 76 65 20 3d  e<0 ) nReserve =
24260 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76   pPager->nReserv
24270 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  e;.    assert( n
24280 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52  Reserve>=0 && nR
24290 65 73 65 72 76 65 3c 31 30 30 30 20 29 3b 0a 20  eserve<1000 );. 
242a0 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65     pPager->nRese
242b0 72 76 65 20 3d 20 28 69 31 36 29 6e 52 65 73 65  rve = (i16)nRese
242c0 72 76 65 3b 0a 20 20 20 20 70 61 67 65 72 52 65  rve;.    pagerRe
242d0 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72 29  portSize(pPager)
242e0 3b 0a 20 20 20 20 70 61 67 65 72 46 69 78 4d 61  ;.    pagerFixMa
242f0 70 6c 69 6d 69 74 28 70 50 61 67 65 72 29 3b 0a  plimit(pPager);.
24300 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
24310 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
24320 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
24330 65 20 22 74 65 6d 70 6f 72 61 72 79 20 70 61 67  e "temporary pag
24340 65 22 20 62 75 66 66 65 72 20 68 65 6c 64 20 69  e" buffer held i
24350 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20  nternally.** by 
24360 74 68 65 20 70 61 67 65 72 2e 20 20 54 68 69 73  the pager.  This
24370 20 69 73 20 61 20 62 75 66 66 65 72 20 74 68 61   is a buffer tha
24380 74 20 69 73 20 62 69 67 20 65 6e 6f 75 67 68 20  t is big enough 
24390 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65  to hold the.** e
243a0 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66  ntire content of
243b0 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
243c0 2e 20 20 54 68 69 73 20 62 75 66 66 65 72 20 69  .  This buffer i
243d0 73 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c  s used internall
243e0 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c  y.** during roll
243f0 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65  back and will be
24400 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 68 65   overwritten whe
24410 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b  never a rollback
24420 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42 75 74  .** occurs.  But
24430 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73 20 61   other modules a
24440 72 65 20 66 72 65 65 20 74 6f 20 75 73 65 20 69  re free to use i
24450 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61  t too, as long a
24460 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b  s.** no rollback
24470 73 20 61 72 65 20 68 61 70 70 65 6e 69 6e 67 2e  s are happening.
24480 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
24490 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28  3PagerTempSpace(
244a0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
244b0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
244c0 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f  >pTmpSpace;.}../
244d0 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
244e0 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  set the maximum 
244f0 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f  database page co
24500 75 6e 74 20 69 66 20 6d 78 50 61 67 65 20 69 73  unt if mxPage is
24510 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d   positive. .** M
24520 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69  ake no changes i
24530 66 20 6d 78 50 61 67 65 20 69 73 20 7a 65 72 6f  f mxPage is zero
24540 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 20 20 41   or negative.  A
24550 6e 64 20 6e 65 76 65 72 20 72 65 64 75 63 65 20  nd never reduce 
24560 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70  the.** maximum p
24570 61 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20  age count below 
24580 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
24590 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
245a0 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65  ..**.** Regardle
245b0 73 73 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65  ss of mxPage, re
245c0 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
245d0 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
245e0 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  unt..*/.int sqli
245f0 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43  te3PagerMaxPageC
24600 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  ount(Pager *pPag
24610 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  er, int mxPage){
24620 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 30 20  .  if( mxPage>0 
24630 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  ){.    pPager->m
24640 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a  xPgno = mxPage;.
24650 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
24660 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
24670 47 45 52 5f 4f 50 45 4e 20 29 3b 20 20 20 20 20  GER_OPEN );     
24680 20 2f 2a 20 43 61 6c 6c 65 64 20 6f 6e 6c 79 20   /* Called only 
24690 62 79 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20 2a  by OP_MaxPgcnt *
246a0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
246b0 65 72 2d 3e 6d 78 50 67 6e 6f 3e 3d 70 50 61 67  er->mxPgno>=pPag
246c0 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 20 20 2f  er->dbSize );  /
246d0 2a 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20 65 6e  * OP_MaxPgcnt en
246e0 66 6f 72 63 65 73 20 74 68 69 73 20 2a 2f 0a 20  forces this */. 
246f0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
24700 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mxPgno;.}../*.**
24710 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
24720 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61  et of routines a
24730 72 65 20 75 73 65 64 20 74 6f 20 64 69 73 61 62  re used to disab
24740 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64  le the simulated
24750 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65  .** I/O error me
24760 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20  chanism.  These 
24770 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
24780 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c  d to avoid simul
24790 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69  ated.** errors i
247a0 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65 20 77  n places where w
247b0 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
247c0 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a  out errors..**.*
247d0 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54  * Unless -DSQLIT
247e0 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65 64  E_TEST=1 is used
247f0 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73  , these routines
24800 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a   are all no-ops.
24810 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20  ** and generate 
24820 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64  no code..*/.#ifd
24830 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65  ef SQLITE_TEST.e
24840 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
24850 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
24860 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  ng;.extern int s
24870 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
24880 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  hit;.static int 
24890 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20  saved_cnt;.void 
248a0 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
248b0 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64  d_io_errors(void
248c0 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d  ){.  saved_cnt =
248d0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
248e0 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c  r_pending;.  sql
248f0 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
24900 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f  nding = -1;.}.vo
24910 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  id enable_simula
24920 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f  ted_io_errors(vo
24930 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  id){.  sqlite3_i
24940 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20  o_error_pending 
24950 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23  = saved_cnt;.}.#
24960 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69  else.# define di
24970 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
24980 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65  io_errors().# de
24990 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75  fine enable_simu
249a0 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
249b0 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
249c0 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e  Read the first N
249d0 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20   bytes from the 
249e0 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
249f0 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   file into memor
24a00 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20  y.** that pDest 
24a10 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a  points to. .**.*
24a20 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 77  * If the pager w
24a30 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74  as opened on a t
24a40 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 20 28 7a  ransient file (z
24a50 46 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f  Filename==""), o
24a60 72 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61  r.** opened on a
24a70 20 66 69 6c 65 20 6c 65 73 73 20 74 68 61 6e 20   file less than 
24a80 4e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  N bytes in size,
24a90 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
24aa0 65 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20  er is.** zeroed 
24ab0 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
24ac0 74 75 72 6e 65 64 2e 20 54 68 65 20 72 61 74 69  turned. The rati
24ad0 6f 6e 61 6c 65 20 66 6f 72 20 74 68 69 73 20 69  onale for this i
24ae0 73 20 74 68 61 74 20 74 68 69 73 20 0a 2a 2a 20  s that this .** 
24af0 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
24b00 20 74 6f 20 72 65 61 64 20 64 61 74 61 62 61 73   to read databas
24b10 65 20 68 65 61 64 65 72 73 2c 20 61 6e 64 20 61  e headers, and a
24b20 20 6e 65 77 20 74 72 61 6e 73 69 65 6e 74 20 6f   new transient o
24b30 72 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20  r.** zero sized 
24b40 64 61 74 61 62 61 73 65 20 68 61 73 20 61 20 68  database has a h
24b50 65 61 64 65 72 20 74 68 61 6e 20 63 6f 6e 73 69  eader than consi
24b60 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20  sts entirely of 
24b70 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  zeroes..**.** If
24b80 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 20 61 70   any IO error ap
24b90 61 72 74 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f  art from SQLITE_
24ba0 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
24bb0 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
24bc0 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 63 6f  .** the error co
24bd0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  de is returned t
24be0 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6e 64  o the caller and
24bf0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
24c00 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62   the.** output b
24c10 75 66 66 65 72 20 75 6e 64 65 66 69 6e 65 64 2e  uffer undefined.
24c20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
24c30 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64  agerReadFilehead
24c40 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
24c50 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65  , int N, unsigne
24c60 64 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a  d char *pDest){.
24c70 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
24c80 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70  E_OK;.  memset(p
24c90 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61  Dest, 0, N);.  a
24ca0 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
24cb0 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
24cc0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
24cd0 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74  ..  /* This rout
24ce0 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ine is only call
24cf0 65 64 20 62 79 20 62 74 72 65 65 20 69 6d 6d 65  ed by btree imme
24d00 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 63 72  diately after cr
24d10 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  eating.  ** the 
24d20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 20 54  Pager object.  T
24d30 68 65 72 65 20 68 61 73 20 6e 6f 74 20 62 65 65  here has not bee
24d40 6e 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79  n an opportunity
24d50 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20   to transition. 
24d60 20 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f 64 65 20   ** to WAL mode 
24d70 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  yet..  */.  asse
24d80 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
24d90 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69  (pPager) );..  i
24da0 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
24db0 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 49 4f 54  ->fd) ){.    IOT
24dc0 52 41 43 45 28 28 22 44 42 48 44 52 20 25 70 20  RACE(("DBHDR %p 
24dd0 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  0 %d\n", pPager,
24de0 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71   N)).    rc = sq
24df0 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
24e00 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e  er->fd, pDest, N
24e10 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
24e20 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
24e30 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
24e40 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
24e50 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  K;.    }.  }.  r
24e60 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
24e70 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
24e80 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c   may only be cal
24e90 6c 65 64 20 77 68 65 6e 20 61 20 72 65 61 64 2d  led when a read-
24ea0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f  transaction is o
24eb0 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61  pen on.** the pa
24ec0 67 65 72 2e 20 49 74 20 72 65 74 75 72 6e 73 20  ger. It returns 
24ed0 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
24ee0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
24ef0 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
24f00 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65   However, if the
24f10 20 66 69 6c 65 20 69 73 20 62 65 74 77 65 65 6e   file is between
24f20 20 31 20 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a   1 and <page-siz
24f30 65 3e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  e> bytes in size
24f40 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20  , then .** this 
24f50 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  is considered a 
24f60 31 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2f 0a  1 page file..*/.
24f70 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
24f80 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72  rPagecount(Pager
24f90 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70   *pPager, int *p
24fa0 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74  nPage){.  assert
24fb0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
24fc0 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  >=PAGER_READER )
24fd0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
24fe0 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
24ff0 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45  R_WRITER_FINISHE
25000 44 20 29 3b 0a 20 20 2a 70 6e 50 61 67 65 20 3d  D );.  *pnPage =
25010 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 64 62   (int)pPager->db
25020 53 69 7a 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  Size;.}.../*.** 
25030 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  Try to obtain a 
25040 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c 6f 63  lock of type loc
25050 6b 74 79 70 65 20 6f 6e 20 74 68 65 20 64 61 74  ktype on the dat
25060 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a 2a  abase file. If.*
25070 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f 72 20 67  * a similar or g
25080 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 61  reater lock is a
25090 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 74 68 69  lready held, thi
250a0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
250b0 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75 72 6e  no-op.** (return
250c0 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20 69 6d  ing SQLITE_OK im
250d0 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a  mediately)..**.*
250e0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74 74  * Otherwise, att
250f0 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 74  empt to obtain t
25100 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 73 71  he lock using sq
25110 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e 20 49  lite3OsLock(). I
25120 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20 62 75  nvoke .** the bu
25130 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74  sy callback if t
25140 68 65 20 6c 6f 63 6b 20 69 73 20 63 75 72 72 65  he lock is curre
25150 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61 62  ntly not availab
25160 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a 20 75  le. Repeat .** u
25170 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20 63 61  ntil the busy ca
25180 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 66  llback returns f
25190 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74 68  alse or until th
251a0 65 20 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a  e attempt to .**
251b0 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b   obtain the lock
251c0 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a   succeeds..**.**
251d0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
251e0 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64  K on success and
251f0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
25200 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61  f we cannot obta
25210 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 20  in.** the lock. 
25220 49 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 6f  If the lock is o
25230 62 74 61 69 6e 65 64 20 73 75 63 63 65 73 73 66  btained successf
25240 75 6c 6c 79 2c 20 73 65 74 20 74 68 65 20 50 61  ully, set the Pa
25250 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20 76 61  ger.state .** va
25260 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 74 79  riable to lockty
25270 70 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  pe before return
25280 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
25290 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e  nt pager_wait_on
252a0 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  _lock(Pager *pPa
252b0 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  ger, int locktyp
252c0 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  e){.  int rc;   
252d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
252e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
252f0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
25300 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
25310 69 73 20 69 73 20 65 69 74 68 65 72 20 61 20 6e  is is either a n
25320 6f 2d 6f 70 20 28 62 65 63 61 75 73 65 20 74 68  o-op (because th
25330 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
25340 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64   is .  ** alread
25350 79 20 68 65 6c 64 29 2c 20 6f 72 20 6f 6e 65 20  y held), or one 
25360 6f 66 20 74 68 65 20 74 72 61 6e 73 69 74 69 6f  of the transitio
25370 6e 73 20 74 68 61 74 20 74 68 65 20 62 75 73 79  ns that the busy
25380 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61  -handler.  ** ma
25390 79 20 62 65 20 69 6e 76 6f 6b 65 64 20 64 75 72  y be invoked dur
253a0 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e 67 20 74  ing, according t
253b0 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62  o the comment ab
253c0 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  ove.  ** sqlite3
253d0 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64  PagerSetBusyhand
253e0 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73  ler()..  */.  as
253f0 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 65  sert( (pPager->e
25400 4c 6f 63 6b 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a  Lock>=locktype).
25410 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65         || (pPage
25420 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43  r->eLock==NO_LOC
25430 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53  K && locktype==S
25440 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20  HARED_LOCK).    
25450 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65     || (pPager->e
25460 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
25470 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d  OCK && locktype=
25480 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29  =EXCLUSIVE_LOCK)
25490 0a 20 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20  .  );..  do {.  
254a0 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b    rc = pagerLock
254b0 44 62 28 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74  Db(pPager, lockt
254c0 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20  ype);.  }while( 
254d0 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
254e0 26 26 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79  && pPager->xBusy
254f0 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e  Handler(pPager->
25500 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 29  pBusyHandlerArg)
25510 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
25520 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69  .}../*.** Functi
25530 6f 6e 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  on assertTruncat
25540 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67  eConstraint(pPag
25550 65 72 29 20 63 68 65 63 6b 73 20 74 68 61 74 20  er) checks that 
25560 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66  one of the .** f
25570 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65  ollowing is true
25580 20 66 6f 72 20 61 6c 6c 20 64 69 72 74 79 20 70   for all dirty p
25590 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20 69  ages currently i
255a0 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  n the page-cache
255b0 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 54 68 65  :.**.**   a) The
255c0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
255d0 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
255e0 61 6c 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f  al to the size o
255f0 66 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 63  f the .**      c
25600 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20  urrent database 
25610 69 6d 61 67 65 2c 20 69 6e 20 70 61 67 65 73 2c  image, in pages,
25620 20 4f 52 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 69   OR.**.**   b) i
25630 66 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  f the page conte
25640 6e 74 20 77 65 72 65 20 77 72 69 74 74 65 6e 20  nt were written 
25650 61 74 20 74 68 69 73 20 74 69 6d 65 2c 20 69 74  at this time, it
25660 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
25670 20 20 20 62 65 20 6e 65 63 65 73 73 61 72 79 20     be necessary 
25680 74 6f 20 77 72 69 74 65 20 74 68 65 20 63 75 72  to write the cur
25690 72 65 6e 74 20 63 6f 6e 74 65 6e 74 20 6f 75 74  rent content out
256a0 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   to the sub-jour
256b0 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 28 61 73 20  nal.**      (as 
256c0 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 66 75  determined by fu
256d0 6e 63 74 69 6f 6e 20 73 75 62 6a 52 65 71 75 69  nction subjRequi
256e0 72 65 73 50 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a  resPage())..**.*
256f0 2a 20 49 66 20 74 68 65 20 63 6f 6e 64 69 74 69  * If the conditi
25700 6f 6e 20 61 73 73 65 72 74 65 64 20 62 79 20 74  on asserted by t
25710 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 65 72  his function wer
25720 65 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64 20  e not true, and 
25730 74 68 65 0a 2a 2a 20 64 69 72 74 79 20 70 61 67  the.** dirty pag
25740 65 20 77 65 72 65 20 74 6f 20 62 65 20 64 69 73  e were to be dis
25750 63 61 72 64 65 64 20 66 72 6f 6d 20 74 68 65 20  carded from the 
25760 63 61 63 68 65 20 76 69 61 20 74 68 65 20 70 61  cache via the pa
25770 67 65 72 53 74 72 65 73 73 28 29 0a 2a 2a 20 72  gerStress().** r
25780 6f 75 74 69 6e 65 2c 20 70 61 67 65 72 53 74 72  outine, pagerStr
25790 65 73 73 28 29 20 77 6f 75 6c 64 20 6e 6f 74 20  ess() would not 
257a0 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
257b0 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74  t page content t
257c0 6f 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  o.** the databas
257d0 65 20 66 69 6c 65 2e 20 49 66 20 61 20 73 61 76  e file. If a sav
257e0 65 70 6f 69 6e 74 20 74 72 61 6e 73 61 63 74 69  epoint transacti
257f0 6f 6e 20 77 65 72 65 20 72 6f 6c 6c 65 64 20 62  on were rolled b
25800 61 63 6b 20 61 66 74 65 72 0a 2a 2a 20 74 68 69  ack after.** thi
25810 73 20 68 61 70 70 65 6e 65 64 2c 20 74 68 65 20  s happened, the 
25820 63 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f 72  correct behavior
25830 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 72 65 73   would be to res
25840 74 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  tore the current
25850 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  .** content of t
25860 68 65 20 70 61 67 65 2e 20 48 6f 77 65 76 65 72  he page. However
25870 2c 20 73 69 6e 63 65 20 74 68 69 73 20 63 6f 6e  , since this con
25880 74 65 6e 74 20 69 73 20 6e 6f 74 20 70 72 65 73  tent is not pres
25890 65 6e 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a  ent in either.**
258a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
258b0 6c 65 20 6f 72 20 74 68 65 20 70 6f 72 74 69 6f  le or the portio
258c0 6e 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63  n of the rollbac
258d0 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 0a 2a  k journal and .*
258e0 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f  * sub-journal ro
258f0 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 63 6f  lled back the co
25900 6e 74 65 6e 74 20 63 6f 75 6c 64 20 6e 6f 74 20  ntent could not 
25910 62 65 20 72 65 73 74 6f 72 65 64 20 61 6e 64 20  be restored and 
25920 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
25930 69 6d 61 67 65 20 77 6f 75 6c 64 20 62 65 63 6f  image would beco
25940 6d 65 20 63 6f 72 72 75 70 74 2e 20 49 74 20 69  me corrupt. It i
25950 73 20 74 68 65 72 65 66 6f 72 65 20 66 6f 72 74  s therefore fort
25960 75 6e 61 74 65 20 74 68 61 74 20 0a 2a 2a 20 74  unate that .** t
25970 68 69 73 20 63 69 72 63 75 6d 73 74 61 6e 63 65  his circumstance
25980 20 63 61 6e 6e 6f 74 20 61 72 69 73 65 2e 0a 2a   cannot arise..*
25990 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
259a0 4c 49 54 45 5f 44 45 42 55 47 29 0a 73 74 61 74  LITE_DEBUG).stat
259b0 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 54 72  ic void assertTr
259c0 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
259d0 43 62 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  Cb(PgHdr *pPg){.
259e0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66    assert( pPg->f
259f0 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
25a00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73   );.  assert( !s
25a10 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
25a20 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e  pPg) || pPg->pgn
25a30 6f 3c 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  o<=pPg->pPager->
25a40 64 62 53 69 7a 65 20 29 3b 0a 7d 0a 73 74 61 74  dbSize );.}.stat
25a50 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 54 72  ic void assertTr
25a60 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
25a70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
25a80 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
25a90 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61  IterateDirty(pPa
25aa0 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 61 73  ger->pPCache, as
25ab0 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
25ac0 74 72 61 69 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c  traintCb);.}.#el
25ad0 73 65 0a 23 20 64 65 66 69 6e 65 20 61 73 73 65  se.# define asse
25ae0 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
25af0 61 69 6e 74 28 70 50 61 67 65 72 29 0a 23 65 6e  aint(pPager).#en
25b00 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63  dif../*.** Trunc
25b10 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
25b20 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  y database file 
25b30 69 6d 61 67 65 20 74 6f 20 6e 50 61 67 65 20 70  image to nPage p
25b40 61 67 65 73 2e 20 54 68 69 73 20 0a 2a 2a 20 66  ages. This .** f
25b50 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
25b60 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79   actually modify
25b70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
25b80 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 49 74 20 0a  le on disk. It .
25b90 2a 2a 20 6a 75 73 74 20 73 65 74 73 20 74 68 65  ** just sets the
25ba0 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20   internal state 
25bb0 6f 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a  of the pager obj
25bc0 65 63 74 20 73 6f 20 74 68 61 74 20 74 68 65 20  ect so that the 
25bd0 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6f 6e 20 77  .** truncation w
25be0 69 6c 6c 20 62 65 20 64 6f 6e 65 20 77 68 65 6e  ill be done when
25bf0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
25c00 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
25c10 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  itted..**.** Thi
25c20 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
25c30 6c 79 20 63 61 6c 6c 65 64 20 72 69 67 68 74 20  ly called right 
25c40 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e  before committin
25c50 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  g a transaction.
25c60 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 66 75  .** Once this fu
25c70 6e 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20  nction has been 
25c80 63 61 6c 6c 65 64 2c 20 74 68 65 20 74 72 61 6e  called, the tran
25c90 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 65 69 74  saction must eit
25ca0 68 65 72 20 62 65 0a 2a 2a 20 72 6f 6c 6c 65 64  her be.** rolled
25cb0 20 62 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74 74   back or committ
25cc0 65 64 2e 20 49 74 20 69 73 20 6e 6f 74 20 73 61  ed. It is not sa
25cd0 66 65 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20  fe to call this 
25ce0 66 75 6e 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20  function and.** 
25cf0 74 68 65 6e 20 63 6f 6e 74 69 6e 75 65 20 77 72  then continue wr
25d00 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  iting to the dat
25d10 61 62 61 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  abase..*/.void s
25d20 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
25d30 61 74 65 49 6d 61 67 65 28 50 61 67 65 72 20 2a  ateImage(Pager *
25d40 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61  pPager, Pgno nPa
25d50 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ge){.  assert( p
25d60 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e  Pager->dbSize>=n
25d70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
25d80 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
25d90 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  >=PAGER_WRITER_C
25da0 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20 70 50 61  ACHEMOD );.  pPa
25db0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50  ger->dbSize = nP
25dc0 61 67 65 3b 0a 0a 20 20 2f 2a 20 41 74 20 6f 6e  age;..  /* At on
25dd0 65 20 70 6f 69 6e 74 20 74 68 65 20 63 6f 64 65  e point the code
25de0 20 68 65 72 65 20 63 61 6c 6c 65 64 20 61 73 73   here called ass
25df0 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74  ertTruncateConst
25e00 72 61 69 6e 74 28 29 20 74 6f 0a 20 20 2a 2a 20  raint() to.  ** 
25e10 65 6e 73 75 72 65 20 74 68 61 74 20 61 6c 6c 20  ensure that all 
25e20 70 61 67 65 73 20 62 65 69 6e 67 20 74 72 75 6e  pages being trun
25e30 63 61 74 65 64 20 61 77 61 79 20 62 79 20 74 68  cated away by th
25e40 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 61 72 65  is operation are
25e50 2c 0a 20 20 2a 2a 20 69 66 20 6f 6e 65 20 6f 72  ,.  ** if one or
25e60 20 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e 74 73   more savepoints
25e70 20 61 72 65 20 6f 70 65 6e 2c 20 70 72 65 73 65   are open, prese
25e80 6e 74 20 69 6e 20 74 68 65 20 73 61 76 65 70 6f  nt in the savepo
25e90 69 6e 74 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  int .  ** journa
25ea0 6c 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 63  l so that they c
25eb0 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 69  an be restored i
25ec0 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  f the savepoint 
25ed0 69 73 20 72 6f 6c 6c 65 64 0a 20 20 2a 2a 20 62  is rolled.  ** b
25ee0 61 63 6b 2e 20 54 68 69 73 20 69 73 20 6e 6f 20  ack. This is no 
25ef0 6c 6f 6e 67 65 72 20 6e 65 63 65 73 73 61 72 79  longer necessary
25f00 20 61 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f   as this functio
25f10 6e 20 69 73 20 6e 6f 77 20 6f 6e 6c 79 0a 20 20  n is now only.  
25f20 2a 2a 20 63 61 6c 6c 65 64 20 72 69 67 68 74 20  ** called right 
25f30 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e  before committin
25f40 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  g a transaction.
25f50 20 53 6f 20 61 6c 74 68 6f 75 67 68 20 74 68 65   So although the
25f60 20 0a 20 20 2a 2a 20 50 61 67 65 72 20 6f 62 6a   .  ** Pager obj
25f70 65 63 74 20 6d 61 79 20 73 74 69 6c 6c 20 68 61  ect may still ha
25f80 76 65 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  ve open savepoin
25f90 74 73 20 28 50 61 67 65 72 2e 6e 53 61 76 65 70  ts (Pager.nSavep
25fa0 6f 69 6e 74 21 3d 30 29 2c 20 0a 20 20 2a 2a 20  oint!=0), .  ** 
25fb0 74 68 65 79 20 63 61 6e 6e 6f 74 20 62 65 20 72  they cannot be r
25fc0 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 53 6f 20 74  olled back. So t
25fd0 68 65 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  he assertTruncat
25fe0 65 43 6f 6e 73 74 72 61 69 6e 74 28 29 20 63 61  eConstraint() ca
25ff0 6c 6c 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 6c 6f  ll.  ** is no lo
26000 6e 67 65 72 20 63 6f 72 72 65 63 74 2e 20 2a 2f  nger correct. */
26010 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
26020 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
26030 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70  ed before attemp
26040 74 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  ting a hot-journ
26050 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 74 0a  al rollback. It.
26060 2a 2a 20 73 79 6e 63 73 20 74 68 65 20 6a 6f 75  ** syncs the jou
26070 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 64 69 73  rnal file to dis
26080 6b 2c 20 74 68 65 6e 20 73 65 74 73 20 70 50 61  k, then sets pPa
26090 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
260a0 74 6f 20 74 68 65 0a 2a 2a 20 73 69 7a 65 20 6f  to the.** size o
260b0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
260c0 6c 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 70  le so that the p
260d0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20  ager_playback() 
260e0 72 6f 75 74 69 6e 65 20 6b 6e 6f 77 73 0a 2a 2a  routine knows.**
260f0 20 74 68 61 74 20 74 68 65 20 65 6e 74 69 72 65   that the entire
26100 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
26110 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 2a  s been synced..*
26120 2a 0a 2a 2a 20 53 79 6e 63 69 6e 67 20 61 20 68  *.** Syncing a h
26130 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 64 69  ot-journal to di
26140 73 6b 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70  sk before attemp
26150 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20  ting to roll it 
26160 62 61 63 6b 20 65 6e 73 75 72 65 73 20 0a 2a 2a  back ensures .**
26170 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72   that if a power
26180 2d 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20  -failure occurs 
26190 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62  during the rollb
261a0 61 63 6b 2c 20 74 68 65 20 70 72 6f 63 65 73 73  ack, the process
261b0 20 74 68 61 74 0a 2a 2a 20 61 74 74 65 6d 70 74   that.** attempt
261c0 73 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f  s rollback follo
261d0 77 69 6e 67 20 73 79 73 74 65 6d 20 72 65 63 6f  wing system reco
261e0 76 65 72 79 20 73 65 65 73 20 74 68 65 20 73 61  very sees the sa
261f0 6d 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f  me journal.** co
26200 6e 74 65 6e 74 20 61 73 20 74 68 69 73 20 70 72  ntent as this pr
26210 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ocess..**.** If 
26220 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20  everything goes 
26230 61 73 20 70 6c 61 6e 6e 65 64 2c 20 53 51 4c 49  as planned, SQLI
26240 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
26250 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a  d. Otherwise, .*
26260 2a 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  * an SQLite erro
26270 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
26280 63 20 69 6e 74 20 70 61 67 65 72 53 79 6e 63 48  c int pagerSyncH
26290 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  otJournal(Pager 
262a0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
262b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
262c0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e    if( !pPager->n
262d0 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20  oSync ){.    rc 
262e0 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
262f0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c  pPager->jfd, SQL
26300 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29  ITE_SYNC_NORMAL)
26310 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
26320 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
26330 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
26340 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
26350 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f  jfd, &pPager->jo
26360 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 0a 20  urnalHdr);.  }. 
26370 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
26380 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20 72 65  *.** Obtain a re
26390 66 65 72 65 6e 63 65 20 74 6f 20 61 20 6d 65 6d  ference to a mem
263a0 6f 72 79 20 6d 61 70 70 65 64 20 70 61 67 65 20  ory mapped page 
263b0 6f 62 6a 65 63 74 20 66 6f 72 20 70 61 67 65 20  object for page 
263c0 6e 75 6d 62 65 72 20 70 67 6e 6f 2e 20 0a 2a 2a  number pgno. .**
263d0 20 54 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20   The new object 
263e0 77 69 6c 6c 20 75 73 65 20 74 68 65 20 70 6f 69  will use the poi
263f0 6e 74 65 72 20 70 44 61 74 61 2c 20 6f 62 74 61  nter pData, obta
26400 69 6e 65 64 20 66 72 6f 6d 20 78 46 65 74 63 68  ined from xFetch
26410 28 29 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  ()..** If succes
26420 73 66 75 6c 2c 20 73 65 74 20 2a 70 70 50 61 67  sful, set *ppPag
26430 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  e to point to th
26440 65 20 6e 65 77 20 70 61 67 65 20 72 65 66 65 72  e new page refer
26450 65 6e 63 65 0a 2a 2a 20 61 6e 64 20 72 65 74 75  ence.** and retu
26460 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74  rn SQLITE_OK. Ot
26470 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
26480 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
26490 63 6f 64 65 20 61 6e 64 20 73 65 74 0a 2a 2a 20  code and set.** 
264a0 2a 70 70 50 61 67 65 20 74 6f 20 7a 65 72 6f 2e  *ppPage to zero.
264b0 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 72 65 66 65  .**.** Page refe
264c0 72 65 6e 63 65 73 20 6f 62 74 61 69 6e 65 64 20  rences obtained 
264d0 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  by calling this 
264e0 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
264f0 62 65 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 62  be released.** b
26500 79 20 63 61 6c 6c 69 6e 67 20 70 61 67 65 72 52  y calling pagerR
26510 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28 29 2e  eleaseMapPage().
26520 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
26530 61 67 65 72 41 63 71 75 69 72 65 4d 61 70 50 61  agerAcquireMapPa
26540 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ge(.  Pager *pPa
26550 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
26560 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f        /* Pager o
26570 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67 6e 6f 20  bject */.  Pgno 
26580 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
26590 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
265a0 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 76  ge number */.  v
265b0 6f 69 64 20 2a 70 44 61 74 61 2c 20 20 20 20 20  oid *pData,     
265c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
265d0 2a 20 78 46 65 74 63 68 28 29 27 64 20 64 61 74  * xFetch()'d dat
265e0 61 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20  a for this page 
265f0 2a 2f 0a 20 20 50 67 48 64 72 20 2a 2a 70 70 50  */.  PgHdr **ppP
26600 61 67 65 20 20 20 20 20 20 20 20 20 20 20 20 20  age             
26610 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 63 71       /* OUT: Acq
26620 75 69 72 65 64 20 70 61 67 65 20 6f 62 6a 65 63  uired page objec
26630 74 20 2a 2f 0a 29 7b 0a 20 20 50 67 48 64 72 20  t */.){.  PgHdr 
26640 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
26650 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
26660 6f 72 79 20 6d 61 70 70 65 64 20 70 61 67 65 20  ory mapped page 
26670 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 0a  to return */.  .
26680 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 4d    if( pPager->pM
26690 6d 61 70 46 72 65 65 6c 69 73 74 20 29 7b 0a 20  mapFreelist ){. 
266a0 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 20 3d     *ppPage = p =
266b0 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72   pPager->pMmapFr
266c0 65 65 6c 69 73 74 3b 0a 20 20 20 20 70 50 61 67  eelist;.    pPag
266d0 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73  er->pMmapFreelis
266e0 74 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20  t = p->pDirty;. 
266f0 20 20 20 70 2d 3e 70 44 69 72 74 79 20 3d 20 30     p->pDirty = 0
26700 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 2d 3e  ;.    memset(p->
26710 70 45 78 74 72 61 2c 20 30 2c 20 70 50 61 67 65  pExtra, 0, pPage
26720 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 7d 65  r->nExtra);.  }e
26730 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65  lse{.    *ppPage
26740 20 3d 20 70 20 3d 20 28 50 67 48 64 72 20 2a 29   = p = (PgHdr *)
26750 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
26760 6f 28 73 69 7a 65 6f 66 28 50 67 48 64 72 29 20  o(sizeof(PgHdr) 
26770 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  + pPager->nExtra
26780 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20  );.    if( p==0 
26790 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
267a0 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72  OsUnfetch(pPager
267b0 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 67 6e 6f  ->fd, (i64)(pgno
267c0 2d 31 29 20 2a 20 70 50 61 67 65 72 2d 3e 70 61  -1) * pPager->pa
267d0 67 65 53 69 7a 65 2c 20 70 44 61 74 61 29 3b 0a  geSize, pData);.
267e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
267f0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
26800 0a 20 20 20 20 70 2d 3e 70 45 78 74 72 61 20 3d  .    p->pExtra =
26810 20 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d 3b 0a   (void *)&p[1];.
26820 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 50      p->flags = P
26830 47 48 44 52 5f 4d 4d 41 50 3b 0a 20 20 20 20 70  GHDR_MMAP;.    p
26840 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  ->nRef = 1;.    
26850 70 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67  p->pPager = pPag
26860 65 72 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  er;.  }..  asser
26870 74 28 20 70 2d 3e 70 45 78 74 72 61 3d 3d 28 76  t( p->pExtra==(v
26880 6f 69 64 20 2a 29 26 70 5b 31 5d 20 29 3b 0a 20  oid *)&p[1] );. 
26890 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 61 67   assert( p->pPag
268a0 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e==0 );.  assert
268b0 28 20 70 2d 3e 66 6c 61 67 73 3d 3d 50 47 48 44  ( p->flags==PGHD
268c0 52 5f 4d 4d 41 50 20 29 3b 0a 20 20 61 73 73 65  R_MMAP );.  asse
268d0 72 74 28 20 70 2d 3e 70 50 61 67 65 72 3d 3d 70  rt( p->pPager==p
268e0 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72  Pager );.  asser
268f0 74 28 20 70 2d 3e 6e 52 65 66 3d 3d 31 20 29 3b  t( p->nRef==1 );
26900 0a 0a 20 20 70 2d 3e 70 67 6e 6f 20 3d 20 70 67  ..  p->pgno = pg
26910 6e 6f 3b 0a 20 20 70 2d 3e 70 44 61 74 61 20 3d  no;.  p->pData =
26920 20 70 44 61 74 61 3b 0a 20 20 70 50 61 67 65 72   pData;.  pPager
26930 2d 3e 6e 4d 6d 61 70 4f 75 74 2b 2b 3b 0a 0a 20  ->nMmapOut++;.. 
26940 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
26950 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  K;.}../*.** Rele
26960 61 73 65 20 61 20 72 65 66 65 72 65 6e 63 65 20  ase a reference 
26970 74 6f 20 70 61 67 65 20 70 50 67 2e 20 70 50 67  to page pPg. pPg
26980 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
26990 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20 0a  returned by an .
269a0 2a 2a 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20  ** earlier call 
269b0 74 6f 20 70 61 67 65 72 41 63 71 75 69 72 65 4d  to pagerAcquireM
269c0 61 70 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61  apPage()..*/.sta
269d0 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 52 65  tic void pagerRe
269e0 6c 65 61 73 65 4d 61 70 50 61 67 65 28 50 67 48  leaseMapPage(PgH
269f0 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
26a00 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
26a10 3e 70 50 61 67 65 72 3b 0a 20 20 70 50 61 67 65  >pPager;.  pPage
26a20 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2d 2d 3b 0a 20  r->nMmapOut--;. 
26a30 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 70   pPg->pDirty = p
26a40 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65  Pager->pMmapFree
26a50 6c 69 73 74 3b 0a 20 20 70 50 61 67 65 72 2d 3e  list;.  pPager->
26a60 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 3d 20  pMmapFreelist = 
26a70 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pPg;..  assert( 
26a80 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
26a90 68 6f 64 73 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d  hods->iVersion>=
26aa0 33 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73  3 );.  sqlite3Os
26ab0 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e  Unfetch(pPager->
26ac0 66 64 2c 20 28 69 36 34 29 28 70 50 67 2d 3e 70  fd, (i64)(pPg->p
26ad0 67 6e 6f 2d 31 29 2a 70 50 61 67 65 72 2d 3e 70  gno-1)*pPager->p
26ae0 61 67 65 53 69 7a 65 2c 20 70 50 67 2d 3e 70 44  ageSize, pPg->pD
26af0 61 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ata);.}../*.** F
26b00 72 65 65 20 61 6c 6c 20 50 67 48 64 72 20 6f 62  ree all PgHdr ob
26b10 6a 65 63 74 73 20 73 74 6f 72 65 64 20 69 6e 20  jects stored in 
26b20 74 68 65 20 50 61 67 65 72 2e 70 4d 6d 61 70 46  the Pager.pMmapF
26b30 72 65 65 6c 69 73 74 20 6c 69 73 74 2e 0a 2a 2f  reelist list..*/
26b40 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
26b50 65 72 46 72 65 65 4d 61 70 48 64 72 73 28 50 61  erFreeMapHdrs(Pa
26b60 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
26b70 50 67 48 64 72 20 2a 70 3b 0a 20 20 50 67 48 64  PgHdr *p;.  PgHd
26b80 72 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28  r *pNext;.  for(
26b90 70 3d 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46  p=pPager->pMmapF
26ba0 72 65 65 6c 69 73 74 3b 20 70 3b 20 70 3d 70 4e  reelist; p; p=pN
26bb0 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20  ext){.    pNext 
26bc0 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20  = p->pDirty;.   
26bd0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
26be0 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
26bf0 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67  Shutdown the pag
26c00 65 20 63 61 63 68 65 2e 20 20 46 72 65 65 20 61  e cache.  Free a
26c10 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c  ll memory and cl
26c20 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a  ose all files..*
26c30 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61  *.** If a transa
26c40 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f  ction was in pro
26c50 67 72 65 73 73 20 77 68 65 6e 20 74 68 69 73 20  gress when this 
26c60 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
26c70 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73  d, that.** trans
26c80 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
26c90 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73   back.  All outs
26ca0 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72  tanding pages ar
26cb0 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a  e invalidated.**
26cc0 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72   and their memor
26cd0 79 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79  y is freed.  Any
26ce0 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20   attempt to use 
26cf0 61 20 70 61 67 65 20 61 73 73 6f 63 69 61 74 65  a page associate
26d00 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70  d.** with this p
26d10 61 67 65 20 63 61 63 68 65 20 61 66 74 65 72 20  age cache after 
26d20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
26d30 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c  turns will likel
26d40 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61  y.** result in a
26d50 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a   coredump..**.**
26d60 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
26d70 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e 20  lways succeeds. 
26d80 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
26d90 20 69 73 20 61 63 74 69 76 65 20 61 6e 20 61 74   is active an at
26da0 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65  tempt.** is made
26db0 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b   to roll it back
26dc0 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
26dd0 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20  curs during the 
26de0 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68  rollback .** a h
26df0 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62  ot journal may b
26e00 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69  e left in the fi
26e10 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f 20  lesystem but no 
26e20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
26e30 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c  d.** to the call
26e40 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
26e50 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61 67  e3PagerClose(Pag
26e60 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 75  er *pPager){.  u
26e70 38 20 2a 70 54 6d 70 20 3d 20 28 75 38 20 2a 29  8 *pTmp = (u8 *)
26e80 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
26e90 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61 73  e;..  assert( as
26ea0 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
26eb0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 64 69  (pPager) );.  di
26ec0 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
26ed0 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 73  io_errors();.  s
26ee0 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
26ef0 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 70 61 67  nMalloc();.  pag
26f00 65 72 46 72 65 65 4d 61 70 48 64 72 73 28 70 50  erFreeMapHdrs(pP
26f10 61 67 65 72 29 3b 0a 20 20 2f 2a 20 70 50 61 67  ager);.  /* pPag
26f20 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b  er->errCode = 0;
26f30 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 65 78   */.  pPager->ex
26f40 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b  clusiveMode = 0;
26f50 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
26f60 4f 4d 49 54 5f 57 41 4c 0a 20 20 73 71 6c 69 74  OMIT_WAL.  sqlit
26f70 65 33 57 61 6c 43 6c 6f 73 65 28 70 50 61 67 65  e3WalClose(pPage
26f80 72 2d 3e 70 57 61 6c 2c 20 70 50 61 67 65 72 2d  r->pWal, pPager-
26f90 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 2c 20  >ckptSyncFlags, 
26fa0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
26fb0 2c 20 70 54 6d 70 29 3b 0a 20 20 70 50 61 67 65  , pTmp);.  pPage
26fc0 72 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a 23 65 6e  r->pWal = 0;.#en
26fd0 64 69 66 0a 20 20 70 61 67 65 72 5f 72 65 73 65  dif.  pager_rese
26fe0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  t(pPager);.  if(
26ff0 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 61   MEMDB ){.    pa
27000 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65  ger_unlock(pPage
27010 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
27020 20 2f 2a 20 49 66 20 69 74 20 69 73 20 6f 70 65   /* If it is ope
27030 6e 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  n, sync the jour
27040 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20  nal file before 
27050 63 61 6c 6c 69 6e 67 20 55 6e 6c 6f 63 6b 41 6e  calling UnlockAn
27060 64 52 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 2a  dRollback..    *
27070 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74  * If this is not
27080 20 64 6f 6e 65 2c 20 74 68 65 6e 20 61 6e 20 75   done, then an u
27090 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20  nsynced portion 
270a0 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72  of the open jour
270b0 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65  nal .    ** file
270c0 20 6d 61 79 20 62 65 20 70 6c 61 79 65 64 20 62   may be played b
270d0 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ack into the dat
270e0 61 62 61 73 65 2e 20 49 66 20 61 20 70 6f 77 65  abase. If a powe
270f0 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  r failure occurs
27100 20 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65 20 74   .    ** while t
27110 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67  his is happening
27120 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  , the database c
27130 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72 72  ould become corr
27140 75 70 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  upt..    **.    
27150 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
27160 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69  ccurs while tryi
27170 6e 67 20 74 6f 20 73 79 6e 63 20 74 68 65 20 6a  ng to sync the j
27180 6f 75 72 6e 61 6c 2c 20 73 68 69 66 74 20 74 68  ournal, shift th
27190 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 69  e pager.    ** i
271a0 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74  nto the ERROR st
271b0 61 74 65 2e 20 54 68 69 73 20 63 61 75 73 65 73  ate. This causes
271c0 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61   UnlockAndRollba
271d0 63 6b 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65  ck to unlock the
271e0 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
271f0 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 6a   and close the j
27200 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 74 68  ournal file with
27210 6f 75 74 20 61 74 74 65 6d 70 74 69 6e 67 20 74  out attempting t
27220 6f 20 72 6f 6c 6c 20 69 74 0a 20 20 20 20 2a 2a  o roll it.    **
27230 20 62 61 63 6b 20 6f 72 20 66 69 6e 61 6c 69 7a   back or finaliz
27240 65 20 69 74 2e 20 54 68 65 20 6e 65 78 74 20 64  e it. The next d
27250 61 74 61 62 61 73 65 20 75 73 65 72 20 77 69 6c  atabase user wil
27260 6c 20 68 61 76 65 20 74 6f 20 64 6f 20 68 6f 74  l have to do hot
27270 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20  -journal.    ** 
27280 72 6f 6c 6c 62 61 63 6b 20 62 65 66 6f 72 65 20  rollback before 
27290 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 64 61  accessing the da
272a0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
272b0 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 4f 70   */.    if( isOp
272c0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
272d0 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65  ){.      pager_e
272e0 72 72 6f 72 28 70 50 61 67 65 72 2c 20 70 61 67  rror(pPager, pag
272f0 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c  erSyncHotJournal
27300 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d  (pPager));.    }
27310 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b  .    pagerUnlock
27320 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  AndRollback(pPag
27330 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  er);.  }.  sqlit
27340 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
27350 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69  c();.  enable_si
27360 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
27370 73 28 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43  s();.  PAGERTRAC
27380 45 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c  E(("CLOSE %d\n",
27390 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
273a0 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  ));.  IOTRACE(("
273b0 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50 61  CLOSE %p\n", pPa
273c0 67 65 72 29 29 0a 20 20 73 71 6c 69 74 65 33 4f  ger)).  sqlite3O
273d0 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
273e0 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73  fd);.  sqlite3Os
273f0 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64  Close(pPager->fd
27400 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
27410 46 72 65 65 28 70 54 6d 70 29 3b 0a 20 20 73 71  Free(pTmp);.  sq
27420 6c 69 74 65 33 50 63 61 63 68 65 43 6c 6f 73 65  lite3PcacheClose
27430 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
27440 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  );..#ifdef SQLIT
27450 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66  E_HAS_CODEC.  if
27460 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63  ( pPager->xCodec
27470 46 72 65 65 20 29 20 70 50 61 67 65 72 2d 3e 78  Free ) pPager->x
27480 43 6f 64 65 63 46 72 65 65 28 70 50 61 67 65 72  CodecFree(pPager
27490 2d 3e 70 43 6f 64 65 63 29 3b 0a 23 65 6e 64 69  ->pCodec);.#endi
274a0 66 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  f..  assert( !pP
274b0 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
274c0 20 26 26 20 21 70 50 61 67 65 72 2d 3e 70 49 6e   && !pPager->pIn
274d0 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73  Journal );.  ass
274e0 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61  ert( !isOpen(pPa
274f0 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 21 69 73  ger->jfd) && !is
27500 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66  Open(pPager->sjf
27510 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  d) );..  sqlite3
27520 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20  _free(pPager);. 
27530 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
27540 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  K;.}..#if !defin
27550 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64 65  ed(NDEBUG) || de
27560 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
27570 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  T)./*.** Return 
27580 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
27590 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f  for page pPg..*/
275a0 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61 67  .Pgno sqlite3Pag
275b0 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62 50  erPagenumber(DbP
275c0 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74  age *pPg){.  ret
275d0 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 7d  urn pPg->pgno;.}
275e0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
275f0 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ncrement the ref
27600 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72  erence count for
27610 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 76 6f   page pPg..*/.vo
27620 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  id sqlite3PagerR
27630 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ef(DbPage *pPg){
27640 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
27650 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a  Ref(pPg);.}../*.
27660 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72  ** Sync the jour
27670 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f  nal. In other wo
27680 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61  rds, make sure a
27690 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74 68 61  ll the pages tha
276a0 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77  t have.** been w
276b0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
276c0 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61  urnal have actua
276d0 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68 65 20  lly reached the 
276e0 73 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a  surface of the.*
276f0 2a 20 64 69 73 6b 20 61 6e 64 20 63 61 6e 20 62  * disk and can b
27700 65 20 72 65 73 74 6f 72 65 64 20 69 6e 20 74 68  e restored in th
27710 65 20 65 76 65 6e 74 20 6f 66 20 61 20 68 6f 74  e event of a hot
27720 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
27730 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
27740 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66 6c 61  Pager.noSync fla
27750 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74  g is set, then t
27760 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
27770 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 68 65  a no-op..** Othe
27780 72 77 69 73 65 2c 20 74 68 65 20 61 63 74 69 6f  rwise, the actio
27790 6e 73 20 72 65 71 75 69 72 65 64 20 64 65 70 65  ns required depe
277a0 6e 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  nd on the journa
277b0 6c 2d 6d 6f 64 65 20 61 6e 64 20 74 68 65 20 0a  l-mode and the .
277c0 2a 2a 20 64 65 76 69 63 65 20 63 68 61 72 61 63  ** device charac
277d0 74 65 72 69 73 74 69 63 73 20 6f 66 20 74 68 65  teristics of the
277e0 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 61 73   file-system, as
277f0 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
27800 20 20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e    * If the journ
27810 61 6c 20 66 69 6c 65 20 69 73 20 61 6e 20 69 6e  al file is an in
27820 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20  -memory journal 
27830 66 69 6c 65 2c 20 6e 6f 20 61 63 74 69 6f 6e 20  file, no action 
27840 6e 65 65 64 0a 2a 2a 20 20 20 20 20 62 65 20 74  need.**     be t
27850 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  aken..**.**   * 
27860 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
27870 65 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f  e device does no
27880 74 20 73 75 70 70 6f 72 74 20 74 68 65 20 53 41  t support the SA
27890 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72  FE_APPEND proper
278a0 74 79 2c 0a 2a 2a 20 20 20 20 20 74 68 65 6e 20  ty,.**     then 
278b0 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 6f  the nRec field o
278c0 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
278d0 74 6c 79 20 77 72 69 74 74 65 6e 20 6a 6f 75 72  tly written jour
278e0 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 20 20  nal header.**   
278f0 20 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20    is updated to 
27900 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62  contain the numb
27910 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 72 65  er of journal re
27920 63 6f 72 64 73 20 74 68 61 74 20 68 61 76 65 0a  cords that have.
27930 2a 2a 20 20 20 20 20 62 65 65 6e 20 77 72 69 74  **     been writ
27940 74 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74  ten following it
27950 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  . If the pager i
27960 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 66  s operating in f
27970 75 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20 20 20  ull-sync.**     
27980 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a  mode, then the j
27990 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73  ournal file is s
279a0 79 6e 63 65 64 20 62 65 66 6f 72 65 20 74 68 69  ynced before thi
279b0 73 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74  s field is updat
279c0 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66  ed..**.**   * If
279d0 20 74 68 65 20 64 65 76 69 63 65 20 64 6f 65 73   the device does
279e0 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65   not support the
279f0 20 53 45 51 55 45 4e 54 49 41 4c 20 70 72 6f 70   SEQUENTIAL prop
27a00 65 72 74 79 2c 20 74 68 65 6e 20 0a 2a 2a 20 20  erty, then .**  
27a10 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
27a20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a  is synced..**.**
27a30 20 4f 72 2c 20 69 6e 20 70 73 65 75 64 6f 2d 63   Or, in pseudo-c
27a40 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28  ode:.**.**   if(
27a50 20 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79 20   NOT <in-memory 
27a60 6a 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20 20  journal> ){.**  
27a70 20 20 20 69 66 28 20 4e 4f 54 20 53 41 46 45 5f     if( NOT SAFE_
27a80 41 50 50 45 4e 44 20 29 7b 0a 2a 2a 20 20 20 20  APPEND ){.**    
27a90 20 20 20 69 66 28 20 3c 66 75 6c 6c 2d 73 79 6e     if( <full-syn
27aa0 63 20 6d 6f 64 65 3e 20 29 20 78 53 79 6e 63 28  c mode> ) xSync(
27ab0 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b  <journal file>);
27ac0 0a 2a 2a 20 20 20 20 20 20 20 3c 75 70 64 61 74  .**       <updat
27ad0 65 20 6e 52 65 63 20 66 69 65 6c 64 3e 0a 2a 2a  e nRec field>.**
27ae0 20 20 20 20 20 7d 20 0a 2a 2a 20 20 20 20 20 69       } .**     i
27af0 66 28 20 4e 4f 54 20 53 45 51 55 45 4e 54 49 41  f( NOT SEQUENTIA
27b00 4c 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e  L ) xSync(<journ
27b10 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20  al file>);.**   
27b20 7d 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  }.**.** If succe
27b30 73 73 66 75 6c 2c 20 74 68 69 73 20 72 6f 75 74  ssful, this rout
27b40 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20 50  ine clears the P
27b50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
27b60 6c 61 67 20 6f 66 20 65 76 65 72 79 20 0a 2a 2a  lag of every .**
27b70 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20   page currently 
27b80 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 20 62  held in memory b
27b90 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
27ba0 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e  SQLITE_OK. If an
27bb0 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 69 73 20   IO.** error is 
27bc0 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65  encountered, the
27bd0 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  n the IO error c
27be0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
27bf0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  to the caller..*
27c00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e  /.static int syn
27c10 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  cJournal(Pager *
27c20 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 65 77 48  pPager, int newH
27c30 64 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  dr){.  int rc;  
27c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c50 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
27c60 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65   code */..  asse
27c70 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
27c80 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
27c90 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20  _CACHEMOD.      
27ca0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
27cb0 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
27cc0 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73  _DBMOD.  );.  as
27cd0 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
27ce0 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
27cf0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
27d00 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
27d10 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71  r) );..  rc = sq
27d20 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c 75 73  lite3PagerExclus
27d30 69 76 65 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b  iveLock(pPager);
27d40 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
27d50 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
27d60 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  ;..  if( !pPager
27d70 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
27d80 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
27d90 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20  >tempFile );.   
27da0 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
27db0 65 72 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67  er->jfd) && pPag
27dc0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21  er->journalMode!
27dd0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
27de0 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20  DE_MEMORY ){.   
27df0 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 63     const int iDc
27e00 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69   = sqlite3OsDevi
27e10 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
27e20 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  s(pPager->fd);. 
27e30 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f       assert( isO
27e40 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
27e50 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 30   );..      if( 0
27e60 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f  ==(iDc&SQLITE_IO
27e70 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29  CAP_SAFE_APPEND)
27e80 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
27e90 68 69 73 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20  his block deals 
27ea0 77 69 74 68 20 61 6e 20 6f 62 73 63 75 72 65 20  with an obscure 
27eb0 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74 68 65 20  problem. If the 
27ec0 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  last connection.
27ed0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
27ee0 77 72 6f 74 65 20 74 6f 20 74 68 69 73 20 64 61  wrote to this da
27ef0 74 61 62 61 73 65 20 77 61 73 20 6f 70 65 72 61  tabase was opera
27f00 74 69 6e 67 20 69 6e 20 70 65 72 73 69 73 74 65  ting in persiste
27f10 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  nt-journal.     
27f20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e     ** mode, then
27f30 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
27f40 65 20 6d 61 79 20 61 74 20 74 68 69 73 20 70 6f  e may at this po
27f50 69 6e 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20  int actually be 
27f60 6c 61 72 67 65 72 0a 20 20 20 20 20 20 20 20 2a  larger.        *
27f70 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 6a 6f 75  * than Pager.jou
27f80 72 6e 61 6c 4f 66 66 20 62 79 74 65 73 2e 20 49  rnalOff bytes. I
27f90 66 20 74 68 65 20 6e 65 78 74 20 74 68 69 6e 67  f the next thing
27fa0 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
27fb0 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20          ** file 
27fc0 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20  happens to be a 
27fd0 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 28  journal-header (
27fe0 77 72 69 74 74 65 6e 20 61 73 20 70 61 72 74 20  written as part 
27ff0 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  of the.        *
28000 2a 20 70 72 65 76 69 6f 75 73 20 63 6f 6e 6e 65  * previous conne
28010 63 74 69 6f 6e 27 73 20 74 72 61 6e 73 61 63 74  ction's transact
28020 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63 72 61 73  ion), and a cras
28030 68 20 6f 72 20 70 6f 77 65 72 2d 66 61 69 6c 75  h or power-failu
28040 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  re .        ** o
28050 63 63 75 72 73 20 61 66 74 65 72 20 6e 52 65 63  ccurs after nRec
28060 20 69 73 20 75 70 64 61 74 65 64 20 62 75 74 20   is updated but 
28070 62 65 66 6f 72 65 20 74 68 69 73 20 63 6f 6e 6e  before this conn
28080 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20 0a 20  ection writes . 
28090 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 74 68 69         ** anythi
280a0 6e 67 20 65 6c 73 65 20 74 6f 20 74 68 65 20 6a  ng else to the j
280b0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20  ournal file (or 
280c0 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20 62 61  commits/rolls ba
280d0 63 6b 20 69 74 73 20 0a 20 20 20 20 20 20 20 20  ck its .        
280e0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c  ** transaction),
280f0 20 74 68 65 6e 20 53 51 4c 69 74 65 20 6d 61 79   then SQLite may
28100 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75 73 65 64   become confused
28110 20 77 68 65 6e 20 64 6f 69 6e 67 20 74 68 65 20   when doing the 
28120 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d  .        ** hot-
28130 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
28140 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 63 6f 76   following recov
28150 65 72 79 2e 20 49 74 20 6d 61 79 20 72 6f 6c 6c  ery. It may roll
28160 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20 20 20 20   back all.      
28170 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 63 6f 6e    ** of this con
28180 6e 65 63 74 69 6f 6e 73 20 64 61 74 61 2c 20 74  nections data, t
28190 68 65 6e 20 70 72 6f 63 65 65 64 20 74 6f 20 72  hen proceed to r
281a0 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74 68 65 20  olling back the 
281b0 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  old,.        ** 
281c0 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64 61 74 61  out-of-date data
281d0 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69 74   that follows it
281e0 2e 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75  . Database corru
281f0 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a  ption..        *
28200 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 6f 20  *.        ** To 
28210 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73  work around this
28220 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  , if the journal
28230 20 66 69 6c 65 20 64 6f 65 73 20 61 70 70 65 61   file does appea
28240 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20  r to contain.   
28250 20 20 20 20 20 2a 2a 20 61 20 76 61 6c 69 64 20       ** a valid 
28260 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77 69 6e 67  header following
28270 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
28280 66 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61 20  f, then write a 
28290 30 78 30 30 0a 20 20 20 20 20 20 20 20 2a 2a 20  0x00.        ** 
282a0 62 79 74 65 20 74 6f 20 74 68 65 20 73 74 61 72  byte to the star
282b0 74 20 6f 66 20 69 74 20 74 6f 20 70 72 65 76 65  t of it to preve
282c0 6e 74 20 69 74 20 66 72 6f 6d 20 62 65 69 6e 67  nt it from being
282d0 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a 20 20 20   recognized..   
282e0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
282f0 2a 2a 20 56 61 72 69 61 62 6c 65 20 69 4e 65 78  ** Variable iNex
28300 74 48 64 72 4f 66 66 73 65 74 20 69 73 20 73 65  tHdrOffset is se
28310 74 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20  t to the offset 
28320 61 74 20 77 68 69 63 68 20 74 68 69 73 0a 20 20  at which this.  
28330 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d        ** problem
28340 61 74 69 63 20 68 65 61 64 65 72 20 77 69 6c 6c  atic header will
28350 20 6f 63 63 75 72 2c 20 69 66 20 69 74 20 65 78   occur, if it ex
28360 69 73 74 73 2e 20 61 4d 61 67 69 63 20 69 73 20  ists. aMagic is 
28370 75 73 65 64 20 0a 20 20 20 20 20 20 20 20 2a 2a  used .        **
28380 20 61 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   as a temporary 
28390 62 75 66 66 65 72 20 74 6f 20 69 6e 73 70 65 63  buffer to inspec
283a0 74 20 74 68 65 20 66 69 72 73 74 20 63 6f 75 70  t the first coup
283b0 6c 65 20 6f 66 20 62 79 74 65 73 20 6f 66 0a 20  le of bytes of. 
283c0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6f         ** the po
283d0 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e 61 6c 20  tential journal 
283e0 68 65 61 64 65 72 2e 0a 20 20 20 20 20 20 20 20  header..        
283f0 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20 69  */.        i64 i
28400 4e 65 78 74 48 64 72 4f 66 66 73 65 74 3b 0a 20  NextHdrOffset;. 
28410 20 20 20 20 20 20 20 75 38 20 61 4d 61 67 69 63         u8 aMagic
28420 5b 38 5d 3b 0a 20 20 20 20 20 20 20 20 75 38 20  [8];.        u8 
28430 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
28440 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d  JournalMagic)+4]
28450 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ;..        memcp
28460 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72  y(zHeader, aJour
28470 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
28480 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
28490 3b 0a 20 20 20 20 20 20 20 20 70 75 74 33 32 62  ;.        put32b
284a0 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
284b0 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
284c0 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65  c)], pPager->nRe
284d0 63 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 4e 65  c);..        iNe
284e0 78 74 48 64 72 4f 66 66 73 65 74 20 3d 20 6a 6f  xtHdrOffset = jo
284f0 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
28500 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
28510 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
28520 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ad(pPager->jfd, 
28530 61 4d 61 67 69 63 2c 20 38 2c 20 69 4e 65 78 74  aMagic, 8, iNext
28540 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  HdrOffset);.    
28550 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
28560 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65 6d 63  TE_OK && 0==memc
28570 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72  mp(aMagic, aJour
28580 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 7b 0a  nalMagic, 8) ){.
28590 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63            static
285a0 20 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f 62 79   const u8 zeroby
285b0 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  te = 0;.        
285c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
285d0 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
285e0 64 2c 20 26 7a 65 72 6f 62 79 74 65 2c 20 31 2c  d, &zerobyte, 1,
285f0 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29   iNextHdrOffset)
28600 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
28610 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
28620 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c  TE_OK && rc!=SQL
28630 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
28640 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20  READ ){.        
28650 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
28660 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
28670 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65  /* Write the nRe
28680 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65  c value into the
28690 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65   journal file he
286a0 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20  ader. If in.    
286b0 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63      ** full-sync
286c0 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79  hronous mode, sy
286d0 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
286e0 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72  irst. This ensur
286f0 65 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  es that.        
28700 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20  ** all data has 
28710 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64  really hit the d
28720 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20  isk before nRec 
28730 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61  is updated to ma
28740 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74  rk.        ** it
28750 20 61 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   as a candidate 
28760 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20  for rollback..  
28770 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
28780 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20   ** This is not 
28790 72 65 71 75 69 72 65 64 20 69 66 20 74 68 65 20  required if the 
287a0 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61  persistent media
287b0 20 73 75 70 70 6f 72 74 73 20 74 68 65 0a 20 20   supports the.  
287c0 20 20 20 20 20 20 2a 2a 20 53 41 46 45 5f 41 50        ** SAFE_AP
287d0 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2e 20 42  PEND property. B
287e0 65 63 61 75 73 65 20 69 6e 20 74 68 69 73 20 63  ecause in this c
287f0 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  ase it is not po
28800 73 73 69 62 6c 65 20 0a 20 20 20 20 20 20 20 20  ssible .        
28810 2a 2a 20 66 6f 72 20 67 61 72 62 61 67 65 20 64  ** for garbage d
28820 61 74 61 20 74 6f 20 62 65 20 61 70 70 65 6e 64  ata to be append
28830 65 64 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 20  ed to the file, 
28840 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 20  the nRec field. 
28850 20 20 20 20 20 20 20 2a 2a 20 69 73 20 70 6f 70         ** is pop
28860 75 6c 61 74 65 64 20 77 69 74 68 20 30 78 46 46  ulated with 0xFF
28870 46 46 46 46 46 46 20 77 68 65 6e 20 74 68 65 20  FFFFFF when the 
28880 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
28890 73 20 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20  s written.      
288a0 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e    ** and never n
288b0 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74  eeds to be updat
288c0 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ed..        */. 
288d0 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
288e0 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 30  r->fullSync && 0
288f0 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f  ==(iDc&SQLITE_IO
28900 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20  CAP_SEQUENTIAL) 
28910 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47  ){.          PAG
28920 45 52 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a  ERTRACE(("SYNC j
28930 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c  ournal of %d\n",
28940 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
28950 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f  ));.          IO
28960 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70  TRACE(("JSYNC %p
28970 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
28980 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
28990 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
289a0 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
289b0 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20 20  syncFlags);.    
289c0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
289d0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
289e0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
289f0 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
28a00 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 5c 6e 22  "JHDR %p %lld\n"
28a10 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  , pPager, pPager
28a20 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 29 3b 0a  ->journalHdr));.
28a30 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
28a40 69 74 65 33 4f 73 57 72 69 74 65 28 0a 20 20 20  ite3OsWrite(.   
28a50 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
28a60 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 73  >jfd, zHeader, s
28a70 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29 2c 20  izeof(zHeader), 
28a80 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
28a90 64 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  dr.        );.  
28aa0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
28ab0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
28ac0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
28ad0 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53     if( 0==(iDc&S
28ae0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
28af0 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20  ENTIAL) ){.     
28b00 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
28b10 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20  SYNC journal of 
28b20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
28b30 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20  Pager)));.      
28b40 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e    IOTRACE(("JSYN
28b50 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  C %p\n", pPager)
28b60 29 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ).        rc = s
28b70 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
28b80 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
28b90 2d 3e 73 79 6e 63 46 6c 61 67 73 7c 20 0a 20 20  ->syncFlags| .  
28ba0 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d          (pPager-
28bb0 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 53 51 4c 49  >syncFlags==SQLI
28bc0 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c  TE_SYNC_FULL?SQL
28bd0 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c  ITE_SYNC_DATAONL
28be0 59 3a 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  Y:0).        );.
28bf0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
28c00 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
28c10 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a  rn rc;.      }..
28c20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
28c30 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65  urnalHdr = pPage
28c40 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
28c50 20 20 20 20 20 69 66 28 20 6e 65 77 48 64 72 20       if( newHdr 
28c60 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  && 0==(iDc&SQLIT
28c70 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
28c80 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20  END) ){.        
28c90 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
28ca0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ;.        rc = w
28cb0 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70  riteJournalHdr(p
28cc0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
28cd0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
28ce0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
28cf0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
28d00 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
28d10 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61  journalHdr = pPa
28d20 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
28d30 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
28d40 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65   Unless the page
28d50 72 20 69 73 20 69 6e 20 6e 6f 53 79 6e 63 20 6d  r is in noSync m
28d60 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ode, the journal
28d70 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74 20 0a   file was just .
28d80 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c    ** successfull
28d90 79 20 73 79 6e 63 65 64 2e 20 45 69 74 68 65 72  y synced. Either
28da0 20 77 61 79 2c 20 63 6c 65 61 72 20 74 68 65 20   way, clear the 
28db0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
28dc0 66 6c 61 67 20 6f 6e 20 0a 20 20 2a 2a 20 61 6c  flag on .  ** al
28dd0 6c 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20  l pages..  */.  
28de0 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65  sqlite3PcacheCle
28df0 61 72 53 79 6e 63 46 6c 61 67 73 28 70 50 61 67  arSyncFlags(pPag
28e00 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
28e10 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
28e20 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42   PAGER_WRITER_DB
28e30 4d 4f 44 3b 0a 20 20 61 73 73 65 72 74 28 20 61  MOD;.  assert( a
28e40 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
28e50 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72  e(pPager) );.  r
28e60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
28e70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72  .}../*.** The ar
28e80 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69  gument is the fi
28e90 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b 65 64 20  rst in a linked 
28ea0 6c 69 73 74 20 6f 66 20 64 69 72 74 79 20 70 61  list of dirty pa
28eb0 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a  ges connected.**
28ec0 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44   by the PgHdr.pD
28ed0 69 72 74 79 20 70 6f 69 6e 74 65 72 2e 20 54 68  irty pointer. Th
28ee0 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74  is function writ
28ef0 65 73 20 65 61 63 68 20 6f 6e 65 20 6f 66 20 74  es each one of t
28f00 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20  he.** in-memory 
28f10 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73  pages in the lis
28f20 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
28f30 65 20 66 69 6c 65 2e 20 54 68 65 20 61 72 67 75  e file. The argu
28f40 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62 65 20 4e  ment may.** be N
28f50 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e 74 69 6e  ULL, representin
28f60 67 20 61 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e  g an empty list.
28f70 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
28f80 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a  is function is.*
28f90 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  * a no-op..**.**
28fa0 20 54 68 65 20 70 61 67 65 72 20 6d 75 73 74 20   The pager must 
28fb0 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 61 20  hold at least a 
28fc0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 77 68  RESERVED lock wh
28fd0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
28fe0 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 42  .** is called. B
28ff0 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 61 6e  efore writing an
29000 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61  ything to the da
29010 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69  tabase file, thi
29020 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75 70 67  s lock.** is upg
29030 72 61 64 65 64 20 74 6f 20 61 6e 20 45 58 43 4c  raded to an EXCL
29040 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 74  USIVE lock. If t
29050 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62  he lock cannot b
29060 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a 20 53  e obtained,.** S
29070 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
29080 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20 64 61  turned and no da
29090 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ta is written to
290a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
290b0 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68  le..** .** If th
290c0 65 20 70 61 67 65 72 20 69 73 20 61 20 74 65 6d  e pager is a tem
290d0 70 2d 66 69 6c 65 20 70 61 67 65 72 20 61 6e 64  p-file pager and
290e0 20 74 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65   the actual file
290f0 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a 2a 2a 20  -system file.** 
29100 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 2c  is not yet open,
29110 20 69 74 20 69 73 20 63 72 65 61 74 65 64 20 61   it is created a
29120 6e 64 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65  nd opened before
29130 20 61 6e 79 20 64 61 74 61 20 69 73 20 0a 2a 2a   any data is .**
29140 20 77 72 69 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a   written out..**
29150 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20 6c 6f 63  .** Once the loc
29160 6b 20 68 61 73 20 62 65 65 6e 20 75 70 67 72 61  k has been upgra
29170 64 65 64 20 61 6e 64 2c 20 69 66 20 6e 65 63 65  ded and, if nece
29180 73 73 61 72 79 2c 20 74 68 65 20 66 69 6c 65 20  ssary, the file 
29190 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68 65 20 70  opened,.** the p
291a0 61 67 65 73 20 61 72 65 20 77 72 69 74 74 65 6e  ages are written
291b0 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
291c0 62 61 73 65 20 66 69 6c 65 20 69 6e 20 6c 69 73  base file in lis
291d0 74 20 6f 72 64 65 72 2e 20 57 72 69 74 69 6e 67  t order. Writing
291e0 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 73 6b  .** a page is sk
291f0 69 70 70 65 64 20 69 66 20 69 74 20 6d 65 65 74  ipped if it meet
29200 73 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  s either of the 
29210 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72  following criter
29220 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68  ia:.**.**   * Th
29230 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
29240 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 50 61   greater than Pa
29250 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f 72 0a 2a  ger.dbSize, or.*
29260 2a 20 20 20 2a 20 54 68 65 20 50 47 48 44 52 5f  *   * The PGHDR_
29270 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 20  DONT_WRITE flag 
29280 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20 70 61  is set on the pa
29290 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 69  ge..**.** If wri
292a0 74 69 6e 67 20 6f 75 74 20 61 20 70 61 67 65 20  ting out a page 
292b0 63 61 75 73 65 73 20 74 68 65 20 64 61 74 61 62  causes the datab
292c0 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77  ase file to grow
292d0 2c 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69  , Pager.dbFileSi
292e0 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61 74 65 64  ze.** is updated
292f0 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66   accordingly. If
29300 20 70 61 67 65 20 31 20 69 73 20 77 72 69 74 74   page 1 is writt
29310 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20 74 68 65  en out, then the
29320 20 76 61 6c 75 65 20 63 61 63 68 65 64 0a 2a 2a   value cached.**
29330 20 69 6e 20 50 61 67 65 72 2e 64 62 46 69 6c 65   in Pager.dbFile
29340 56 65 72 73 5b 5d 20 69 73 20 75 70 64 61 74 65  Vers[] is update
29350 64 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 6e  d to match the n
29360 65 77 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  ew value stored 
29370 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  in.** the databa
29380 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  se file..**.** I
29390 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  f everything is 
293a0 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49  successful, SQLI
293b0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
293c0 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
293d0 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 61 6e  r .** occurs, an
293e0 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
293f0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20  s returned. Or, 
29400 69 66 20 74 68 65 20 45 58 43 4c 55 53 49 56 45  if the EXCLUSIVE
29410 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20   lock cannot.** 
29420 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 53 51 4c  be obtained, SQL
29430 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
29440 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
29450 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f  int pager_write_
29460 70 61 67 65 6c 69 73 74 28 50 61 67 65 72 20 2a  pagelist(Pager *
29470 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70  pPager, PgHdr *p
29480 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  List){.  int rc 
29490 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
294a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
294b0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
294c0 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74  .  /* This funct
294d0 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ion is only call
294e0 65 64 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  ed for rollback 
294f0 70 61 67 65 72 73 20 69 6e 20 57 52 49 54 45 52  pagers in WRITER
29500 5f 44 42 4d 4f 44 20 73 74 61 74 65 2e 20 2a 2f  _DBMOD state. */
29510 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65  .  assert( !page
29520 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
29530 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
29540 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
29550 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
29560 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
29570 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c  ger->eLock==EXCL
29580 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20  USIVE_LOCK );.. 
29590 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
295a0 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 68  is a temp-file h
295b0 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  as not yet been 
295c0 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20  opened, open it 
295d0 6e 6f 77 2e 20 49 74 0a 20 20 2a 2a 20 69 73 20  now. It.  ** is 
295e0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72  not possible for
295f0 20 72 63 20 74 6f 20 62 65 20 6f 74 68 65 72 20   rc to be other 
29600 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  than SQLITE_OK i
29610 66 20 74 68 69 73 20 62 72 61 6e 63 68 0a 20 20  f this branch.  
29620 2a 2a 20 69 73 20 74 61 6b 65 6e 2c 20 61 73 20  ** is taken, as 
29630 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
29640 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20  ck() is a no-op 
29650 66 6f 72 20 74 65 6d 70 2d 66 69 6c 65 73 2e 0a  for temp-files..
29660 20 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f 70    */.  if( !isOp
29670 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
29680 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
29690 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26  ager->tempFile &
296a0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
296b0 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  );.    rc = page
296c0 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72  rOpentemp(pPager
296d0 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  , pPager->fd, pP
296e0 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 29 3b  ager->vfsFlags);
296f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72  .  }..  /* Befor
29700 65 20 74 68 65 20 66 69 72 73 74 20 77 72 69 74  e the first writ
29710 65 2c 20 67 69 76 65 20 74 68 65 20 56 46 53 20  e, give the VFS 
29720 61 20 68 69 6e 74 20 6f 66 20 77 68 61 74 20 74  a hint of what t
29730 68 65 20 66 69 6e 61 6c 0a 20 20 2a 2a 20 66 69  he final.  ** fi
29740 6c 65 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 2e  le size will be.
29750 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
29760 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
29770 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
29780 66 64 29 20 29 3b 0a 20 20 69 66 28 20 72 63 3d  fd) );.  if( rc=
29790 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 26  =SQLITE_OK .   &
297a0 26 20 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74  & pPager->dbHint
297b0 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 53  Size<pPager->dbS
297c0 69 7a 65 0a 20 20 20 26 26 20 28 70 4c 69 73 74  ize.   && (pList
297d0 2d 3e 70 44 69 72 74 79 20 7c 7c 20 70 4c 69 73  ->pDirty || pLis
297e0 74 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  t->pgno>pPager->
297f0 64 62 48 69 6e 74 53 69 7a 65 29 0a 20 20 29 7b  dbHintSize).  ){
29800 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  .    sqlite3_int
29810 36 34 20 73 7a 46 69 6c 65 20 3d 20 70 50 61 67  64 szFile = pPag
29820 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2a 20 28  er->pageSize * (
29830 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70 50  sqlite3_int64)pP
29840 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
29850 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43    sqlite3OsFileC
29860 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65  ontrolHint(pPage
29870 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43  r->fd, SQLITE_FC
29880 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 2c 20 26  NTL_SIZE_HINT, &
29890 73 7a 46 69 6c 65 29 3b 0a 20 20 20 20 70 50 61  szFile);.    pPa
298a0 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20  ger->dbHintSize 
298b0 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
298c0 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20  ;.  }..  while( 
298d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
298e0 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 50 67   pList ){.    Pg
298f0 6e 6f 20 70 67 6e 6f 20 3d 20 70 4c 69 73 74 2d  no pgno = pList-
29900 3e 70 67 6e 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49  >pgno;..    /* I
29910 66 20 74 68 65 72 65 20 61 72 65 20 64 69 72 74  f there are dirt
29920 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70  y pages in the p
29930 61 67 65 20 63 61 63 68 65 20 77 69 74 68 20 70  age cache with p
29940 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61  age numbers grea
29950 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20  ter.    ** than 
29960 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68  Pager.dbSize, th
29970 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65 33  is means sqlite3
29980 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61  PagerTruncateIma
29990 67 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64 20  ge() was called 
299a0 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74  to.    ** make t
299b0 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20  he file smaller 
299c0 28 70 72 65 73 75 6d 61 62 6c 79 20 62 79 20 61  (presumably by a
299d0 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65 29  uto-vacuum code)
299e0 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20  . Do not write. 
299f0 20 20 20 2a 2a 20 61 6e 79 20 73 75 63 68 20 70     ** any such p
29a00 61 67 65 73 20 74 6f 20 74 68 65 20 66 69 6c 65  ages to the file
29a10 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
29a20 41 6c 73 6f 2c 20 64 6f 20 6e 6f 74 20 77 72 69  Also, do not wri
29a30 74 65 20 6f 75 74 20 61 6e 79 20 70 61 67 65 20  te out any page 
29a40 74 68 61 74 20 68 61 73 20 74 68 65 20 50 47 48  that has the PGH
29a50 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c  DR_DONT_WRITE fl
29a60 61 67 0a 20 20 20 20 2a 2a 20 73 65 74 20 28 73  ag.    ** set (s
29a70 65 74 20 62 79 20 73 71 6c 69 74 65 33 50 61 67  et by sqlite3Pag
29a80 65 72 44 6f 6e 74 57 72 69 74 65 28 29 29 2e 0a  erDontWrite())..
29a90 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
29aa0 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53  gno<=pPager->dbS
29ab0 69 7a 65 20 26 26 20 30 3d 3d 28 70 4c 69 73 74  ize && 0==(pList
29ac0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 4f  ->flags&PGHDR_DO
29ad0 4e 54 5f 57 52 49 54 45 29 20 29 7b 0a 20 20 20  NT_WRITE) ){.   
29ae0 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
29af0 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
29b00 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20  ager->pageSize; 
29b10 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 77    /* Offset to w
29b20 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 63 68  rite */.      ch
29b30 61 72 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20  ar *pData;      
29b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29b60 44 61 74 61 20 74 6f 20 77 72 69 74 65 20 2a 2f  Data to write */
29b70 20 20 20 20 0a 0a 20 20 20 20 20 20 61 73 73 65      ..      asse
29b80 72 74 28 20 28 70 4c 69 73 74 2d 3e 66 6c 61 67  rt( (pList->flag
29b90 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
29ba0 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  C)==0 );.      i
29bb0 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d  f( pList->pgno==
29bc0 31 20 29 20 70 61 67 65 72 5f 77 72 69 74 65 5f  1 ) pager_write_
29bd0 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 4c  changecounter(pL
29be0 69 73 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ist);..      /* 
29bf0 45 6e 63 6f 64 65 20 74 68 65 20 64 61 74 61 62  Encode the datab
29c00 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 43 4f 44  ase */.      COD
29c10 45 43 32 28 70 50 61 67 65 72 2c 20 70 4c 69 73  EC2(pPager, pLis
29c20 74 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20  t->pData, pgno, 
29c30 36 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  6, return SQLITE
29c40 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 29 3b 0a  _NOMEM, pData);.
29c50 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20  .      /* Write 
29c60 6f 75 74 20 74 68 65 20 70 61 67 65 20 64 61 74  out the page dat
29c70 61 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  a. */.      rc =
29c80 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
29c90 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61 74  pPager->fd, pDat
29ca0 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
29cb0 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 0a 20  ize, offset);.. 
29cc0 20 20 20 20 20 2f 2a 20 49 66 20 70 61 67 65 20       /* If page 
29cd0 31 20 77 61 73 20 6a 75 73 74 20 77 72 69 74 74  1 was just writt
29ce0 65 6e 2c 20 75 70 64 61 74 65 20 50 61 67 65 72  en, update Pager
29cf0 2e 64 62 46 69 6c 65 56 65 72 73 20 74 6f 20 6d  .dbFileVers to m
29d00 61 74 63 68 0a 20 20 20 20 20 20 2a 2a 20 74 68  atch.      ** th
29d10 65 20 76 61 6c 75 65 20 6e 6f 77 20 73 74 6f 72  e value now stor
29d20 65 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ed in the databa
29d30 73 65 20 66 69 6c 65 2e 20 49 66 20 77 72 69 74  se file. If writ
29d40 69 6e 67 20 74 68 69 73 20 0a 20 20 20 20 20 20  ing this .      
29d50 2a 2a 20 70 61 67 65 20 63 61 75 73 65 64 20 74  ** page caused t
29d60 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
29d70 20 74 6f 20 67 72 6f 77 2c 20 75 70 64 61 74 65   to grow, update
29d80 20 64 62 46 69 6c 65 53 69 7a 65 2e 20 0a 20 20   dbFileSize. .  
29d90 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
29da0 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
29db0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
29dc0 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
29dd0 26 70 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65  &pData[24], size
29de0 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
29df0 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d  eVers));.      }
29e00 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e  .      if( pgno>
29e10 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
29e20 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  ze ){.        pP
29e30 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
29e40 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d   = pgno;.      }
29e50 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61  .      pPager->a
29e60 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f  Stat[PAGER_STAT_
29e70 57 52 49 54 45 5d 2b 2b 3b 0a 0a 20 20 20 20 20  WRITE]++;..     
29e80 20 2f 2a 20 55 70 64 61 74 65 20 61 6e 79 20 62   /* Update any b
29e90 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20 63 6f  ackup objects co
29ea0 70 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  pying the conten
29eb0 74 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 72  ts of this pager
29ec0 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
29ed0 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 70  e3BackupUpdate(p
29ee0 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20  Pager->pBackup, 
29ef0 70 67 6e 6f 2c 20 28 75 38 2a 29 70 4c 69 73 74  pgno, (u8*)pList
29f00 2d 3e 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20  ->pData);..     
29f10 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54   PAGERTRACE(("ST
29f20 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 20 68  ORE %d page %d h
29f30 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20  ash(%08x)\n",.  
29f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f50 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
29f60 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61  , pgno, pager_pa
29f70 67 65 68 61 73 68 28 70 4c 69 73 74 29 29 29 3b  gehash(pList)));
29f80 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
29f90 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c  "PGOUT %p %d\n",
29fa0 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b   pPager, pgno));
29fb0 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43  .      PAGER_INC
29fc0 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  R(sqlite3_pager_
29fd0 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a  writedb_count);.
29fe0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29ff0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4e 4f   PAGERTRACE(("NO
2a000 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64  STORE %d page %d
2a010 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
2a020 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ger), pgno));.  
2a030 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65    }.    pager_se
2a040 74 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74  t_pagehash(pList
2a050 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70  );.    pList = p
2a060 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20  List->pDirty;.  
2a070 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
2a080 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65 20  }../*.** Ensure 
2a090 74 68 61 74 20 74 68 65 20 73 75 62 2d 6a 6f 75  that the sub-jou
2a0a0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
2a0b0 6e 2e 20 49 66 20 69 74 20 69 73 20 61 6c 72 65  n. If it is alre
2a0c0 61 64 79 20 6f 70 65 6e 2c 20 74 68 69 73 20 0a  ady open, this .
2a0d0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  ** function is a
2a0e0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51   no-op..**.** SQ
2a0f0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
2a100 6e 65 64 20 69 66 20 65 76 65 72 79 74 68 69 6e  ned if everythin
2a110 67 20 67 6f 65 73 20 61 63 63 6f 72 64 69 6e 67  g goes according
2a120 20 74 6f 20 70 6c 61 6e 2e 20 41 6e 20 0a 2a 2a   to plan. An .**
2a130 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58   SQLITE_IOERR_XX
2a140 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  X error code is 
2a150 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 63 61  returned if a ca
2a160 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4f  ll to sqlite3OsO
2a170 70 65 6e 28 29 20 0a 2a 2a 20 66 61 69 6c 73 2e  pen() .** fails.
2a180 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f  .*/.static int o
2a190 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 50 61  penSubJournal(Pa
2a1a0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
2a1b0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2a1c0 4f 4b 3b 0a 20 20 69 66 28 20 21 69 73 4f 70 65  OK;.  if( !isOpe
2a1d0 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20  n(pPager->sjfd) 
2a1e0 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
2a1f0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
2a200 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2a210 45 5f 4d 45 4d 4f 52 59 20 7c 7c 20 70 50 61 67  E_MEMORY || pPag
2a220 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  er->subjInMemory
2a230 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2a240 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28  3MemJournalOpen(
2a250 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20  pPager->sjfd);. 
2a260 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a270 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65  rc = pagerOpente
2a280 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  mp(pPager, pPage
2a290 72 2d 3e 73 6a 66 64 2c 20 53 51 4c 49 54 45 5f  r->sjfd, SQLITE_
2a2a0 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 29  OPEN_SUBJOURNAL)
2a2b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2a2c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2a2d0 2a 20 41 70 70 65 6e 64 20 61 20 72 65 63 6f 72  * Append a recor
2a2e0 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  d of the current
2a2f0 20 73 74 61 74 65 20 6f 66 20 70 61 67 65 20 70   state of page p
2a300 50 67 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f  Pg to the sub-jo
2a310 75 72 6e 61 6c 2e 20 0a 2a 2a 20 49 74 20 69 73  urnal. .** It is
2a320 20 74 68 65 20 63 61 6c 6c 65 72 73 20 72 65 73   the callers res
2a330 70 6f 6e 73 69 62 69 6c 69 74 79 20 74 6f 20 75  ponsibility to u
2a340 73 65 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  se subjRequiresP
2a350 61 67 65 28 29 20 74 6f 20 63 68 65 63 6b 20 0a  age() to check .
2a360 2a 2a 20 74 68 61 74 20 69 74 20 69 73 20 72 65  ** that it is re
2a370 61 6c 6c 79 20 72 65 71 75 69 72 65 64 20 62 65  ally required be
2a380 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69  fore calling thi
2a390 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
2a3a0 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
2a3b0 20 73 65 74 20 74 68 65 20 62 69 74 20 63 6f 72   set the bit cor
2a3c0 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 50  responding to pP
2a3d0 67 2d 3e 70 67 6e 6f 20 69 6e 20 74 68 65 20 62  g->pgno in the b
2a3e0 69 74 76 65 63 73 0a 2a 2a 20 66 6f 72 20 61 6c  itvecs.** for al
2a3f0 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  l open savepoint
2a400 73 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  s before returni
2a410 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ng..**.** This f
2a420 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
2a430 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
2a440 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65  rything is succe
2a450 73 73 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20  ssful, an IO.** 
2a460 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 74 68  error code if th
2a470 65 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69  e attempt to wri
2a480 74 65 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f  te to the sub-jo
2a490 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20  urnal fails, or 
2a4a0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
2a4b0 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69   if a malloc fai
2a4c0 6c 73 20 77 68 69 6c 65 20 73 65 74 74 69 6e 67  ls while setting
2a4d0 20 61 20 62 69 74 20 69 6e 20 61 20 73 61 76 65   a bit in a save
2a4e0 70 6f 69 6e 74 0a 2a 2a 20 62 69 74 76 65 63 2e  point.** bitvec.
2a4f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
2a500 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 50 67  ubjournalPage(Pg
2a510 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74  Hdr *pPg){.  int
2a520 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2a530 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
2a540 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
2a550 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
2a560 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
2a570 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
2a580 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e   ){..    /* Open
2a590 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
2a5a0 2c 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74 20  , if it has not 
2a5b0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65  already been ope
2a5c0 6e 65 64 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ned */.    asser
2a5d0 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  t( pPager->useJo
2a5e0 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61 73 73  urnal );.    ass
2a5f0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
2a600 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 61 67 65  er->jfd) || page
2a610 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
2a620 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
2a630 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  sOpen(pPager->sj
2a640 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e  fd) || pPager->n
2a650 53 75 62 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20  SubRec==0 );.   
2a660 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
2a670 65 57 61 6c 28 70 50 61 67 65 72 29 20 0a 20 20  eWal(pPager) .  
2a680 20 20 20 20 20 20 20 7c 7c 20 70 61 67 65 49 6e         || pageIn
2a690 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20  Journal(pPager, 
2a6a0 70 50 67 29 20 0a 20 20 20 20 20 20 20 20 20 7c  pPg) .         |
2a6b0 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67  | pPg->pgno>pPag
2a6c0 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a  er->dbOrigSize .
2a6d0 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20      );.    rc = 
2a6e0 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70  openSubJournal(p
2a6f0 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20  Pager);..    /* 
2a700 49 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  If the sub-journ
2a710 61 6c 20 77 61 73 20 6f 70 65 6e 65 64 20 73 75  al was opened su
2a720 63 63 65 73 73 66 75 6c 6c 79 20 28 6f 72 20 77  ccessfully (or w
2a730 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29  as already open)
2a740 2c 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20 74  ,.    ** write t
2a750 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  he journal recor
2a760 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e  d into the file.
2a770 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
2a780 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2a790 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20      void *pData 
2a7a0 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20  = pPg->pData;.  
2a7b0 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
2a7c0 20 28 69 36 34 29 70 50 61 67 65 72 2d 3e 6e 53   (i64)pPager->nS
2a7d0 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d  ubRec*(4+pPager-
2a7e0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
2a7f0 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a    char *pData2;.
2a800 20 20 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28    .      CODEC2(
2a810 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
2a820 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74  Pg->pgno, 7, ret
2a830 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2a840 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20  , pData2);.     
2a850 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54   PAGERTRACE(("ST
2a860 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  MT-JOURNAL %d pa
2a870 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
2a880 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
2a890 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 72 63  pgno));.      rc
2a8a0 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
2a8b0 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66  Pager->sjfd, off
2a8c0 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  set, pPg->pgno);
2a8d0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
2a8e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2a8f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2a900 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
2a910 73 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50  sjfd, pData2, pP
2a920 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
2a930 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 20 20 20  offset+4);.     
2a940 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
2a950 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2a960 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
2a970 6e 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61  nSubRec++;.    a
2a980 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
2a990 53 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20  Savepoint>0 );. 
2a9a0 20 20 20 72 63 20 3d 20 61 64 64 54 6f 53 61 76     rc = addToSav
2a9b0 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50  epointBitvecs(pP
2a9c0 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ager, pPg->pgno)
2a9d0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2a9e0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
2a9f0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2aa00 6c 65 64 20 62 79 20 74 68 65 20 70 63 61 63 68  led by the pcach
2aa10 65 20 6c 61 79 65 72 20 77 68 65 6e 20 69 74 20  e layer when it 
2aa20 68 61 73 20 72 65 61 63 68 65 64 20 73 6f 6d 65  has reached some
2aa30 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20  .** soft memory 
2aa40 6c 69 6d 69 74 2e 20 54 68 65 20 66 69 72 73 74  limit. The first
2aa50 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70   argument is a p
2aa60 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65  ointer to a Page
2aa70 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61 73  r object.** (cas
2aa80 74 20 61 73 20 61 20 76 6f 69 64 2a 29 2e 20 54  t as a void*). T
2aa90 68 65 20 70 61 67 65 72 20 69 73 20 61 6c 77 61  he pager is alwa
2aaa0 79 73 20 27 70 75 72 67 65 61 62 6c 65 27 20 28  ys 'purgeable' (
2aab0 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  not an in-memory
2aac0 0a 2a 2a 20 64 61 74 61 62 61 73 65 29 2e 20 54  .** database). T
2aad0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
2aae0 6e 74 20 69 73 20 61 20 72 65 66 65 72 65 6e 63  nt is a referenc
2aaf0 65 20 74 6f 20 61 20 70 61 67 65 20 74 68 61 74  e to a page that
2ab00 20 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c   is .** currentl
2ab10 79 20 64 69 72 74 79 20 62 75 74 20 68 61 73 20  y dirty but has 
2ab20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  no outstanding r
2ab30 65 66 65 72 65 6e 63 65 73 2e 20 54 68 65 20 70  eferences. The p
2ab40 61 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73  age.** is always
2ab50 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2ab60 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
2ab70 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
2ab80 66 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65  first .** argume
2ab90 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f  nt..**.** The jo
2aba0 62 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  b of this functi
2abb0 6f 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20 70 50  on is to make pP
2abc0 67 20 63 6c 65 61 6e 20 62 79 20 77 72 69 74 69  g clean by writi
2abd0 6e 67 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a  ng its contents.
2abe0 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  ** out to the da
2abf0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 66 20  tabase file, if 
2ac00 70 6f 73 73 69 62 6c 65 2e 20 54 68 69 73 20 6d  possible. This m
2ac10 61 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63 69  ay involve synci
2ac20 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  ng the.** journa
2ac30 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49  l file. .**.** I
2ac40 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 71  f successful, sq
2ac50 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43  lite3PcacheMakeC
2ac60 6c 65 61 6e 28 29 20 69 73 20 63 61 6c 6c 65 64  lean() is called
2ac70 20 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e 64   on the page and
2ac80 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  .** SQLITE_OK re
2ac90 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
2aca0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
2acb0 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6d 61  ile trying to ma
2acc0 6b 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63  ke the.** page c
2acd0 6c 65 61 6e 2c 20 74 68 65 20 49 4f 20 65 72 72  lean, the IO err
2ace0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
2acf0 6e 65 64 2e 20 49 66 20 74 68 65 20 70 61 67 65  ned. If the page
2ad00 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61   cannot be.** ma
2ad10 64 65 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f 6d  de clean for som
2ad20 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c 20  e other reason, 
2ad30 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63  but no error occ
2ad40 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  urs, then SQLITE
2ad50 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  _OK.** is return
2ad60 65 64 20 62 79 20 73 71 6c 69 74 65 33 50 63 61  ed by sqlite3Pca
2ad70 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69  cheMakeClean() i
2ad80 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f  s not called..*/
2ad90 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
2ada0 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a 70 2c  rStress(void *p,
2adb0 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20   PgHdr *pPg){.  
2adc0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
2add0 28 50 61 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e  (Pager *)p;.  in
2ade0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2adf0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  ;..  assert( pPg
2ae00 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72  ->pPager==pPager
2ae10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
2ae20 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
2ae30 49 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  IRTY );..  /* Th
2ae40 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 4e 4f 53  e doNotSpill NOS
2ae50 59 4e 43 20 62 69 74 20 69 73 20 73 65 74 20 64  YNC bit is set d
2ae60 75 72 69 6e 67 20 74 69 6d 65 73 20 77 68 65 6e  uring times when
2ae70 20 64 6f 69 6e 67 20 61 20 73 79 6e 63 20 6f 66   doing a sync of
2ae80 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61  .  ** journal (a
2ae90 6e 64 20 61 64 64 69 6e 67 20 61 20 6e 65 77 20  nd adding a new 
2aea0 68 65 61 64 65 72 29 20 69 73 20 6e 6f 74 20 61  header) is not a
2aeb0 6c 6c 6f 77 65 64 2e 20 20 54 68 69 73 20 6f 63  llowed.  This oc
2aec0 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67  curs.  ** during
2aed0 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
2aee0 33 50 61 67 65 72 57 72 69 74 65 28 29 20 77 68  3PagerWrite() wh
2aef0 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6a 6f  ile trying to jo
2af00 75 72 6e 61 6c 20 6d 75 6c 74 69 70 6c 65 0a 20  urnal multiple. 
2af10 20 2a 2a 20 70 61 67 65 73 20 62 65 6c 6f 6e 67   ** pages belong
2af20 69 6e 67 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ing to the same 
2af30 73 65 63 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a  sector..  **.  *
2af40 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c  * The doNotSpill
2af50 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 4f 46   ROLLBACK and OF
2af60 46 20 62 69 74 73 20 69 6e 68 69 62 69 74 73 20  F bits inhibits 
2af70 61 6c 6c 20 63 61 63 68 65 20 73 70 69 6c 6c 69  all cache spilli
2af80 6e 67 0a 20 20 2a 2a 20 72 65 67 61 72 64 6c 65  ng.  ** regardle
2af90 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72  ss of whether or
2afa0 20 6e 6f 74 20 61 20 73 79 6e 63 20 69 73 20 72   not a sync is r
2afb0 65 71 75 69 72 65 64 2e 20 20 54 68 69 73 20 69  equired.  This i
2afc0 73 20 73 65 74 20 64 75 72 69 6e 67 0a 20 20 2a  s set during.  *
2afd0 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20  * a rollback or 
2afe0 62 79 20 75 73 65 72 20 72 65 71 75 65 73 74 2c  by user request,
2aff0 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 20   respectively.. 
2b000 20 2a 2a 0a 20 20 2a 2a 20 53 70 69 6c 6c 69 6e   **.  ** Spillin
2b010 67 20 69 73 20 61 6c 73 6f 20 70 72 6f 68 69 62  g is also prohib
2b020 69 74 65 64 20 77 68 65 6e 20 69 6e 20 61 6e 20  ited when in an 
2b030 65 72 72 6f 72 20 73 74 61 74 65 20 73 69 6e 63  error state sinc
2b040 65 20 74 68 61 74 20 63 6f 75 6c 64 0a 20 20 2a  e that could.  *
2b050 2a 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61  * lead to databa
2b060 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20  se corruption.  
2b070 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   In the current 
2b080 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69  implementation i
2b090 74 20 0a 20 20 2a 2a 20 69 73 20 69 6d 70 6f 73  t .  ** is impos
2b0a0 73 69 62 6c 65 20 66 6f 72 20 73 71 6c 69 74 65  sible for sqlite
2b0b0 33 50 63 61 63 68 65 46 65 74 63 68 28 29 20 74  3PcacheFetch() t
2b0c0 6f 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68  o be called with
2b0d0 20 63 72 65 61 74 65 46 6c 61 67 3d 3d 33 0a 20   createFlag==3. 
2b0e0 20 2a 2a 20 77 68 69 6c 65 20 69 6e 20 74 68 65   ** while in the
2b0f0 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 68 65   error state, he
2b100 6e 63 65 20 69 74 20 69 73 20 69 6d 70 6f 73 73  nce it is imposs
2b110 69 62 6c 65 20 66 6f 72 20 74 68 69 73 20 72 6f  ible for this ro
2b120 75 74 69 6e 65 20 74 6f 0a 20 20 2a 2a 20 62 65  utine to.  ** be
2b130 20 63 61 6c 6c 65 64 20 69 6e 20 74 68 65 20 65   called in the e
2b140 72 72 6f 72 20 73 74 61 74 65 2e 20 20 4e 65 76  rror state.  Nev
2b150 65 72 74 68 65 6c 65 73 73 2c 20 77 65 20 69 6e  ertheless, we in
2b160 63 6c 75 64 65 20 61 20 4e 45 56 45 52 28 29 0a  clude a NEVER().
2b170 20 20 2a 2a 20 74 65 73 74 20 66 6f 72 20 74 68    ** test for th
2b180 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 61 73  e error state as
2b190 20 61 20 73 61 66 65 67 75 61 72 64 20 61 67 61   a safeguard aga
2b1a0 69 6e 73 74 20 66 75 74 75 72 65 20 63 68 61 6e  inst future chan
2b1b0 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ges..  */.  if( 
2b1c0 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72  NEVER(pPager->er
2b1d0 72 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20  rCode) ) return 
2b1e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 74 65 73  SQLITE_OK;.  tes
2b1f0 74 63 61 73 65 28 20 70 50 61 67 65 72 2d 3e 64  tcase( pPager->d
2b200 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c  oNotSpill & SPIL
2b210 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 29  LFLAG_ROLLBACK )
2b220 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 50  ;.  testcase( pP
2b230 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
2b240 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46   & SPILLFLAG_OFF
2b250 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
2b260 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
2b270 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 4e  ll & SPILLFLAG_N
2b280 4f 53 59 4e 43 20 29 3b 0a 20 20 69 66 28 20 70  OSYNC );.  if( p
2b290 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
2b2a0 6c 0a 20 20 20 26 26 20 28 28 70 50 61 67 65 72  l.   && ((pPager
2b2b0 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 28  ->doNotSpill & (
2b2c0 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41  SPILLFLAG_ROLLBA
2b2d0 43 4b 7c 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46  CK|SPILLFLAG_OFF
2b2e0 29 29 21 3d 30 0a 20 20 20 20 20 20 7c 7c 20 28  ))!=0.      || (
2b2f0 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48  pPg->flags & PGH
2b300 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30  DR_NEED_SYNC)!=0
2b310 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
2b320 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
2b330 0a 0a 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20  ..  pPg->pDirty 
2b340 3d 20 30 3b 0a 20 20 69 66 28 20 70 61 67 65 72  = 0;.  if( pager
2b350 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
2b360 7b 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61  {.    /* Write a
2b370 20 73 69 6e 67 6c 65 20 66 72 61 6d 65 20 66 6f   single frame fo
2b380 72 20 74 68 69 73 20 70 61 67 65 20 74 6f 20 74  r this page to t
2b390 68 65 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 69  he log. */.    i
2b3a0 66 28 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  f( subjRequiresP
2b3b0 61 67 65 28 70 50 67 29 20 29 7b 20 0a 20 20 20  age(pPg) ){ .   
2b3c0 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e     rc = subjourn
2b3d0 61 6c 50 61 67 65 28 70 50 67 29 3b 20 0a 20 20  alPage(pPg); .  
2b3e0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
2b3f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2b400 20 20 20 72 63 20 3d 20 70 61 67 65 72 57 61 6c     rc = pagerWal
2b410 46 72 61 6d 65 73 28 70 50 61 67 65 72 2c 20 70  Frames(pPager, p
2b420 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  Pg, 0, 0);.    }
2b430 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20 20 20  .  }else{.  .   
2b440 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75   /* Sync the jou
2b450 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 72 65 71  rnal file if req
2b460 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66  uired. */.    if
2b470 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ( pPg->flags&PGH
2b480 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 0a 20 20  DR_NEED_SYNC .  
2b490 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
2b4a0 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
2b4b0 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20  ER_CACHEMOD.    
2b4c0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79  ){.      rc = sy
2b4d0 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ncJournal(pPager
2b4e0 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  , 1);.    }.  . 
2b4f0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67     /* If the pag
2b500 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 69 73  e number of this
2b510 20 70 61 67 65 20 69 73 20 6c 61 72 67 65 72 20   page is larger 
2b520 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
2b530 20 73 69 7a 65 20 6f 66 0a 20 20 20 20 2a 2a 20   size of.    ** 
2b540 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
2b550 67 65 2c 20 69 74 20 6d 61 79 20 6e 65 65 64 20  ge, it may need 
2b560 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  to be written to
2b570 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
2b580 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73  ..    ** This is
2b590 20 62 65 63 61 75 73 65 20 74 68 65 20 63 61 6c   because the cal
2b5a0 6c 20 74 6f 20 70 61 67 65 72 5f 77 72 69 74 65  l to pager_write
2b5b0 5f 70 61 67 65 6c 69 73 74 28 29 20 62 65 6c 6f  _pagelist() belo
2b5c0 77 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 20 20 2a  w will not.    *
2b5d0 2a 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74 65  * actually write
2b5e0 20 64 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c   data to the fil
2b5f0 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  e in this case..
2b600 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6f      **.    ** Co
2b610 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f  nsider the follo
2b620 77 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 66  wing sequence of
2b630 20 65 76 65 6e 74 73 3a 0a 20 20 20 20 2a 2a 0a   events:.    **.
2b640 20 20 20 20 2a 2a 20 20 20 42 45 47 49 4e 3b 0a      **   BEGIN;.
2b650 20 20 20 20 2a 2a 20 20 20 20 20 3c 6a 6f 75 72      **     <jour
2b660 6e 61 6c 20 70 61 67 65 20 58 3e 0a 20 20 20 20  nal page X>.    
2b670 2a 2a 20 20 20 20 20 3c 6d 6f 64 69 66 79 20 70  **     <modify p
2b680 61 67 65 20 58 3e 0a 20 20 20 20 2a 2a 20 20 20  age X>.    **   
2b690 20 20 53 41 56 45 50 4f 49 4e 54 20 73 70 3b 0a    SAVEPOINT sp;.
2b6a0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 3c 73 68      **       <sh
2b6b0 72 69 6e 6b 20 64 61 74 61 62 61 73 65 20 66 69  rink database fi
2b6c0 6c 65 20 74 6f 20 59 20 70 61 67 65 73 3e 0a 20  le to Y pages>. 
2b6d0 20 20 20 2a 2a 20 20 20 20 20 20 20 70 61 67 65     **       page
2b6e0 72 53 74 72 65 73 73 28 70 61 67 65 20 58 29 0a  rStress(page X).
2b6f0 20 20 20 20 2a 2a 20 20 20 20 20 52 4f 4c 4c 42      **     ROLLB
2b700 41 43 4b 20 54 4f 20 73 70 3b 0a 20 20 20 20 2a  ACK TO sp;.    *
2b710 2a 0a 20 20 20 20 2a 2a 20 49 66 20 28 58 3e 59  *.    ** If (X>Y
2b720 29 2c 20 74 68 65 6e 20 77 68 65 6e 20 70 61 67  ), then when pag
2b730 65 72 53 74 72 65 73 73 20 69 73 20 63 61 6c 6c  erStress is call
2b740 65 64 20 70 61 67 65 20 58 20 77 69 6c 6c 20 6e  ed page X will n
2b750 6f 74 20 62 65 20 77 72 69 74 74 65 6e 0a 20 20  ot be written.  
2b760 20 20 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20    ** out to the 
2b770 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 62  database file, b
2b780 75 74 20 77 69 6c 6c 20 62 65 20 64 72 6f 70 70  ut will be dropp
2b790 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68  ed from the cach
2b7a0 65 2e 20 54 68 65 6e 2c 0a 20 20 20 20 2a 2a 20  e. Then,.    ** 
2b7b0 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 22 52  following the "R
2b7c0 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22 20 73  OLLBACK TO sp" s
2b7d0 74 61 74 65 6d 65 6e 74 2c 20 72 65 61 64 69 6e  tatement, readin
2b7e0 67 20 70 61 67 65 20 58 20 77 69 6c 6c 20 72 65  g page X will re
2b7f0 61 64 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 66  ad.    ** data f
2b800 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
2b810 20 66 69 6c 65 2e 20 54 68 69 73 20 77 69 6c 6c   file. This will
2b820 20 62 65 20 74 68 65 20 63 6f 70 79 20 6f 66 20   be the copy of 
2b830 70 61 67 65 20 58 20 61 73 20 69 74 0a 20 20 20  page X as it.   
2b840 20 2a 2a 20 77 61 73 20 77 68 65 6e 20 74 68 65   ** was when the
2b850 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61   transaction sta
2b860 72 74 65 64 2c 20 6e 6f 74 20 61 73 20 69 74 20  rted, not as it 
2b870 77 61 73 20 77 68 65 6e 20 22 53 41 56 45 50 4f  was when "SAVEPO
2b880 49 4e 54 20 73 70 22 0a 20 20 20 20 2a 2a 20 77  INT sp".    ** w
2b890 61 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20 20  as executed..   
2b8a0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73   **.    ** The s
2b8b0 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 77 72  olution is to wr
2b8c0 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
2b8d0 64 61 74 61 20 66 6f 72 20 70 61 67 65 20 58 20  data for page X 
2b8e0 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a  into the .    **
2b8f0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   sub-journal fil
2b900 65 20 6e 6f 77 20 28 69 66 20 69 74 20 69 73 20  e now (if it is 
2b910 6e 6f 74 20 61 6c 72 65 61 64 79 20 74 68 65 72  not already ther
2b920 65 29 2c 20 73 6f 20 74 68 61 74 20 69 74 20 77  e), so that it w
2b930 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 72 65  ill.    ** be re
2b940 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 63 75  stored to its cu
2b950 72 72 65 6e 74 20 76 61 6c 75 65 20 77 68 65 6e  rrent value when
2b960 20 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54   the "ROLLBACK T
2b970 4f 20 73 70 22 20 69 73 20 0a 20 20 20 20 2a 2a  O sp" is .    **
2b980 20 65 78 65 63 75 74 65 64 2e 0a 20 20 20 20 2a   executed..    *
2b990 2f 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28  /.    if( NEVER(
2b9a0 0a 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c  .        rc==SQL
2b9b0 49 54 45 5f 4f 4b 20 26 26 20 70 50 67 2d 3e 70  ITE_OK && pPg->p
2b9c0 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 53 69  gno>pPager->dbSi
2b9d0 7a 65 20 26 26 20 73 75 62 6a 52 65 71 75 69 72  ze && subjRequir
2b9e0 65 73 50 61 67 65 28 70 50 67 29 0a 20 20 20 20  esPage(pPg).    
2b9f0 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
2ba00 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70  subjournalPage(p
2ba10 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  Pg);.    }.  .  
2ba20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63    /* Write the c
2ba30 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
2ba40 61 67 65 20 6f 75 74 20 74 6f 20 74 68 65 20 64  age out to the d
2ba50 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
2ba60 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2ba70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2ba80 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c  assert( (pPg->fl
2ba90 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
2baa0 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  YNC)==0 );.     
2bab0 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
2bac0 65 5f 70 61 67 65 6c 69 73 74 28 70 50 61 67 65  e_pagelist(pPage
2bad0 72 2c 20 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  r, pPg);.    }. 
2bae0 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68   }..  /* Mark th
2baf0 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e  e page as clean.
2bb00 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
2bb10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50  LITE_OK ){.    P
2bb20 41 47 45 52 54 52 41 43 45 28 28 22 53 54 52 45  AGERTRACE(("STRE
2bb30 53 53 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  SS %d page %d\n"
2bb40 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
2bb50 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a  ), pPg->pgno));.
2bb60 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
2bb70 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b  eMakeClean(pPg);
2bb80 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
2bb90 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
2bba0 72 2c 20 72 63 29 3b 20 0a 7d 0a 0a 0a 2f 2a 0a  r, rc); .}.../*.
2bbb0 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  ** Allocate and 
2bbc0 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77  initialize a new
2bbd0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 6e   Pager object an
2bbe0 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20  d put a pointer 
2bbf0 74 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a 70 70 50  to it.** in *ppP
2bc00 61 67 65 72 2e 20 54 68 65 20 70 61 67 65 72 20  ager. The pager 
2bc10 73 68 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c  should eventuall
2bc20 79 20 62 65 20 66 72 65 65 64 20 62 79 20 70 61  y be freed by pa
2bc30 73 73 69 6e 67 20 69 74 0a 2a 2a 20 74 6f 20 73  ssing it.** to s
2bc40 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
2bc50 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46  ()..**.** The zF
2bc60 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74  ilename argument
2bc70 20 69 73 20 74 68 65 20 70 61 74 68 20 74 6f 20   is the path to 
2bc80 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2bc90 65 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66  e to open..** If
2bca0 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55   zFilename is NU
2bcb0 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d  LL then a random
2bcc0 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61  ly-named tempora
2bcd0 72 79 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  ry file is creat
2bce0 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61  ed.** and used a
2bcf0 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  s the file to be
2bd00 20 63 61 63 68 65 64 2e 20 54 65 6d 70 6f 72 61   cached. Tempora
2bd10 72 79 20 66 69 6c 65 73 20 61 72 65 20 62 65 20  ry files are be 
2bd20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d  deleted.** autom
2bd30 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 74 68  atically when th
2bd40 65 79 20 61 72 65 20 63 6c 6f 73 65 64 2e 20 49  ey are closed. I
2bd50 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22  f zFilename is "
2bd60 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 0a  :memory:" then .
2bd70 2a 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69  ** all informati
2bd80 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61  on is held in ca
2bd90 63 68 65 2e 20 49 74 20 69 73 20 6e 65 76 65 72  che. It is never
2bda0 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b   written to disk
2bdb0 2e 20 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20 62  . .** This can b
2bdc0 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
2bdd0 65 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ent an in-memory
2bde0 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
2bdf0 20 54 68 65 20 6e 45 78 74 72 61 20 70 61 72 61   The nExtra para
2be00 6d 65 74 65 72 20 73 70 65 63 69 66 69 65 73 20  meter specifies 
2be10 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
2be20 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c 6c  tes of space all
2be30 6f 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20  ocated.** along 
2be40 77 69 74 68 20 65 61 63 68 20 70 61 67 65 20 72  with each page r
2be50 65 66 65 72 65 6e 63 65 2e 20 54 68 69 73 20 73  eference. This s
2be60 70 61 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c  pace is availabl
2be70 65 20 74 6f 20 74 68 65 20 75 73 65 72 0a 2a 2a  e to the user.**
2be80 20 76 69 61 20 74 68 65 20 73 71 6c 69 74 65 33   via the sqlite3
2be90 50 61 67 65 72 47 65 74 45 78 74 72 61 28 29 20  PagerGetExtra() 
2bea0 41 50 49 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  API..**.** The f
2beb0 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69 73  lags argument is
2bec0 20 75 73 65 64 20 74 6f 20 73 70 65 63 69 66 79   used to specify
2bed0 20 70 72 6f 70 65 72 74 69 65 73 20 74 68 61 74   properties that
2bee0 20 61 66 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f   affect the.** o
2bef0 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  peration of the 
2bf00 70 61 67 65 72 2e 20 49 74 20 73 68 6f 75 6c 64  pager. It should
2bf10 20 62 65 20 70 61 73 73 65 64 20 73 6f 6d 65 20   be passed some 
2bf20 62 69 74 77 69 73 65 20 63 6f 6d 62 69 6e 61 74  bitwise combinat
2bf30 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41  ion.** of the PA
2bf40 47 45 52 5f 2a 20 66 6c 61 67 73 2e 0a 2a 2a 0a  GER_* flags..**.
2bf50 2a 2a 20 54 68 65 20 76 66 73 46 6c 61 67 73 20  ** The vfsFlags 
2bf60 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62  parameter is a b
2bf70 69 74 6d 61 73 6b 20 74 6f 20 70 61 73 73 20 74  itmask to pass t
2bf80 6f 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61  o the flags para
2bf90 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20  meter.** of the 
2bfa0 78 4f 70 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f  xOpen() method o
2bfb0 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 56  f the supplied V
2bfc0 46 53 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  FS when opening 
2bfd0 66 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  files. .**.** If
2bfe0 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
2bff0 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  t is allocated a
2c000 6e 64 20 74 68 65 20 73 70 65 63 69 66 69 65 64  nd the specified
2c010 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a   file opened .**
2c020 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 53   successfully, S
2c030 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2c040 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65  rned and *ppPage
2c050 72 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  r set to point t
2c060 6f 0a 2a 2a 20 74 68 65 20 6e 65 77 20 70 61 67  o.** the new pag
2c070 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e  er object. If an
2c080 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a   error occurs, *
2c090 70 70 50 61 67 65 72 20 69 73 20 73 65 74 20 74  ppPager is set t
2c0a0 6f 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72  o NULL.** and er
2c0b0 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65  ror code returne
2c0c0 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  d. This function
2c0d0 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
2c0e0 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c  TE_NOMEM.** (sql
2c0f0 69 74 65 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20  ite3Malloc() is 
2c100 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65  used to allocate
2c110 20 6d 65 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45   memory), SQLITE
2c120 5f 43 41 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a  _CANTOPEN or .**
2c130 20 76 61 72 69 6f 75 73 20 53 51 4c 49 54 45 5f   various SQLITE_
2c140 49 4f 5f 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a  IO_XXX errors..*
2c150 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
2c160 65 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65  erOpen(.  sqlite
2c170 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
2c180 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61     /* The virtua
2c190 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f  l file system to
2c1a0 20 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20   use */.  Pager 
2c1b0 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20  **ppPager,      
2c1c0 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72     /* OUT: Retur
2c1d0 6e 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  n the Pager stru
2c1e0 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20  cture here */.  
2c1f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
2c200 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65  ename,   /* Name
2c210 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2c220 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f   file to open */
2c230 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20  .  int nExtra,  
2c240 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
2c250 78 74 72 61 20 62 79 74 65 73 20 61 70 70 65 6e  xtra bytes appen
2c260 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d  d to each in-mem
2c270 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  ory page */.  in
2c280 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
2c290 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20         /* flags 
2c2a0 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73  controlling this
2c2b0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76   file */.  int v
2c2c0 66 73 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20  fsFlags,        
2c2d0 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 70 61 73      /* flags pas
2c2e0 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73  sed through to s
2c2f0 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e  qlite3_vfs.xOpen
2c300 28 29 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  () */.  void (*x
2c310 52 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a 29  Reinit)(DbPage*)
2c320 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20   /* Function to 
2c330 72 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67  reinitialize pag
2c340 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70  es */.){.  u8 *p
2c350 50 74 72 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  Ptr;.  Pager *pP
2c360 61 67 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  ager = 0;       
2c370 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
2c380 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20  to allocate and 
2c390 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20  return */.  int 
2c3a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
2c3b0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
2c3c0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d  ode */.  int tem
2c3d0 70 46 69 6c 65 20 3d 20 30 3b 20 20 20 20 20 20  pFile = 0;      
2c3e0 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 65    /* True for te
2c3f0 6d 70 20 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20  mp files (incl. 
2c400 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29  in-memory files)
2c410 20 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20   */.  int memDb 
2c420 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
2c430 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
2c440 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66  s an in-memory f
2c450 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 61  ile */.  int rea
2c460 64 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20 20  dOnly = 0;      
2c470 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
2c480 73 20 69 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79  s is a read-only
2c490 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6a   file */.  int j
2c4a0 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 20  ournalFileSize; 
2c4b0 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20      /* Bytes to 
2c4c0 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 65 61 63  allocate for eac
2c4d0 68 20 6a 6f 75 72 6e 61 6c 20 66 64 20 2a 2f 0a  h journal fd */.
2c4e0 20 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d    char *zPathnam
2c4f0 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46 75  e = 0;     /* Fu
2c500 6c 6c 20 70 61 74 68 20 74 6f 20 64 61 74 61 62  ll path to datab
2c510 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ase file */.  in
2c520 74 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b  t nPathname = 0;
2c530 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2c540 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 50 61   of bytes in zPa
2c550 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20  thname */.  int 
2c560 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c  useJournal = (fl
2c570 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54  ags & PAGER_OMIT
2c580 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a  _JOURNAL)==0; /*
2c590 20 46 61 6c 73 65 20 74 6f 20 6f 6d 69 74 20 6a   False to omit j
2c5a0 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20  ournal */.  int 
2c5b0 70 63 61 63 68 65 53 69 7a 65 20 3d 20 73 71 6c  pcacheSize = sql
2c5c0 69 74 65 33 50 63 61 63 68 65 53 69 7a 65 28 29  ite3PcacheSize()
2c5d0 3b 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73  ;       /* Bytes
2c5e0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72   to allocate for
2c5f0 20 50 43 61 63 68 65 20 2a 2f 0a 20 20 75 33 32   PCache */.  u32
2c600 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51   szPageDflt = SQ
2c610 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47  LITE_DEFAULT_PAG
2c620 45 5f 53 49 5a 45 3b 20 20 2f 2a 20 44 65 66 61  E_SIZE;  /* Defa
2c630 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 2a 2f  ult page size */
2c640 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2c650 55 72 69 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55  Uri = 0;    /* U
2c660 52 49 20 61 72 67 73 20 74 6f 20 63 6f 70 79 20  RI args to copy 
2c670 2a 2f 0a 20 20 69 6e 74 20 6e 55 72 69 20 3d 20  */.  int nUri = 
2c680 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
2c690 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
2c6a0 20 6f 66 20 55 52 49 20 61 72 67 73 20 61 74 20   of URI args at 
2c6b0 2a 7a 55 72 69 20 2a 2f 0a 0a 20 20 2f 2a 20 46  *zUri */..  /* F
2c6c0 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75  igure out how mu
2c6d0 63 68 20 73 70 61 63 65 20 69 73 20 72 65 71 75  ch space is requ
2c6e0 69 72 65 64 20 66 6f 72 20 65 61 63 68 20 6a 6f  ired for each jo
2c6f0 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c  urnal file-handl
2c700 65 0a 20 20 2a 2a 20 28 74 68 65 72 65 20 61 72  e.  ** (there ar
2c710 65 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20 74  e two of them, t
2c720 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
2c730 61 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  and the sub-jour
2c740 6e 61 6c 29 2e 20 54 68 69 73 0a 20 20 2a 2a 20  nal). This.  ** 
2c750 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73  is the maximum s
2c760 70 61 63 65 20 72 65 71 75 69 72 65 64 20 66 6f  pace required fo
2c770 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a  r an in-memory j
2c780 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64  ournal file hand
2c790 6c 65 20 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72  le .  ** and a r
2c7a0 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66  egular journal f
2c7b0 69 6c 65 2d 68 61 6e 64 6c 65 2e 20 4e 6f 74 65  ile-handle. Note
2c7c0 20 74 68 61 74 20 61 20 22 72 65 67 75 6c 61 72   that a "regular
2c7d0 20 6a 6f 75 72 6e 61 6c 2d 68 61 6e 64 6c 65 22   journal-handle"
2c7e0 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 61 20 77  .  ** may be a w
2c7f0 72 61 70 70 65 72 20 63 61 70 61 62 6c 65 20 6f  rapper capable o
2c800 66 20 63 61 63 68 69 6e 67 20 74 68 65 20 66 69  f caching the fi
2c810 72 73 74 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  rst portion of t
2c820 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  he journal.  ** 
2c830 66 69 6c 65 20 69 6e 20 6d 65 6d 6f 72 79 20 74  file in memory t
2c840 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
2c850 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
2c860 69 6d 69 7a 61 74 69 6f 6e 20 28 73 65 65 20 0a  imization (see .
2c870 20 20 2a 2a 20 73 6f 75 72 63 65 20 66 69 6c 65    ** source file
2c880 20 6a 6f 75 72 6e 61 6c 2e 63 29 2e 0a 20 20 2a   journal.c)..  *
2c890 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4a  /.  if( sqlite3J
2c8a0 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29  ournalSize(pVfs)
2c8b0 3e 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e  >sqlite3MemJourn
2c8c0 61 6c 53 69 7a 65 28 29 20 29 7b 0a 20 20 20 20  alSize() ){.    
2c8d0 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
2c8e0 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33  = ROUND8(sqlite3
2c8f0 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73  JournalSize(pVfs
2c900 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
2c910 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
2c920 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65   = ROUND8(sqlite
2c930 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28  3MemJournalSize(
2c940 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  ));.  }..  /* Se
2c950 74 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72  t the output var
2c960 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20 69 6e  iable to NULL in
2c970 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f   case an error o
2c980 63 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70 70 50  ccurs. */.  *ppP
2c990 61 67 65 72 20 3d 20 30 3b 0a 0a 23 69 66 6e 64  ager = 0;..#ifnd
2c9a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
2c9b0 45 4d 4f 52 59 44 42 0a 20 20 69 66 28 20 66 6c  EMORYDB.  if( fl
2c9c0 61 67 73 20 26 20 50 41 47 45 52 5f 4d 45 4d 4f  ags & PAGER_MEMO
2c9d0 52 59 20 29 7b 0a 20 20 20 20 6d 65 6d 44 62 20  RY ){.    memDb 
2c9e0 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 7a 46 69  = 1;.    if( zFi
2c9f0 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e  lename && zFilen
2ca00 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  ame[0] ){.      
2ca10 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  zPathname = sqli
2ca20 74 65 33 44 62 53 74 72 44 75 70 28 30 2c 20 7a  te3DbStrDup(0, z
2ca30 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
2ca40 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d   if( zPathname==
2ca50 30 20 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  0  ) return SQLI
2ca60 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
2ca70 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  nPathname = sqli
2ca80 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74  te3Strlen30(zPat
2ca90 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7a 46  hname);.      zF
2caa0 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 20  ilename = 0;.   
2cab0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
2cac0 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20   /* Compute and 
2cad0 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 20 70  store the full p
2cae0 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c  athname in an al
2caf0 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 20 70  located buffer p
2cb00 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62  ointed.  ** to b
2cb10 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e  y zPathname, len
2cb20 67 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f  gth nPathname. O
2cb30 72 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20  r, if this is a 
2cb40 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a  temporary file,.
2cb50 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68 20    ** leave both 
2cb60 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50  nPathname and zP
2cb70 61 74 68 6e 61 6d 65 20 73 65 74 20 74 6f 20 30  athname set to 0
2cb80 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69  ..  */.  if( zFi
2cb90 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e  lename && zFilen
2cba0 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 63 6f  ame[0] ){.    co
2cbb0 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20  nst char *z;.   
2cbc0 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66   nPathname = pVf
2cbd0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
2cbe0 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d  .    zPathname =
2cbf0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
2cc00 52 61 77 28 30 2c 20 6e 50 61 74 68 6e 61 6d 65  Raw(0, nPathname
2cc10 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 61  *2);.    if( zPa
2cc20 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  thname==0 ){.   
2cc30 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2cc40 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
2cc50 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d    zPathname[0] =
2cc60 20 30 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65   0; /* Make sure
2cc70 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 65 76 65   initialized eve
2cc80 6e 20 69 66 20 46 75 6c 6c 50 61 74 68 6e 61 6d  n if FullPathnam
2cc90 65 28 29 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20  e() fails */.   
2cca0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
2ccb0 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73  ullPathname(pVfs
2ccc0 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61  , zFilename, nPa
2ccd0 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d  thname, zPathnam
2cce0 65 29 3b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d  e);.    nPathnam
2ccf0 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
2cd00 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  n30(zPathname);.
2cd10 20 20 20 20 7a 20 3d 20 7a 55 72 69 20 3d 20 26      z = zUri = &
2cd20 7a 46 69 6c 65 6e 61 6d 65 5b 73 71 6c 69 74 65  zFilename[sqlite
2cd30 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e  3Strlen30(zFilen
2cd40 61 6d 65 29 2b 31 5d 3b 0a 20 20 20 20 77 68 69  ame)+1];.    whi
2cd50 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 20 20  le( *z ){.      
2cd60 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  z += sqlite3Strl
2cd70 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20 20  en30(z)+1;.     
2cd80 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72   z += sqlite3Str
2cd90 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20  len30(z)+1;.    
2cda0 7d 0a 20 20 20 20 6e 55 72 69 20 3d 20 28 69 6e  }.    nUri = (in
2cdb0 74 29 28 26 7a 5b 31 5d 20 2d 20 7a 55 72 69 29  t)(&z[1] - zUri)
2cdc0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 55  ;.    assert( nU
2cdd0 72 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ri>=0 );.    if(
2cde0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2cdf0 26 20 6e 50 61 74 68 6e 61 6d 65 2b 38 3e 70 56  & nPathname+8>pV
2ce00 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29  fs->mxPathname )
2ce10 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
2ce20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20  branch is taken 
2ce30 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  when the journal
2ce40 20 70 61 74 68 20 72 65 71 75 69 72 65 64 20 62   path required b
2ce50 79 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64  y.      ** the d
2ce60 61 74 61 62 61 73 65 20 62 65 69 6e 67 20 6f 70  atabase being op
2ce70 65 6e 65 64 20 77 69 6c 6c 20 62 65 20 6d 6f 72  ened will be mor
2ce80 65 20 74 68 61 6e 20 70 56 66 73 2d 3e 6d 78 50  e than pVfs->mxP
2ce90 61 74 68 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a  athname.      **
2cea0 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68   bytes in length
2ceb0 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65  . This means the
2cec0 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74   database cannot
2ced0 20 62 65 20 6f 70 65 6e 65 64 2c 0a 20 20 20 20   be opened,.    
2cee0 20 20 2a 2a 20 61 73 20 69 74 20 77 69 6c 6c 20    ** as it will 
2cef0 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20  not be possible 
2cf00 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72  to open the jour
2cf10 6e 61 6c 20 66 69 6c 65 20 6f 72 20 65 76 65 6e  nal file or even
2cf20 0a 20 20 20 20 20 20 2a 2a 20 63 68 65 63 6b 20  .      ** check 
2cf30 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  for a hot-journa
2cf40 6c 20 62 65 66 6f 72 65 20 72 65 61 64 69 6e 67  l before reading
2cf50 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2cf60 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e   rc = SQLITE_CAN
2cf70 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20  TOPEN_BKPT;.    
2cf80 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
2cf90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2cfa0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30   sqlite3DbFree(0
2cfb0 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , zPathname);.  
2cfc0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2cfd0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
2cfe0 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66  llocate memory f
2cff0 6f 72 20 74 68 65 20 50 61 67 65 72 20 73 74 72  or the Pager str
2d000 75 63 74 75 72 65 2c 20 50 43 61 63 68 65 20 6f  ucture, PCache o
2d010 62 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a 2a 20  bject, the.  ** 
2d020 74 68 72 65 65 20 66 69 6c 65 20 64 65 73 63 72  three file descr
2d030 69 70 74 6f 72 73 2c 20 74 68 65 20 64 61 74 61  iptors, the data
2d040 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61  base file name a
2d050 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a  nd the journal .
2d060 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 2e 20    ** file name. 
2d070 54 68 65 20 6c 61 79 6f 75 74 20 69 6e 20 6d 65  The layout in me
2d080 6d 6f 72 79 20 69 73 20 61 73 20 66 6f 6c 6c 6f  mory is as follo
2d090 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ws:.  **.  **   
2d0a0 20 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 20    Pager object  
2d0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d0c0 20 20 28 73 69 7a 65 6f 66 28 50 61 67 65 72 29    (sizeof(Pager)
2d0d0 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
2d0e0 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 20   PCache object  
2d0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d100 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 53   (sqlite3PcacheS
2d110 69 7a 65 28 29 20 62 79 74 65 73 29 0a 20 20 2a  ize() bytes).  *
2d120 2a 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66  *     Database f
2d130 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20  ile handle      
2d140 20 20 20 20 20 20 28 70 56 66 73 2d 3e 73 7a 4f        (pVfs->szO
2d150 73 46 69 6c 65 20 62 79 74 65 73 29 0a 20 20 2a  sFile bytes).  *
2d160 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75 72 6e 61  *     Sub-journa
2d170 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20  l file handle   
2d180 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69        (journalFi
2d190 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20  leSize bytes).  
2d1a0 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f 75 72  **     Main jour
2d1b0 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  nal file handle 
2d1c0 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46         (journalF
2d1d0 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20  ileSize bytes). 
2d1e0 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65   **     Database
2d1f0 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20   file name      
2d200 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61          (nPathna
2d210 6d 65 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2a  me+1 bytes).  **
2d220 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c       Journal fil
2d230 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20  e name          
2d240 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b       (nPathname+
2d250 38 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2f 0a  8+1 bytes).  */.
2d260 20 20 70 50 74 72 20 3d 20 28 75 38 20 2a 29 73    pPtr = (u8 *)s
2d270 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
2d280 28 0a 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a  (.    ROUND8(siz
2d290 65 6f 66 28 2a 70 50 61 67 65 72 29 29 20 2b 20  eof(*pPager)) + 
2d2a0 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74       /* Pager st
2d2b0 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 52  ructure */.    R
2d2c0 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65  OUND8(pcacheSize
2d2d0 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ) +           /*
2d2e0 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 2a   PCache object *
2d2f0 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 56 66  /.    ROUND8(pVf
2d300 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b 20 20  s->szOsFile) +  
2d310 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e       /* The main
2d320 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20   db file */.    
2d330 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
2d340 2a 20 32 20 2b 20 20 20 20 20 20 20 20 20 20 2f  * 2 +          /
2d350 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75 72 6e 61  * The two journa
2d360 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20  l files */ .    
2d370 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20  nPathname + 1 + 
2d380 6e 55 72 69 20 2b 20 20 20 20 20 20 20 20 20 2f  nUri +         /
2d390 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20  * zFilename */. 
2d3a0 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 38     nPathname + 8
2d3b0 20 2b 20 32 20 20 20 20 20 20 20 20 20 20 20 20   + 2            
2d3c0 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f    /* zJournal */
2d3d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2d3e0 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 2b 20 6e  OMIT_WAL.    + n
2d3f0 50 61 74 68 6e 61 6d 65 20 2b 20 34 20 2b 20 32  Pathname + 4 + 2
2d400 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
2d410 57 61 6c 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  Wal */.#endif.  
2d420 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  );.  assert( EIG
2d430 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
2d440 54 28 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f  T(SQLITE_INT_TO_
2d450 50 54 52 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53  PTR(journalFileS
2d460 69 7a 65 29 29 20 29 3b 0a 20 20 69 66 28 20 21  ize)) );.  if( !
2d470 70 50 74 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  pPtr ){.    sqli
2d480 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50 61  te3DbFree(0, zPa
2d490 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  thname);.    ret
2d4a0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2d4b0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 20 3d  ;.  }.  pPager =
2d4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 50                (P
2d4d0 61 67 65 72 2a 29 28 70 50 74 72 29 3b 0a 20 20  ager*)(pPtr);.  
2d4e0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 20  pPager->pPCache 
2d4f0 3d 20 20 20 20 28 50 43 61 63 68 65 2a 29 28 70  =    (PCache*)(p
2d500 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69  Ptr += ROUND8(si
2d510 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 29 3b  zeof(*pPager)));
2d520 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20  .  pPager->fd = 
2d530 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a    (sqlite3_file*
2d540 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38  )(pPtr += ROUND8
2d550 28 70 63 61 63 68 65 53 69 7a 65 29 29 3b 0a 20  (pcacheSize));. 
2d560 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d 20   pPager->sjfd = 
2d570 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28  (sqlite3_file*)(
2d580 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70  pPtr += ROUND8(p
2d590 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 29 3b  Vfs->szOsFile));
2d5a0 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d  .  pPager->jfd =
2d5b0 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a    (sqlite3_file*
2d5c0 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61  )(pPtr += journa
2d5d0 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50  lFileSize);.  pP
2d5e0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20  ager->zFilename 
2d5f0 3d 20 20 20 20 28 63 68 61 72 2a 29 28 70 50 74  =    (char*)(pPt
2d600 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  r += journalFile
2d610 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74 28  Size);.  assert(
2d620 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
2d630 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e 6a 66  NMENT(pPager->jf
2d640 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c  d) );..  /* Fill
2d650 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 7a 46   in the Pager.zF
2d660 69 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61 67 65  ilename and Page
2d670 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66 66 65  r.zJournal buffe
2d680 72 73 2c 20 69 66 20 72 65 71 75 69 72 65 64 2e  rs, if required.
2d690 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74 68 6e   */.  if( zPathn
2d6a0 61 6d 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ame ){.    asser
2d6b0 74 28 20 6e 50 61 74 68 6e 61 6d 65 3e 30 20 29  t( nPathname>0 )
2d6c0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 4a  ;.    pPager->zJ
2d6d0 6f 75 72 6e 61 6c 20 3d 20 20 20 28 63 68 61 72  ournal =   (char
2d6e0 2a 29 28 70 50 74 72 20 2b 3d 20 6e 50 61 74 68  *)(pPtr += nPath
2d6f0 6e 61 6d 65 20 2b 20 31 20 2b 20 6e 55 72 69 29  name + 1 + nUri)
2d700 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61  ;.    memcpy(pPa
2d710 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
2d720 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68  zPathname, nPath
2d730 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 6e  name);.    if( n
2d740 55 72 69 20 29 20 6d 65 6d 63 70 79 28 26 70 50  Uri ) memcpy(&pP
2d750 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b  ager->zFilename[
2d760 6e 50 61 74 68 6e 61 6d 65 2b 31 5d 2c 20 7a 55  nPathname+1], zU
2d770 72 69 2c 20 6e 55 72 69 29 3b 0a 20 20 20 20 6d  ri, nUri);.    m
2d780 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a  emcpy(pPager->zJ
2d790 6f 75 72 6e 61 6c 2c 20 7a 50 61 74 68 6e 61 6d  ournal, zPathnam
2d7a0 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20  e, nPathname);. 
2d7b0 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
2d7c0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74  r->zJournal[nPat
2d7d0 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61  hname], "-journa
2d7e0 6c 5c 30 30 30 22 2c 20 38 2b 32 29 3b 0a 20 20  l\000", 8+2);.  
2d7f0 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66    sqlite3FileSuf
2d800 66 69 78 33 28 70 50 61 67 65 72 2d 3e 7a 46 69  fix3(pPager->zFi
2d810 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e  lename, pPager->
2d820 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 23 69 66 6e 64  zJournal);.#ifnd
2d830 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
2d840 41 4c 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a  AL.    pPager->z
2d850 57 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a  Wal = &pPager->z
2d860 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d  Journal[nPathnam
2d870 65 2b 38 2b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63  e+8+1];.    memc
2d880 70 79 28 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c  py(pPager->zWal,
2d890 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74   zPathname, nPat
2d8a0 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63  hname);.    memc
2d8b0 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 57 61 6c  py(&pPager->zWal
2d8c0 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 77  [nPathname], "-w
2d8d0 61 6c 5c 30 30 30 22 2c 20 34 2b 31 29 3b 0a 20  al\000", 4+1);. 
2d8e0 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75     sqlite3FileSu
2d8f0 66 66 69 78 33 28 70 50 61 67 65 72 2d 3e 7a 46  ffix3(pPager->zF
2d900 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d  ilename, pPager-
2d910 3e 7a 57 61 6c 29 3b 0a 23 65 6e 64 69 66 0a 20  >zWal);.#endif. 
2d920 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
2d930 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  (0, zPathname);.
2d940 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 56    }.  pPager->pV
2d950 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 50 61  fs = pVfs;.  pPa
2d960 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20  ger->vfsFlags = 
2d970 76 66 73 46 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20  vfsFlags;..  /* 
2d980 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72 20 66  Open the pager f
2d990 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ile..  */.  if( 
2d9a0 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69  zFilename && zFi
2d9b0 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20  lename[0] ){.   
2d9c0 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 20 20   int fout = 0;  
2d9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d9e0 20 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 72    /* VFS flags r
2d9f0 65 74 75 72 6e 65 64 20 62 79 20 78 4f 70 65 6e  eturned by xOpen
2da00 28 29 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  () */.    rc = s
2da10 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
2da20 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  s, pPager->zFile
2da30 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66 64  name, pPager->fd
2da40 2c 20 76 66 73 46 6c 61 67 73 2c 20 26 66 6f 75  , vfsFlags, &fou
2da50 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  t);.    assert( 
2da60 21 6d 65 6d 44 62 20 29 3b 0a 20 20 20 20 72 65  !memDb );.    re
2da70 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53  adOnly = (fout&S
2da80 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
2da90 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  NLY);..    /* If
2daa0 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 73 75   the file was su
2dab0 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65  ccessfully opene
2dac0 64 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65  d for read/write
2dad0 20 61 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20   access,.    ** 
2dae0 63 68 6f 6f 73 65 20 61 20 64 65 66 61 75 6c 74  choose a default
2daf0 20 70 61 67 65 20 73 69 7a 65 20 69 6e 20 63 61   page size in ca
2db00 73 65 20 77 65 20 68 61 76 65 20 74 6f 20 63 72  se we have to cr
2db10 65 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  eate the.    ** 
2db20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
2db30 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20  he default page 
2db40 73 69 7a 65 20 69 73 20 74 68 65 20 6d 61 78 69  size is the maxi
2db50 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20  mum of:.    **. 
2db60 20 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54     **    + SQLIT
2db70 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
2db80 49 5a 45 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b  IZE,.    **    +
2db90 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
2dba0 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73  ned by sqlite3Os
2dbb0 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20  SectorSize().   
2dbc0 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72   **    + The lar
2dbd0 67 65 73 74 20 70 61 67 65 20 73 69 7a 65 20 74  gest page size t
2dbe0 68 61 74 20 63 61 6e 20 62 65 20 77 72 69 74 74  hat can be writt
2dbf0 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20  en atomically.. 
2dc00 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
2dc10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2dc20 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73       int iDc = s
2dc30 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
2dc40 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
2dc50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20  ager->fd);.     
2dc60 20 69 66 28 20 21 72 65 61 64 4f 6e 6c 79 20 29   if( !readOnly )
2dc70 7b 0a 20 20 20 20 20 20 20 20 73 65 74 53 65 63  {.        setSec
2dc80 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b  torSize(pPager);
2dc90 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2dca0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
2dcb0 41 47 45 5f 53 49 5a 45 3c 3d 53 51 4c 49 54 45  AGE_SIZE<=SQLITE
2dcc0 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
2dcd0 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 20  E_SIZE);.       
2dce0 20 69 66 28 20 73 7a 50 61 67 65 44 66 6c 74 3c   if( szPageDflt<
2dcf0 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
2dd00 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
2dd10 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74  if( pPager->sect
2dd20 6f 72 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  orSize>SQLITE_MA
2dd30 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
2dd40 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  IZE ){.         
2dd50 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20     szPageDflt = 
2dd60 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
2dd70 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20  LT_PAGE_SIZE;.  
2dd80 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2dd90 20 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67             szPag
2dda0 65 44 66 6c 74 20 3d 20 28 75 33 32 29 70 50 61  eDflt = (u32)pPa
2ddb0 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b  ger->sectorSize;
2ddc0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2ddd0 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51       }.#ifdef SQ
2dde0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
2ddf0 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20 20  IC_WRITE.       
2de00 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74   {.          int
2de10 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 61   ii;.          a
2de20 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
2de30 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35  AP_ATOMIC512==(5
2de40 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20  12>>8));.       
2de50 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
2de60 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b  _IOCAP_ATOMIC64K
2de70 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20  ==(65536>>8));. 
2de80 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2de90 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
2dea0 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35  LT_PAGE_SIZE<=65
2deb0 35 33 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20  536);.          
2dec0 66 6f 72 28 69 69 3d 73 7a 50 61 67 65 44 66 6c  for(ii=szPageDfl
2ded0 74 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41  t; ii<=SQLITE_MA
2dee0 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
2def0 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20  IZE; ii=ii*2){. 
2df00 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
2df10 44 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  Dc&(SQLITE_IOCAP
2df20 5f 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29  _ATOMIC|(ii>>8))
2df30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2df40 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 69    szPageDflt = i
2df50 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  i;.            }
2df60 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2df70 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
2df80 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
2df90 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d 20 73 71 6c  er->noLock = sql
2dfa0 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e  ite3_uri_boolean
2dfb0 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 6e 6f 6c  (zFilename, "nol
2dfc0 6f 63 6b 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  ock", 0);.      
2dfd0 69 66 28 20 28 69 44 63 20 26 20 53 51 4c 49 54  if( (iDc & SQLIT
2dfe0 45 5f 49 4f 43 41 50 5f 49 4d 4d 55 54 41 42 4c  E_IOCAP_IMMUTABL
2dff0 45 29 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  E)!=0.       || 
2e000 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c  sqlite3_uri_bool
2e010 65 61 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22  ean(zFilename, "
2e020 69 6d 6d 75 74 61 62 6c 65 22 2c 20 30 29 20 29  immutable", 0) )
2e030 7b 0a 20 20 20 20 20 20 20 20 20 20 76 66 73 46  {.          vfsF
2e040 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
2e050 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  PEN_READONLY;.  
2e060 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 63 74          goto act
2e070 5f 6c 69 6b 65 5f 74 65 6d 70 5f 66 69 6c 65 3b  _like_temp_file;
2e080 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2e090 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
2e0a0 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  f a temporary fi
2e0b0 6c 65 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  le is requested,
2e0c0 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65   it is not opene
2e0d0 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  d immediately.. 
2e0e0 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61     ** In this ca
2e0f0 73 65 20 77 65 20 61 63 63 65 70 74 20 74 68 65  se we accept the
2e100 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69   default page si
2e110 7a 65 20 61 6e 64 20 64 65 6c 61 79 20 61 63 74  ze and delay act
2e120 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65  ually.    ** ope
2e130 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20 75 6e  ning the file un
2e140 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 63 61  til the first ca
2e150 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65 28 29 2e  ll to OsWrite().
2e160 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
2e170 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 61 6c  his branch is al
2e180 73 6f 20 72 75 6e 20 66 6f 72 20 61 6e 20 69 6e  so run for an in
2e190 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
2e1a0 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20  . An in-memory. 
2e1b0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
2e1c0 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 20  s the same as a 
2e1d0 74 65 6d 70 2d 66 69 6c 65 20 74 68 61 74 20 69  temp-file that i
2e1e0 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20  s never written 
2e1f0 6f 75 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69  out to.    ** di
2e200 73 6b 20 61 6e 64 20 75 73 65 73 20 61 6e 20 69  sk and uses an i
2e210 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62 61 63  n-memory rollbac
2e220 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a  k journal..    *
2e230 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62 72  *.    ** This br
2e240 61 6e 63 68 20 61 6c 73 6f 20 72 75 6e 73 20 66  anch also runs f
2e250 6f 72 20 66 69 6c 65 73 20 6d 61 72 6b 65 64 20  or files marked 
2e260 61 73 20 69 6d 6d 75 74 61 62 6c 65 2e 0a 20 20  as immutable..  
2e270 20 20 2a 2f 20 0a 61 63 74 5f 6c 69 6b 65 5f 74    */ .act_like_t
2e280 65 6d 70 5f 66 69 6c 65 3a 0a 20 20 20 20 74 65  emp_file:.    te
2e290 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20  mpFile = 1;.    
2e2a0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
2e2b0 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b 20 20   PAGER_READER;  
2e2c0 20 20 20 2f 2a 20 50 72 65 74 65 6e 64 20 77 65     /* Pretend we
2e2d0 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20   already have a 
2e2e0 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 70 50 61 67  lock */.    pPag
2e2f0 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 45 58 43 4c  er->eLock = EXCL
2e300 55 53 49 56 45 5f 4c 4f 43 4b 3b 20 20 20 20 2f  USIVE_LOCK;    /
2e310 2a 20 50 72 65 74 65 6e 64 20 77 65 20 61 72 65  * Pretend we are
2e320 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   in EXCLUSIVE lo
2e330 63 6b 69 6e 67 20 6d 6f 64 65 20 2a 2f 0a 20 20  cking mode */.  
2e340 20 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b    pPager->noLock
2e350 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
2e360 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 20 6c 6f       /* Do no lo
2e370 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 72 65 61  cking */.    rea
2e380 64 4f 6e 6c 79 20 3d 20 28 76 66 73 46 6c 61 67  dOnly = (vfsFlag
2e390 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  s&SQLITE_OPEN_RE
2e3a0 41 44 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 0a 20 20  ADONLY);.  }..  
2e3b0 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
2e3c0 20 63 61 6c 6c 20 74 6f 20 50 61 67 65 72 53 65   call to PagerSe
2e3d0 74 50 61 67 65 73 69 7a 65 28 29 20 73 65 72 76  tPagesize() serv
2e3e0 65 73 20 74 6f 20 73 65 74 20 74 68 65 20 76 61  es to set the va
2e3f0 6c 75 65 20 6f 66 20 0a 20 20 2a 2a 20 50 61 67  lue of .  ** Pag
2e400 65 72 2e 70 61 67 65 53 69 7a 65 20 61 6e 64 20  er.pageSize and 
2e410 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20  to allocate the 
2e420 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20  Pager.pTmpSpace 
2e430 62 75 66 66 65 72 2e 0a 20 20 2a 2f 0a 20 20 69  buffer..  */.  i
2e440 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2e450 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2e460 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30  pPager->memDb==0
2e470 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
2e480 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
2e490 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26 73 7a  size(pPager, &sz
2e4a0 50 61 67 65 44 66 6c 74 2c 20 2d 31 29 3b 0a 20  PageDflt, -1);. 
2e4b0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
2e4c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
2e4d0 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  }..  /* Initiali
2e4e0 7a 65 20 74 68 65 20 50 43 61 63 68 65 20 6f 62  ze the PCache ob
2e4f0 6a 65 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 72  ject. */.  if( r
2e500 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2e510 20 20 20 20 61 73 73 65 72 74 28 20 6e 45 78 74      assert( nExt
2e520 72 61 3c 31 30 30 30 20 29 3b 0a 20 20 20 20 6e  ra<1000 );.    n
2e530 45 78 74 72 61 20 3d 20 52 4f 55 4e 44 38 28 6e  Extra = ROUND8(n
2e540 45 78 74 72 61 29 3b 0a 20 20 20 20 72 63 20 3d  Extra);.    rc =
2e550 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4f 70   sqlite3PcacheOp
2e560 65 6e 28 73 7a 50 61 67 65 44 66 6c 74 2c 20 6e  en(szPageDflt, n
2e570 45 78 74 72 61 2c 20 21 6d 65 6d 44 62 2c 0a 20  Extra, !memDb,. 
2e580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e590 20 20 20 20 20 20 20 20 20 20 21 6d 65 6d 44 62            !memDb
2e5a0 3f 70 61 67 65 72 53 74 72 65 73 73 3a 30 2c 20  ?pagerStress:0, 
2e5b0 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20  (void *)pPager, 
2e5c0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
2e5d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61  ;.  }..  /* If a
2e5e0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  n error occurred
2e5f0 20 61 62 6f 76 65 2c 20 66 72 65 65 20 74 68 65   above, free the
2e600 20 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72    Pager structur
2e610 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20  e and close the 
2e620 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  file..  */.  if(
2e630 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2e640 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
2e650 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29  lose(pPager->fd)
2e660 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
2e670 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54  eFree(pPager->pT
2e680 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 73 71  mpSpace);.    sq
2e690 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
2e6a0 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  r);.    return r
2e6b0 63 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54  c;.  }..  PAGERT
2e6c0 52 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25  RACE(("OPEN %d %
2e6d0 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45  s\n", FILEHANDLE
2e6e0 49 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20  ID(pPager->fd), 
2e6f0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2e700 65 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  e));.  IOTRACE((
2e710 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20  "OPEN %p %s\n", 
2e720 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
2e730 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70  zFilename))..  p
2e740 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
2e750 6c 20 3d 20 28 75 38 29 75 73 65 4a 6f 75 72 6e  l = (u8)useJourn
2e760 61 6c 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  al;.  /* pPager-
2e770 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a  >stmtOpen = 0; *
2e780 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  /.  /* pPager->s
2e790 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f  tmtInUse = 0; */
2e7a0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52  .  /* pPager->nR
2e7b0 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ef = 0; */.  /* 
2e7c0 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
2e7d0 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2e7e0 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20  ager->stmtJSize 
2e7f0 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2e800 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20  ger->nPage = 0; 
2e810 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  */.  pPager->mxP
2e820 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58  gno = SQLITE_MAX
2e830 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f  _PAGE_COUNT;.  /
2e840 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20  * pPager->state 
2e850 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20  = PAGER_UNLOCK; 
2e860 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2e870 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a  errMask = 0; */.
2e880 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69    pPager->tempFi
2e890 6c 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c  le = (u8)tempFil
2e8a0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65 6d  e;.  assert( tem
2e8b0 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  pFile==PAGER_LOC
2e8c0 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20  KINGMODE_NORMAL 
2e8d0 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74 65  .          || te
2e8e0 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f  mpFile==PAGER_LO
2e8f0 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
2e900 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  IVE );.  assert(
2e910 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
2e920 44 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31 20  DE_EXCLUSIVE==1 
2e930 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63  );.  pPager->exc
2e940 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 28 75 38  lusiveMode = (u8
2e950 29 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50  )tempFile; .  pP
2e960 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
2e970 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e  tDone = pPager->
2e980 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67  tempFile;.  pPag
2e990 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 28 75 38 29  er->memDb = (u8)
2e9a0 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d  memDb;.  pPager-
2e9b0 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 28 75 38 29  >readOnly = (u8)
2e9c0 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 61 73 73 65  readOnly;.  asse
2e9d0 72 74 28 20 75 73 65 4a 6f 75 72 6e 61 6c 20 7c  rt( useJournal |
2e9e0 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
2e9f0 6c 65 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  le );.  pPager->
2ea00 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d  noSync = pPager-
2ea10 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61  >tempFile;.  pPa
2ea20 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20  ger->fullSync = 
2ea30 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f  pPager->noSync ?
2ea40 30 3a 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  0:1;.  pPager->s
2ea50 79 6e 63 46 6c 61 67 73 20 3d 20 70 50 61 67 65  yncFlags = pPage
2ea60 72 2d 3e 6e 6f 53 79 6e 63 20 3f 20 30 20 3a 20  r->noSync ? 0 : 
2ea70 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
2ea80 41 4c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b  AL;.  pPager->ck
2ea90 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 70 50  ptSyncFlags = pP
2eaa0 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3b  ager->syncFlags;
2eab0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
2eac0 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73  oSync ){.    ass
2ead0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66 75 6c  ert( pPager->ful
2eae0 6c 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  lSync==0 );.    
2eaf0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2eb00 73 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a  syncFlags==0 );.
2eb10 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2eb20 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73  er->walSyncFlags
2eb30 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
2eb40 74 28 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53  t( pPager->ckptS
2eb50 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20  yncFlags==0 );. 
2eb60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
2eb70 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 31  er->fullSync = 1
2eb80 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79  ;.    pPager->sy
2eb90 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
2eba0 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  _SYNC_NORMAL;.  
2ebb0 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e    pPager->walSyn
2ebc0 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
2ebd0 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 7c 20 57 41  SYNC_NORMAL | WA
2ebe0 4c 5f 53 59 4e 43 5f 54 52 41 4e 53 41 43 54 49  L_SYNC_TRANSACTI
2ebf0 4f 4e 53 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ONS;.    pPager-
2ec00 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d  >ckptSyncFlags =
2ec10 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
2ec20 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50  MAL;.  }.  /* pP
2ec30 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30  ager->pFirst = 0
2ec40 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2ec50 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
2ec60 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2ec70 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a  er->pLast = 0; *
2ec80 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  /.  pPager->nExt
2ec90 72 61 20 3d 20 28 75 31 36 29 6e 45 78 74 72 61  ra = (u16)nExtra
2eca0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
2ecb0 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 53  nalSizeLimit = S
2ecc0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a 4f  QLITE_DEFAULT_JO
2ecd0 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54  URNAL_SIZE_LIMIT
2ece0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
2ecf0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
2ed00 7c 20 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  | tempFile );.  
2ed10 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50  setSectorSize(pP
2ed20 61 67 65 72 29 3b 0a 20 20 69 66 28 20 21 75 73  ager);.  if( !us
2ed30 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  eJournal ){.    
2ed40 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
2ed50 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52  ode = PAGER_JOUR
2ed60 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20 7d  NALMODE_OFF;.  }
2ed70 65 6c 73 65 20 69 66 28 20 6d 65 6d 44 62 20 29  else if( memDb )
2ed80 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
2ed90 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45  urnalMode = PAGE
2eda0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
2edb0 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70  MORY;.  }.  /* p
2edc0 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64  Pager->xBusyHand
2edd0 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ler = 0; */.  /*
2ede0 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
2edf0 6e 64 6c 65 72 41 72 67 20 3d 20 30 3b 20 2a 2f  ndlerArg = 0; */
2ee00 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e  .  pPager->xRein
2ee10 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a  iter = xReinit;.
2ee20 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67    /* memset(pPag
2ee30 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69  er->aHash, 0, si
2ee40 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61  zeof(pPager->aHa
2ee50 73 68 29 29 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50  sh)); */.  /* pP
2ee60 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 20 3d 20 53  ager->szMmap = S
2ee70 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4d 4d  QLITE_DEFAULT_MM
2ee80 41 50 5f 53 49 5a 45 20 2f 2f 20 77 69 6c 6c 20  AP_SIZE // will 
2ee90 62 65 20 73 65 74 20 62 79 20 62 74 72 65 65 2e  be set by btree.
2eea0 63 20 2a 2f 0a 0a 20 20 2a 70 70 50 61 67 65 72  c */..  *ppPager
2eeb0 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74   = pPager;.  ret
2eec0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2eed0 0a 0a 0a 2f 2a 20 56 65 72 69 66 79 20 74 68 61  .../* Verify tha
2eee0 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
2eef0 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 20 64  ile has not be d
2ef00 65 6c 65 74 65 64 20 6f 72 20 72 65 6e 61 6d 65  eleted or rename
2ef10 64 20 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20 75 6e  d out from.** un
2ef20 64 65 72 20 74 68 65 20 70 61 67 65 72 2e 20 20  der the pager.  
2ef30 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
2ef40 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
2ef50 20 69 73 20 73 74 69 6c 6c 20 77 65 72 65 20 69   is still were i
2ef60 74 20 6f 75 67 68 74 0a 2a 2a 20 74 6f 20 62 65  t ought.** to be
2ef70 20 6f 6e 20 64 69 73 6b 2e 20 20 52 65 74 75 72   on disk.  Retur
2ef80 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 28 53 51 4c 49  n non-zero (SQLI
2ef90 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f  TE_READONLY_DBMO
2efa0 56 45 44 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  VED or some othe
2efb0 72 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20  r error.** code 
2efc0 66 72 6f 6d 20 73 71 6c 69 74 65 33 4f 73 41 63  from sqlite3OsAc
2efd0 63 65 73 73 28 29 29 20 69 66 20 74 68 65 20 64  cess()) if the d
2efe0 61 74 61 62 61 73 65 20 68 61 73 20 67 6f 6e 65  atabase has gone
2eff0 20 6d 69 73 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61   missing..*/.sta
2f000 74 69 63 20 69 6e 74 20 64 61 74 61 62 61 73 65  tic int database
2f010 49 73 55 6e 6d 6f 76 65 64 28 50 61 67 65 72 20  IsUnmoved(Pager 
2f020 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
2f030 62 48 61 73 4d 6f 76 65 64 20 3d 20 30 3b 0a 20  bHasMoved = 0;. 
2f040 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
2f050 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
2f060 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2f070 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65  _OK;.  if( pPage
2f080 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 20 29 20 72  r->dbSize==0 ) r
2f090 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2f0a0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2f0b0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  r->zFilename && 
2f0c0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2f0d0 65 5b 30 5d 20 29 3b 0a 20 20 72 63 20 3d 20 73  e[0] );.  rc = s
2f0e0 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
2f0f0 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  rol(pPager->fd, 
2f100 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 48 41 53  SQLITE_FCNTL_HAS
2f110 5f 4d 4f 56 45 44 2c 20 26 62 48 61 73 4d 6f 76  _MOVED, &bHasMov
2f120 65 64 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ed);.  if( rc==S
2f130 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29  QLITE_NOTFOUND )
2f140 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
2f150 48 41 53 5f 4d 4f 56 45 44 20 66 69 6c 65 2d 63  HAS_MOVED file-c
2f160 6f 6e 74 72 6f 6c 20 69 73 20 75 6e 69 6d 70 6c  ontrol is unimpl
2f170 65 6d 65 6e 74 65 64 2c 20 61 73 73 75 6d 65 20  emented, assume 
2f180 74 68 61 74 20 74 68 65 20 66 69 6c 65 0a 20 20  that the file.  
2f190 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65 65    ** has not bee
2f1a0 6e 20 6d 6f 76 65 64 2e 20 20 54 68 61 74 20 69  n moved.  That i
2f1b0 73 20 74 68 65 20 68 69 73 74 6f 72 69 63 61 6c  s the historical
2f1c0 20 62 65 68 61 76 69 6f 72 20 6f 66 20 53 51 4c   behavior of SQL
2f1d0 69 74 65 3a 20 70 72 69 6f 72 20 74 6f 0a 20 20  ite: prior to.  
2f1e0 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 38    ** version 3.8
2f1f0 2e 33 2c 20 69 74 20 6e 65 76 65 72 20 63 68 65  .3, it never che
2f200 63 6b 65 64 20 2a 2f 0a 20 20 20 20 72 63 20 3d  cked */.    rc =
2f210 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
2f220 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
2f230 54 45 5f 4f 4b 20 26 26 20 62 48 61 73 4d 6f 76  TE_OK && bHasMov
2f240 65 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  ed ){.    rc = S
2f250 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44  QLITE_READONLY_D
2f260 42 4d 4f 56 45 44 3b 0a 20 20 7d 0a 20 20 72 65  BMOVED;.  }.  re
2f270 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
2f280 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2f290 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72   is called after
2f2a0 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66   transitioning f
2f2b0 72 6f 6d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  rom PAGER_UNLOCK
2f2c0 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 53 48 41   to.** PAGER_SHA
2f2d0 52 45 44 20 73 74 61 74 65 2e 20 49 74 20 74 65  RED state. It te
2f2e0 73 74 73 20 69 66 20 74 68 65 72 65 20 69 73 20  sts if there is 
2f2f0 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 70 72  a hot journal pr
2f300 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20  esent in.** the 
2f310 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72 20  file-system for 
2f320 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e  the given pager.
2f330 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69   A hot journal i
2f340 73 20 6f 6e 65 20 74 68 61 74 20 0a 2a 2a 20 6e  s one that .** n
2f350 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65  eeds to be playe
2f360 64 20 62 61 63 6b 2e 20 41 63 63 6f 72 64 69 6e  d back. Accordin
2f370 67 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  g to this functi
2f380 6f 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  on, a hot-journa
2f390 6c 0a 2a 2a 20 66 69 6c 65 20 65 78 69 73 74 73  l.** file exists
2f3a0 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   if the followin
2f3b0 67 20 63 72 69 74 65 72 69 61 20 61 72 65 20 6d  g criteria are m
2f3c0 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68  et:.**.**   * Th
2f3d0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  e journal file e
2f3e0 78 69 73 74 73 20 69 6e 20 74 68 65 20 66 69 6c  xists in the fil
2f3f0 65 20 73 79 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a  e system, and.**
2f400 20 20 20 2a 20 4e 6f 20 70 72 6f 63 65 73 73 20     * No process 
2f410 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45 44  holds a RESERVED
2f420 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
2f430 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2f440 20 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20 20   file, and.**   
2f450 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
2f460 69 6c 65 20 69 74 73 65 6c 66 20 69 73 20 67 72  ile itself is gr
2f470 65 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74  eater than 0 byt
2f480 65 73 20 69 6e 20 73 69 7a 65 2c 20 61 6e 64 0a  es in size, and.
2f490 2a 2a 20 20 20 2a 20 54 68 65 20 66 69 72 73 74  **   * The first
2f4a0 20 62 79 74 65 20 6f 66 20 74 68 65 20 6a 6f 75   byte of the jou
2f4b0 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
2f4c0 20 61 6e 64 20 69 73 20 6e 6f 74 20 30 78 30 30   and is not 0x00
2f4d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
2f4e0 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74  urrent size of t
2f4f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2f500 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72   is 0 but a jour
2f510 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73  nal file.** exis
2f520 74 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62  ts, that is prob
2f530 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72  ably an old jour
2f540 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72  nal left over fr
2f550 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61  om a prior.** da
2f560 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20  tabase with the 
2f570 73 61 6d 65 20 6e 61 6d 65 2e 20 49 6e 20 74 68  same name. In th
2f580 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72  is case the jour
2f590 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 6a  nal file is.** j
2f5a0 75 73 74 20 64 65 6c 65 74 65 64 20 75 73 69 6e  ust deleted usin
2f5b0 67 20 4f 73 44 65 6c 65 74 65 2c 20 2a 70 45 78  g OsDelete, *pEx
2f5c0 69 73 74 73 20 69 73 20 73 65 74 20 74 6f 20 30  ists is set to 0
2f5d0 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a   and SQLITE_OK.*
2f5e0 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  * is returned..*
2f5f0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2f600 65 20 64 6f 65 73 20 6e 6f 74 20 63 68 65 63 6b  e does not check
2f610 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 6d   if there is a m
2f620 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
2f630 6c 65 6e 61 6d 65 0a 2a 2a 20 61 74 20 74 68 65  lename.** at the
2f640 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
2f650 2e 20 49 66 20 74 68 65 72 65 20 69 73 2c 20 61  . If there is, a
2f660 6e 64 20 74 68 61 74 20 6d 61 73 74 65 72 20 6a  nd that master j
2f670 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 64  ournal file.** d
2f680 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74  oes not exist, t
2f690 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
2f6a0 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c  file is not real
2f6b0 6c 79 20 68 6f 74 2e 20 49 6e 20 74 68 69 73 0a  ly hot. In this.
2f6c0 2a 2a 20 63 61 73 65 20 74 68 69 73 20 72 6f 75  ** case this rou
2f6d0 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  tine will return
2f6e0 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76   a false-positiv
2f6f0 65 2e 20 54 68 65 20 70 61 67 65 72 5f 70 6c 61  e. The pager_pla
2f700 79 62 61 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69  yback().** routi
2f710 6e 65 20 77 69 6c 6c 20 64 69 73 63 6f 76 65 72  ne will discover
2f720 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
2f730 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65  l file is not re
2f740 61 6c 6c 79 20 68 6f 74 20 61 6e 64 20 0a 2a 2a  ally hot and .**
2f750 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69   will not roll i
2f760 74 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49  t back. .**.** I
2f770 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  f a hot-journal 
2f780 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 20 74 6f  file is found to
2f790 20 65 78 69 73 74 2c 20 2a 70 45 78 69 73 74 73   exist, *pExists
2f7a0 20 69 73 20 73 65 74 20 74 6f 20 31 20 61 6e 64   is set to 1 and
2f7b0 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72   .** SQLITE_OK r
2f7c0 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 20 68  eturned. If no h
2f7d0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
2f7e0 69 73 20 70 72 65 73 65 6e 74 2c 20 2a 70 45 78  is present, *pEx
2f7f0 69 73 74 73 20 69 73 0a 2a 2a 20 73 65 74 20 74  ists is.** set t
2f800 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  o 0 and SQLITE_O
2f810 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61  K returned. If a
2f820 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
2f830 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a  s while trying.*
2f840 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77  * to determine w
2f850 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
2f860 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
2f870 20 65 78 69 73 74 73 2c 20 74 68 65 20 49 4f 20   exists, the IO 
2f880 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 73  error.** code is
2f890 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
2f8a0 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 45 78 69  e value of *pExi
2f8b0 73 74 73 20 69 73 20 75 6e 64 65 66 69 6e 65 64  sts is undefined
2f8c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2f8d0 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61  hasHotJournal(Pa
2f8e0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
2f8f0 20 2a 70 45 78 69 73 74 73 29 7b 0a 20 20 73 71   *pExists){.  sq
2f900 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73  lite3_vfs * cons
2f910 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d  t pVfs = pPager-
2f920 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 20  >pVfs;.  int rc 
2f930 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2f940 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
2f950 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65   code */.  int e
2f960 78 69 73 74 73 20 3d 20 31 3b 20 20 20 20 20 20  xists = 1;      
2f970 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2f980 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   if a journal fi
2f990 6c 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  le is present */
2f9a0 0a 20 20 69 6e 74 20 6a 72 6e 6c 4f 70 65 6e 20  .  int jrnlOpen 
2f9b0 3d 20 21 21 69 73 4f 70 65 6e 28 70 50 61 67 65  = !!isOpen(pPage
2f9c0 72 2d 3e 6a 66 64 29 3b 0a 0a 20 20 61 73 73 65  r->jfd);..  asse
2f9d0 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  rt( pPager->useJ
2f9e0 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65  ournal );.  asse
2f9f0 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
2fa00 72 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73 73 65  r->fd) );.  asse
2fa10 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
2fa20 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te==PAGER_OPEN )
2fa30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 72 6e  ;..  assert( jrn
2fa40 6c 4f 70 65 6e 3d 3d 30 20 7c 7c 20 28 20 73 71  lOpen==0 || ( sq
2fa50 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
2fa60 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
2fa70 67 65 72 2d 3e 6a 66 64 29 20 26 0a 20 20 20 20  ger->jfd) &.    
2fa80 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44  SQLITE_IOCAP_UND
2fa90 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50  ELETABLE_WHEN_OP
2faa0 45 4e 0a 20 20 29 29 3b 0a 0a 20 20 2a 70 45 78  EN.  ));..  *pEx
2fab0 69 73 74 73 20 3d 20 30 3b 0a 20 20 69 66 28 20  ists = 0;.  if( 
2fac0 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  !jrnlOpen ){.   
2fad0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
2fae0 63 63 65 73 73 28 70 56 66 73 2c 20 70 50 61 67  ccess(pVfs, pPag
2faf0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51  er->zJournal, SQ
2fb00 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
2fb10 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20  TS, &exists);.  
2fb20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
2fb30 54 45 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20  TE_OK && exists 
2fb40 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6f 63 6b 65  ){.    int locke
2fb50 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  d = 0;          
2fb60 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73 6f     /* True if so
2fb70 6d 65 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  me process holds
2fb80 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
2fb90 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 61 63 65   */..    /* Race
2fba0 20 63 6f 6e 64 69 74 69 6f 6e 20 68 65 72 65 3a   condition here:
2fbb0 20 20 41 6e 6f 74 68 65 72 20 70 72 6f 63 65 73    Another proces
2fbc0 73 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65  s might have bee
2fbd0 6e 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20  n holding the.  
2fbe0 20 20 2a 2a 20 74 68 65 20 52 45 53 45 52 56 45    ** the RESERVE
2fbf0 44 20 6c 6f 63 6b 20 61 6e 64 20 68 61 76 65 20  D lock and have 
2fc00 61 20 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 20 61  a journal open a
2fc10 74 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 41  t the sqlite3OsA
2fc20 63 63 65 73 73 28 29 20 0a 20 20 20 20 2a 2a 20  ccess() .    ** 
2fc30 63 61 6c 6c 20 61 62 6f 76 65 2c 20 62 75 74 20  call above, but 
2fc40 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20  then delete the 
2fc50 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 64 72 6f 70  journal and drop
2fc60 20 74 68 65 20 6c 6f 63 6b 20 62 65 66 6f 72 65   the lock before
2fc70 0a 20 20 20 20 2a 2a 20 77 65 20 67 65 74 20 74  .    ** we get t
2fc80 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  o the following 
2fc90 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65  sqlite3OsCheckRe
2fca0 73 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c  servedLock() cal
2fcb0 6c 2e 20 20 49 66 20 74 68 61 74 0a 20 20 20 20  l.  If that.    
2fcc0 2a 2a 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  ** is the case, 
2fcd0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  this routine mig
2fce0 68 74 20 74 68 69 6e 6b 20 74 68 65 72 65 20 69  ht think there i
2fcf0 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  s a hot journal 
2fd00 77 68 65 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 66  when.    ** in f
2fd10 61 63 74 20 74 68 65 72 65 20 69 73 20 6e 6f 6e  act there is non
2fd20 65 2e 20 20 54 68 69 73 20 72 65 73 75 6c 74 73  e.  This results
2fd30 20 69 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69   in a false-posi
2fd40 74 69 76 65 20 77 68 69 63 68 20 77 69 6c 6c 0a  tive which will.
2fd50 20 20 20 20 2a 2a 20 62 65 20 64 65 61 6c 74 20      ** be dealt 
2fd60 77 69 74 68 20 62 79 20 74 68 65 20 70 6c 61 79  with by the play
2fd70 62 61 63 6b 20 72 6f 75 74 69 6e 65 2e 20 20 54  back routine.  T
2fd80 69 63 6b 65 74 20 23 33 38 38 33 2e 0a 20 20 20  icket #3883..   
2fd90 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
2fda0 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72  ite3OsCheckReser
2fdb0 76 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  vedLock(pPager->
2fdc0 66 64 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20  fd, &locked);.  
2fdd0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2fde0 5f 4f 4b 20 26 26 20 21 6c 6f 63 6b 65 64 20 29  _OK && !locked )
2fdf0 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61  {.      Pgno nPa
2fe00 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
2fe10 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2fe20 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61   pages in databa
2fe30 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20  se file */..    
2fe40 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65    rc = pagerPage
2fe50 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e  count(pPager, &n
2fe60 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
2fe70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2fe80 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
2fe90 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
2fea0 7a 65 72 6f 20 70 61 67 65 73 20 69 6e 20 73 69  zero pages in si
2feb0 7a 65 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  ze, that means t
2fec0 68 61 74 20 65 69 74 68 65 72 20 28 31 29 20 74  hat either (1) t
2fed0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f  he.        ** jo
2fee0 75 72 6e 61 6c 20 69 73 20 61 20 72 65 6d 6e 61  urnal is a remna
2fef0 6e 74 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20  nt from a prior 
2ff00 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68  database with th
2ff10 65 20 73 61 6d 65 20 6e 61 6d 65 20 77 68 65 72  e same name wher
2ff20 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  e.        ** the
2ff30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
2ff40 75 74 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e  ut not the journ
2ff50 61 6c 20 77 61 73 20 64 65 6c 65 74 65 64 2c 20  al was deleted, 
2ff60 6f 72 20 28 32 29 20 74 68 65 20 69 6e 69 74 69  or (2) the initi
2ff70 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72  al.        ** tr
2ff80 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20 70  ansaction that p
2ff90 6f 70 75 6c 61 74 65 73 20 61 20 6e 65 77 20 64  opulates a new d
2ffa0 61 74 61 62 61 73 65 20 69 73 20 62 65 69 6e 67  atabase is being
2ffb0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20   rolled back..  
2ffc0 20 20 20 20 20 20 2a 2a 20 49 6e 20 65 69 74 68        ** In eith
2ffd0 65 72 20 63 61 73 65 2c 20 74 68 65 20 6a 6f 75  er case, the jou
2ffe0 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e 20 62 65  rnal file can be
2fff0 20 64 65 6c 65 74 65 64 2e 20 20 48 6f 77 65 76   deleted.  Howev
30000 65 72 2c 20 74 61 6b 65 20 63 61 72 65 0a 20 20  er, take care.  
30010 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 74 6f 20        ** not to 
30020 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
30030 61 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69 73  al file if it is
30040 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 64 75   already open du
30050 65 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20  e to.        ** 
30060 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52  journal_mode=PER
30070 53 49 53 54 2e 0a 20 20 20 20 20 20 20 20 2a 2f  SIST..        */
30080 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 50 61  .        if( nPa
30090 67 65 3d 3d 30 20 26 26 20 21 6a 72 6e 6c 4f 70  ge==0 && !jrnlOp
300a0 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
300b0 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
300c0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
300d0 20 20 20 20 20 20 69 66 28 20 70 61 67 65 72 4c        if( pagerL
300e0 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 52 45  ockDb(pPager, RE
300f0 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d 53 51  SERVED_LOCK)==SQ
30100 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
30110 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
30120 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61  Delete(pVfs, pPa
30130 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30  ger->zJournal, 0
30140 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
30150 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
30160 75 73 69 76 65 4d 6f 64 65 20 29 20 70 61 67 65  usiveMode ) page
30170 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72  rUnlockDb(pPager
30180 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
30190 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
301a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64        sqlite3End
301b0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
301c0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
301d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
301e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
301f0 73 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72  sts and no other
30200 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20   connection has 
30210 61 20 72 65 73 65 72 76 65 64 0a 20 20 20 20 20  a reserved.     
30220 20 20 20 20 20 2a 2a 20 6f 72 20 67 72 65 61 74       ** or great
30230 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  er lock on the d
30240 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 4e 6f  atabase file. No
30250 77 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  w check that the
30260 72 65 20 69 73 0a 20 20 20 20 20 20 20 20 20 20  re is.          
30270 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  ** at least one 
30280 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74 65 73 20 61  non-zero bytes a
30290 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
302a0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
302b0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66  .          ** If
302c0 20 74 68 65 72 65 20 69 73 2c 20 74 68 65 6e 20   there is, then 
302d0 77 65 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73  we consider this
302e0 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 68   journal to be h
302f0 6f 74 2e 20 49 66 20 6e 6f 74 2c 20 0a 20 20 20  ot. If not, .   
30300 20 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e         ** it can
30310 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20 20   be ignored..   
30320 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
30330 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65      if( !jrnlOpe
30340 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
30350 20 69 6e 74 20 66 20 3d 20 0a 23 69 66 20 53 51   int f = .#if SQ
30360 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41  LITE_ENABLE_DATA
30370 5f 50 52 4f 54 45 43 54 49 4f 4e 0a 20 20 20 20  _PROTECTION.    
30380 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65            (pPage
30390 72 2d 3e 76 66 73 46 6c 61 67 73 26 53 51 4c 49  r->vfsFlags&SQLI
303a0 54 45 5f 4f 50 45 4e 5f 46 49 4c 45 50 52 4f 54  TE_OPEN_FILEPROT
303b0 45 43 54 49 4f 4e 5f 4d 41 53 4b 29 7c 0a 23 65  ECTION_MASK)|.#e
303c0 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 20  ndif.           
303d0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
303e0 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f  EADONLY|SQLITE_O
303f0 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
30400 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
30410 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
30420 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
30430 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
30440 3e 6a 66 64 2c 20 66 2c 20 26 66 29 3b 0a 20 20  >jfd, f, &f);.  
30450 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30460 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
30470 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
30480 20 20 20 20 20 75 38 20 66 69 72 73 74 20 3d 20       u8 first = 
30490 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  0;.            r
304a0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
304b0 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28  d(pPager->jfd, (
304c0 76 6f 69 64 20 2a 29 26 66 69 72 73 74 2c 20 31  void *)&first, 1
304d0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
304e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
304f0 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
30500 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  D ){.           
30510 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
30520 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  K;.            }
30530 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
30540 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20   !jrnlOpen ){.  
30550 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
30560 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
30570 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20  r->jfd);.       
30580 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
30590 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 28 66     *pExists = (f
305a0 69 72 73 74 21 3d 30 29 3b 0a 20 20 20 20 20 20  irst!=0);.      
305b0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
305c0 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  ==SQLITE_CANTOPE
305d0 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  N ){.           
305e0 20 2f 2a 20 49 66 20 77 65 20 63 61 6e 6e 6f 74   /* If we cannot
305f0 20 6f 70 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61   open the rollba
30600 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ck journal file 
30610 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 65 20  in order to see 
30620 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  if.            *
30630 2a 20 69 74 20 68 61 73 20 61 20 7a 65 72 6f 20  * it has a zero 
30640 68 65 61 64 65 72 2c 20 74 68 61 74 20 6d 69 67  header, that mig
30650 68 74 20 62 65 20 64 75 65 20 74 6f 20 61 6e 20  ht be due to an 
30660 49 2f 4f 20 65 72 72 6f 72 2c 20 6f 72 0a 20 20  I/O error, or.  
30670 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20            ** it 
30680 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f 20  might be due to 
30690 74 68 65 20 72 61 63 65 20 63 6f 6e 64 69 74 69  the race conditi
306a0 6f 6e 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  on described abo
306b0 76 65 20 61 6e 64 20 69 6e 0a 20 20 20 20 20 20  ve and in.      
306c0 20 20 20 20 20 20 2a 2a 20 74 69 63 6b 65 74 20        ** ticket 
306d0 23 33 38 38 33 2e 20 20 45 69 74 68 65 72 20 77  #3883.  Either w
306e0 61 79 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  ay, assume that 
306f0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68  the journal is h
30700 6f 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ot..            
30710 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 62 65  ** This might be
30720 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76   a false positiv
30730 65 2e 20 20 42 75 74 20 69 66 20 69 74 20 69 73  e.  But if it is
30740 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20  , then the.     
30750 20 20 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61         ** automa
30760 74 69 63 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79  tic journal play
30770 62 61 63 6b 20 61 6e 64 20 72 65 63 6f 76 65 72  back and recover
30780 79 20 6d 65 63 68 61 6e 69 73 6d 20 77 69 6c 6c  y mechanism will
30790 20 64 65 61 6c 0a 20 20 20 20 20 20 20 20 20 20   deal.          
307a0 20 20 2a 2a 20 77 69 74 68 20 69 74 20 75 6e 64    ** with it und
307b0 65 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  er an EXCLUSIVE 
307c0 6c 6f 63 6b 20 77 68 65 72 65 20 77 65 20 64 6f  lock where we do
307d0 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a 20 20 20   not need to.   
307e0 20 20 20 20 20 20 20 20 20 2a 2a 20 77 6f 72 72           ** worr
307f0 79 20 73 6f 20 6d 75 63 68 20 77 69 74 68 20 72  y so much with r
30800 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a  ace conditions..
30810 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
30820 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78 69             *pExi
30830 73 74 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  sts = 1;.       
30840 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
30850 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  _OK;.          }
30860 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
30870 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
30880 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
30890 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
308a0 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f  n is called to o
308b0 62 74 61 69 6e 20 61 20 73 68 61 72 65 64 20 6c  btain a shared l
308c0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
308d0 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 74 20  ase file..** It 
308e0 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63 61  is illegal to ca
308f0 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 41  ll sqlite3PagerA
30900 63 71 75 69 72 65 28 29 20 75 6e 74 69 6c 20 61  cquire() until a
30910 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
30920 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 73  on.** has been s
30930 75 63 63 65 73 73 66 75 6c 6c 79 20 63 61 6c 6c  uccessfully call
30940 65 64 2e 20 49 66 20 61 20 73 68 61 72 65 64 2d  ed. If a shared-
30950 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20  lock is already 
30960 68 65 6c 64 20 77 68 65 6e 0a 2a 2a 20 74 68 69  held when.** thi
30970 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
30980 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
30990 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  -op..**.** The f
309a0 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74 69  ollowing operati
309b0 6f 6e 73 20 61 72 65 20 61 6c 73 6f 20 70 65 72  ons are also per
309c0 66 6f 72 6d 65 64 20 62 79 20 74 68 69 73 20 66  formed by this f
309d0 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20  unction..**.**  
309e0 20 31 29 20 49 66 20 74 68 65 20 70 61 67 65 72   1) If the pager
309f0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e   is currently in
30a00 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
30a10 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a  e (no lock held.
30a20 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20 64  **      on the d
30a30 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20 74  atabase file), t
30a40 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69  hen an attempt i
30a50 73 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e  s made to obtain
30a60 20 61 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45   a.**      SHARE
30a70 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  D lock on the da
30a80 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d  tabase file. Imm
30a90 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f  ediately after o
30aa0 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20  btaining.**     
30ab0 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b   the SHARED lock
30ac0 2c 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  , the file-syste
30ad0 6d 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f 72  m is checked for
30ae0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a   a hot-journal,.
30af0 2a 2a 20 20 20 20 20 20 77 68 69 63 68 20 69 73  **      which is
30b00 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 66 20   played back if 
30b10 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69  present. Followi
30b20 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e  ng any hot-journ
30b30 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c  al .**      roll
30b40 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e  back, the conten
30b50 74 73 20 6f 66 20 74 68 65 20 63 61 63 68 65 20  ts of the cache 
30b60 61 72 65 20 76 61 6c 69 64 61 74 65 64 20 62 79  are validated by
30b70 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20   checking.**    
30b80 20 20 74 68 65 20 27 63 68 61 6e 67 65 2d 63 6f    the 'change-co
30b90 75 6e 74 65 72 27 20 66 69 65 6c 64 20 6f 66 20  unter' field of 
30ba0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
30bb0 65 20 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20  e header and.** 
30bc0 20 20 20 20 20 64 69 73 63 61 72 64 65 64 20 69       discarded i
30bd0 66 20 74 68 65 79 20 61 72 65 20 66 6f 75 6e 64  f they are found
30be0 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a   to be invalid..
30bf0 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20 74 68  **.**   2) If th
30c00 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69  e pager is runni
30c10 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  ng in exclusive-
30c20 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65 20  mode, and there 
30c30 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a  are currently.**
30c40 20 20 20 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e        no outstan
30c50 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
30c60 74 6f 20 61 6e 79 20 70 61 67 65 73 2c 20 61 6e  to any pages, an
30c70 64 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f  d is in the erro
30c80 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20  r state,.**     
30c90 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74   then an attempt
30ca0 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 65 61   is made to clea
30cb0 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  r the error stat
30cc0 65 20 62 79 20 64 69 73 63 61 72 64 69 6e 67 0a  e by discarding.
30cd0 2a 2a 20 20 20 20 20 20 74 68 65 20 63 6f 6e 74  **      the cont
30ce0 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
30cf0 20 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69   cache and rolli
30d00 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e  ng back any open
30d10 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
30d20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
30d30 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
30d40 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
30d50 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
30d60 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
30d70 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68 69 6c 65  .** occurs while
30d80 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64 61 74   locking the dat
30d90 61 62 61 73 65 2c 20 63 68 65 63 6b 69 6e 67 20  abase, checking 
30da0 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  for a hot-journa
30db0 6c 20 66 69 6c 65 20 6f 72 20 0a 2a 2a 20 72 6f  l file or .** ro
30dc0 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75  lling back a jou
30dd0 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 49  rnal file, the I
30de0 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
30df0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
30e00 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 61   sqlite3PagerSha
30e10 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70  redLock(Pager *p
30e20 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
30e30 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
30e40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30e50 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
30e60 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
30e70 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  e is only called
30e80 20 66 72 6f 6d 20 62 2d 74 72 65 65 20 61 6e 64   from b-tree and
30e90 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 72 65   only when there
30ea0 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74   are no.  ** out
30eb0 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 2e 20  standing pages. 
30ec0 54 68 69 73 20 69 6d 70 6c 69 65 73 20 74 68 61  This implies tha
30ed0 74 20 74 68 65 20 70 61 67 65 72 20 73 74 61 74  t the pager stat
30ee0 65 20 73 68 6f 75 6c 64 20 65 69 74 68 65 72 0a  e should either.
30ef0 20 20 2a 2a 20 62 65 20 4f 50 45 4e 20 6f 72 20    ** be OPEN or 
30f00 52 45 41 44 45 52 2e 20 52 45 41 44 45 52 20 69  READER. READER i
30f10 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20  s only possible 
30f20 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
30f30 6f 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20  or was in .  ** 
30f40 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73  exclusive access
30f50 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   mode..  */.  as
30f60 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61  sert( sqlite3Pca
30f70 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
30f80 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20  er->pPCache)==0 
30f90 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  );.  assert( ass
30fa0 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
30fb0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
30fc0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
30fd0 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
30fe0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
30ff0 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
31000 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 4d  );.  if( NEVER(M
31010 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e  EMDB && pPager->
31020 65 72 72 43 6f 64 65 29 20 29 7b 20 72 65 74 75  errCode) ){ retu
31030 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
31040 64 65 3b 20 7d 0a 0a 20 20 69 66 28 20 21 70 61  de; }..  if( !pa
31050 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
31060 29 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74  ) && pPager->eSt
31070 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
31080 29 7b 0a 20 20 20 20 69 6e 74 20 62 48 6f 74 4a  ){.    int bHotJ
31090 6f 75 72 6e 61 6c 20 3d 20 31 3b 20 20 20 20 20  ournal = 1;     
310a0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
310b0 74 68 65 72 65 20 65 78 69 73 74 73 20 61 20 68  there exists a h
310c0 6f 74 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20  ot journal-file 
310d0 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
310e0 21 4d 45 4d 44 42 20 29 3b 0a 0a 20 20 20 20 72  !MEMDB );..    r
310f0 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
31100 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53  n_lock(pPager, S
31110 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
31120 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
31130 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  OK ){.      asse
31140 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  rt( pPager->eLoc
31150 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 50  k==NO_LOCK || pP
31160 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b  ager->eLock==UNK
31170 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  NOWN_LOCK );.   
31180 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
31190 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
311a0 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
311b0 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72  exists, and ther
311c0 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44  e is no RESERVED
311d0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20   lock on the.   
311e0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
311f0 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68 65  e, then it eithe
31200 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c  r needs to be pl
31210 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c  ayed back or del
31220 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eted..    */.   
31230 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f   if( pPager->eLo
31240 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck<=SHARED_LOCK 
31250 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 68 61  ){.      rc = ha
31260 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sHotJournal(pPag
31270 65 72 2c 20 26 62 48 6f 74 4a 6f 75 72 6e 61 6c  er, &bHotJournal
31280 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
31290 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
312a0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69  {.      goto fai
312b0 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  led;.    }.    i
312c0 66 28 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 29  f( bHotJournal )
312d0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  {.      if( pPag
312e0 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  er->readOnly ){.
312f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
31300 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c  ITE_READONLY_ROL
31310 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20 67  LBACK;.        g
31320 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
31330 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65    }..      /* Ge
31340 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  t an EXCLUSIVE l
31350 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
31360 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69  ase file. At thi
31370 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20  s point it is.  
31380 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74      ** important
31390 20 74 68 61 74 20 61 20 52 45 53 45 52 56 45 44   that a RESERVED
313a0 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74   lock is not obt
313b0 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77 61 79  ained on the way
313c0 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   to the.      **
313d0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
313e0 20 49 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f   If it were, ano
313f0 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67  ther process mig
31400 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20  ht open the.    
31410 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
31420 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65 20 52  le, detect the R
31430 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e  ESERVED lock, an
31440 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20  d conclude that 
31450 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
31460 61 62 61 73 65 20 69 73 20 73 61 66 65 20 74 6f  abase is safe to
31470 20 72 65 61 64 20 77 68 69 6c 65 20 74 68 69 73   read while this
31480 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c   process is stil
31490 6c 20 72 6f 6c 6c 69 6e 67 20 74 68 65 20 0a 20  l rolling the . 
314a0 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72       ** hot-jour
314b0 6e 61 6c 20 62 61 63 6b 2e 0a 20 20 20 20 20 20  nal back..      
314c0 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 42 65 63  ** .      ** Bec
314d0 61 75 73 65 20 74 68 65 20 69 6e 74 65 72 6d 65  ause the interme
314e0 64 69 61 74 65 20 52 45 53 45 52 56 45 44 20 6c  diate RESERVED l
314f0 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 65  ock is not reque
31500 73 74 65 64 2c 20 61 6e 79 0a 20 20 20 20 20 20  sted, any.      
31510 2a 2a 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ** other process
31520 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 61   attempting to a
31530 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61  ccess the databa
31540 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 67 65 74  se file will get
31550 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 74 68   to .      ** th
31560 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  is point in the 
31570 63 6f 64 65 20 61 6e 64 20 66 61 69 6c 20 74 6f  code and fail to
31580 20 6f 62 74 61 69 6e 20 69 74 73 20 6f 77 6e 20   obtain its own 
31590 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 0a  EXCLUSIVE lock .
315a0 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20        ** on the 
315b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
315c0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
315d0 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65   Unless the page
315e0 72 20 69 73 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f  r is in locking_
315f0 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 6d  mode=exclusive m
31600 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73  ode, the lock is
31610 0a 20 20 20 20 20 20 2a 2a 20 64 6f 77 6e 67 72  .      ** downgr
31620 61 64 65 64 20 74 6f 20 53 48 41 52 45 44 5f 4c  aded to SHARED_L
31630 4f 43 4b 20 62 65 66 6f 72 65 20 74 68 69 73 20  OCK before this 
31640 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
31650 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
31660 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44   rc = pagerLockD
31670 62 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  b(pPager, EXCLUS
31680 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
31690 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
316a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
316b0 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
316c0 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 49 66   }. .      /* If
316d0 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
316e0 64 79 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  dy open and the 
316f0 66 69 6c 65 20 65 78 69 73 74 73 20 6f 6e 20 64  file exists on d
31700 69 73 6b 2c 20 6f 70 65 6e 20 74 68 65 20 0a 20  isk, open the . 
31710 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
31720 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61  for read/write a
31730 63 63 65 73 73 2e 20 57 72 69 74 65 20 61 63 63  ccess. Write acc
31740 65 73 73 20 69 73 20 72 65 71 75 69 72 65 64 20  ess is required 
31750 62 65 63 61 75 73 65 20 0a 20 20 20 20 20 20 2a  because .      *
31760 2a 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61  * in exclusive-a
31770 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66  ccess mode the f
31780 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77  ile descriptor w
31790 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e  ill be kept open
317a0 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 70   .      ** and p
317b0 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72  ossibly used for
317c0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c   a transaction l
317d0 61 74 65 72 20 6f 6e 2e 20 41 6c 73 6f 2c 20 77  ater on. Also, w
317e0 72 69 74 65 2d 61 63 63 65 73 73 20 0a 20 20 20  rite-access .   
317f0 20 20 20 2a 2a 20 69 73 20 75 73 75 61 6c 6c 79     ** is usually
31800 20 72 65 71 75 69 72 65 64 20 74 6f 20 66 69 6e   required to fin
31810 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61  alize the journa
31820 6c 20 69 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  l in journal_mod
31830 65 3d 70 65 72 73 69 73 74 20 0a 20 20 20 20 20  e=persist .     
31840 20 2a 2a 20 6d 6f 64 65 20 28 61 6e 64 20 61 6c   ** mode (and al
31850 73 6f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d  so for journal_m
31860 6f 64 65 3d 74 72 75 6e 63 61 74 65 20 6f 6e 20  ode=truncate on 
31870 73 6f 6d 65 20 73 79 73 74 65 6d 73 29 2e 0a 20  some systems).. 
31880 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
31890 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
318a0 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
318b0 69 74 20 75 73 75 61 6c 6c 79 20 6d 65 61 6e 73  it usually means
318c0 20 74 68 61 74 20 73 6f 6d 65 20 0a 20 20 20 20   that some .    
318d0 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65    ** other conne
318e0 63 74 69 6f 6e 20 6d 61 6e 61 67 65 64 20 74 6f  ction managed to
318f0 20 67 65 74 20 69 6e 20 61 6e 64 20 72 6f 6c 6c   get in and roll
31900 20 69 74 20 62 61 63 6b 20 62 65 66 6f 72 65 20   it back before 
31910 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63  .      ** this c
31920 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 74 61 69 6e  onnection obtain
31930 65 64 20 74 68 65 20 65 78 63 6c 75 73 69 76 65  ed the exclusive
31940 20 6c 6f 63 6b 20 61 62 6f 76 65 2e 20 4f 72 2c   lock above. Or,
31950 20 69 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 61   it .      ** ma
31960 79 20 6d 65 61 6e 20 74 68 61 74 20 74 68 65 20  y mean that the 
31970 70 61 67 65 72 20 77 61 73 20 69 6e 20 74 68 65  pager was in the
31980 20 65 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65   error-state whe
31990 6e 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20  n this.      ** 
319a0 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c  function was cal
319b0 6c 65 64 20 61 6e 64 20 74 68 65 20 6a 6f 75 72  led and the jour
319c0 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  nal file does no
319d0 74 20 65 78 69 73 74 2e 0a 20 20 20 20 20 20 2a  t exist..      *
319e0 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 4f  /.      if( !isO
319f0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
31a00 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
31a10 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20  te3_vfs * const 
31a20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
31a30 56 66 73 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  Vfs;.        int
31a40 20 62 45 78 69 73 74 73 3b 20 20 20 20 20 20 20   bExists;       
31a50 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
31a60 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  f journal file e
31a70 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 20 20 20  xists */.       
31a80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
31a90 63 63 65 73 73 28 0a 20 20 20 20 20 20 20 20 20  ccess(.         
31aa0 20 20 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d     pVfs, pPager-
31ab0 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54  >zJournal, SQLIT
31ac0 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
31ad0 20 26 62 45 78 69 73 74 73 29 3b 0a 20 20 20 20   &bExists);.    
31ae0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
31af0 54 45 5f 4f 4b 20 26 26 20 62 45 78 69 73 74 73  TE_OK && bExists
31b00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
31b10 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20  t fout = 0;.    
31b20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 0a 23        int f = .#
31b30 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
31b40 5f 44 41 54 41 5f 50 52 4f 54 45 43 54 49 4f 4e  _DATA_PROTECTION
31b50 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 70 50  .            (pP
31b60 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 26 53  ager->vfsFlags&S
31b70 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 49 4c 45 50  QLITE_OPEN_FILEP
31b80 52 4f 54 45 43 54 49 4f 4e 5f 4d 41 53 4b 29 7c  ROTECTION_MASK)|
31b90 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
31ba0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
31bb0 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
31bc0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
31bd0 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  AL;.          as
31be0 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74  sert( !pPager->t
31bf0 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20  empFile );.     
31c00 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
31c10 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50  3OsOpen(pVfs, pP
31c20 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
31c30 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20  pPager->jfd, f, 
31c40 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  &fout);.        
31c50 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
31c60 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65  LITE_OK || isOpe
31c70 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
31c80 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
31c90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
31ca0 20 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45   fout&SQLITE_OPE
31cb0 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a 20 20  N_READONLY ){.  
31cc0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
31cd0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
31ce0 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20  KPT;.           
31cf0 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
31d00 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
31d10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31d20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20    }.      }. .  
31d30 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20      /* Playback 
31d40 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a  and delete the j
31d50 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68  ournal.  Drop th
31d60 65 20 64 61 74 61 62 61 73 65 20 77 72 69 74 65  e database write
31d70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61  .      ** lock a
31d80 6e 64 20 72 65 61 63 71 75 69 72 65 20 74 68 65  nd reacquire the
31d90 20 72 65 61 64 20 6c 6f 63 6b 2e 20 50 75 72 67   read lock. Purg
31da0 65 20 74 68 65 20 63 61 63 68 65 20 62 65 66 6f  e the cache befo
31db0 72 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c 61 79  re.      ** play
31dc0 69 6e 67 20 62 61 63 6b 20 74 68 65 20 68 6f 74  ing back the hot
31dd0 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61 74  -journal so that
31de0 20 77 65 20 64 6f 6e 27 74 20 65 6e 64 20 75 70   we don't end up
31df0 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 61   with.      ** a
31e00 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63  n inconsistent c
31e10 61 63 68 65 2e 20 20 53 79 6e 63 20 74 68 65 20  ache.  Sync the 
31e20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f  hot journal befo
31e30 72 65 20 70 6c 61 79 69 6e 67 0a 20 20 20 20 20  re playing.     
31e40 20 2a 2a 20 69 74 20 62 61 63 6b 20 73 69 6e 63   ** it back sinc
31e50 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  e the process th
31e60 61 74 20 63 72 61 73 68 65 64 20 61 6e 64 20 6c  at crashed and l
31e70 65 66 74 20 74 68 65 20 68 6f 74 20 6a 6f 75 72  eft the hot jour
31e80 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f  nal.      ** pro
31e90 62 61 62 6c 79 20 64 69 64 20 6e 6f 74 20 73 79  bably did not sy
31ea0 6e 63 20 69 74 20 61 6e 64 20 77 65 20 61 72 65  nc it and we are
31eb0 20 72 65 71 75 69 72 65 64 20 74 6f 20 61 6c 77   required to alw
31ec0 61 79 73 20 73 79 6e 63 0a 20 20 20 20 20 20 2a  ays sync.      *
31ed0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65  * the journal be
31ee0 66 6f 72 65 20 70 6c 61 79 69 6e 67 20 69 74 20  fore playing it 
31ef0 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  back..      */. 
31f00 20 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28       if( isOpen(
31f10 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
31f20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
31f30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
31f40 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
31f50 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61  gerSyncHotJourna
31f60 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  l(pPager);.     
31f70 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
31f80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
31f90 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
31fa0 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31 29  yback(pPager, 1)
31fb0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
31fc0 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
31fd0 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 20 20 20  ER_OPEN;.       
31fe0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
31ff0 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
32000 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20  usiveMode ){.   
32010 20 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b       pagerUnlock
32020 44 62 28 70 50 61 67 65 72 2c 20 53 48 41 52 45  Db(pPager, SHARE
32030 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d  D_LOCK);.      }
32040 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ..      if( rc!=
32050 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
32060 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
32070 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 69 66 20  nch is taken if 
32080 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
32090 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20  while trying to 
320a0 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  open.        ** 
320b0 6f 72 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 68  or roll back a h
320c0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 68 69 6c 65  ot-journal while
320d0 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c   holding an EXCL
320e0 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a  USIVE lock. The.
320f0 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72          ** pager
32100 5f 75 6e 6c 6f 63 6b 28 29 20 72 6f 75 74 69 6e  _unlock() routin
32110 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  e will be called
32120 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
32130 67 20 74 6f 20 75 6e 6c 6f 63 6b 0a 20 20 20 20  g to unlock.    
32140 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 2e      ** the file.
32150 20 49 66 20 74 68 65 20 75 6e 6c 6f 63 6b 20 61   If the unlock a
32160 74 74 65 6d 70 74 20 66 61 69 6c 73 2c 20 74 68  ttempt fails, th
32170 65 6e 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 6d  en Pager.eLock m
32180 75 73 74 20 62 65 0a 20 20 20 20 20 20 20 20 2a  ust be.        *
32190 2a 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e  * set to UNKNOWN
321a0 5f 4c 4f 43 4b 20 28 73 65 65 20 74 68 65 20 63  _LOCK (see the c
321b0 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65  omment above the
321c0 20 23 64 65 66 69 6e 65 20 66 6f 72 20 0a 20 20   #define for .  
321d0 20 20 20 20 20 20 2a 2a 20 55 4e 4b 4e 4f 57 4e        ** UNKNOWN
321e0 5f 4c 4f 43 4b 20 61 62 6f 76 65 20 66 6f 72 20  _LOCK above for 
321f0 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 29 2e  an explanation).
32200 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20   .        **.   
32210 20 20 20 20 20 2a 2a 20 49 6e 20 6f 72 64 65 72       ** In order
32220 20 74 6f 20 67 65 74 20 70 61 67 65 72 5f 75 6e   to get pager_un
32230 6c 6f 63 6b 28 29 20 74 6f 20 64 6f 20 74 68 69  lock() to do thi
32240 73 2c 20 73 65 74 20 50 61 67 65 72 2e 65 53 74  s, set Pager.eSt
32250 61 74 65 20 74 6f 0a 20 20 20 20 20 20 20 20 2a  ate to.        *
32260 2a 20 50 41 47 45 52 5f 45 52 52 4f 52 20 6e 6f  * PAGER_ERROR no
32270 77 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  w. This is not a
32280 63 74 75 61 6c 6c 79 20 63 6f 75 6e 74 65 64 20  ctually counted 
32290 61 73 20 61 20 74 72 61 6e 73 69 74 69 6f 6e 0a  as a transition.
322a0 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 45 52          ** to ER
322b0 52 4f 52 20 73 74 61 74 65 20 69 6e 20 74 68 65  ROR state in the
322c0 20 73 74 61 74 65 20 64 69 61 67 72 61 6d 20 61   state diagram a
322d0 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 69  t the top of thi
322e0 73 20 66 69 6c 65 2c 0a 20 20 20 20 20 20 20 20  s file,.        
322f0 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77  ** since we know
32300 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 63   that the same c
32310 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c  all to pager_unl
32320 6f 63 6b 28 29 20 77 69 6c 6c 20 76 65 72 79 0a  ock() will very.
32330 20 20 20 20 20 20 20 20 2a 2a 20 73 68 6f 72 74          ** short
32340 6c 79 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 68  ly transition th
32350 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 74  e pager object t
32360 6f 20 74 68 65 20 4f 50 45 4e 20 73 74 61 74 65  o the OPEN state
32370 2e 20 43 61 6c 6c 69 6e 67 0a 20 20 20 20 20 20  . Calling.      
32380 20 20 2a 2a 20 61 73 73 65 72 74 5f 70 61 67 65    ** assert_page
32390 72 5f 73 74 61 74 65 28 29 20 77 6f 75 6c 64 20  r_state() would 
323a0 66 61 69 6c 20 6e 6f 77 2c 20 61 73 20 69 74 20  fail now, as it 
323b0 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 70 6f  should not be po
323c0 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20 20 2a  ssible.        *
323d0 2a 20 74 6f 20 62 65 20 69 6e 20 45 52 52 4f 52  * to be in ERROR
323e0 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 65 72   state when ther
323f0 65 20 61 72 65 20 7a 65 72 6f 20 6f 75 74 73 74  e are zero outst
32400 61 6e 64 69 6e 67 20 70 61 67 65 20 0a 20 20 20  anding page .   
32410 20 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63       ** referenc
32420 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
32430 20 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72         pager_err
32440 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
32450 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69          goto fai
32460 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  led;.      }..  
32470 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
32480 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
32490 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20 20 20  R_OPEN );.      
324a0 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d  assert( (pPager-
324b0 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  >eLock==SHARED_L
324c0 4f 43 4b 29 0a 20 20 20 20 20 20 20 20 20 20 20  OCK).           
324d0 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c  || (pPager->excl
324e0 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61  usiveMode && pPa
324f0 67 65 72 2d 3e 65 4c 6f 63 6b 3e 53 48 41 52 45  ger->eLock>SHARE
32500 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 29 3b  D_LOCK).      );
32510 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
32520 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
32530 65 20 26 26 20 70 50 61 67 65 72 2d 3e 68 61 73  e && pPager->has
32540 42 65 65 6e 55 73 65 64 20 29 7b 0a 20 20 20 20  BeenUsed ){.    
32550 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 2d    /* The shared-
32560 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74 20 62 65  lock has just be
32570 65 6e 20 61 63 71 75 69 72 65 64 20 74 68 65 6e  en acquired then
32580 20 63 68 65 63 6b 20 74 6f 0a 20 20 20 20 20 20   check to.      
32590 2a 2a 20 73 65 65 20 69 66 20 74 68 65 20 64 61  ** see if the da
325a0 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20  tabase has been 
325b0 6d 6f 64 69 66 69 65 64 2e 20 20 49 66 20 74 68  modified.  If th
325c0 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20 63  e database has c
325d0 68 61 6e 67 65 64 2c 0a 20 20 20 20 20 20 2a 2a  hanged,.      **
325e0 20 66 6c 75 73 68 20 74 68 65 20 63 61 63 68 65   flush the cache
325f0 2e 20 20 54 68 65 20 70 50 61 67 65 72 2d 3e 68  .  The pPager->h
32600 61 73 42 65 65 6e 55 73 65 64 20 66 6c 61 67 20  asBeenUsed flag 
32610 70 72 65 76 65 6e 74 73 20 74 68 69 73 20 66 72  prevents this fr
32620 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 6f 63 63 75  om.      ** occu
32630 72 72 69 6e 67 20 6f 6e 20 74 68 65 20 76 65 72  rring on the ver
32640 79 20 66 69 72 73 74 20 61 63 63 65 73 73 20 74  y first access t
32650 6f 20 61 20 66 69 6c 65 2c 20 69 6e 20 6f 72 64  o a file, in ord
32660 65 72 20 74 6f 20 73 61 76 65 20 61 0a 20 20 20  er to save a.   
32670 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 75 6e 6e     ** single unn
32680 65 63 65 73 73 61 72 79 20 73 71 6c 69 74 65 33  ecessary sqlite3
32690 4f 73 52 65 61 64 28 29 20 63 61 6c 6c 20 61 74  OsRead() call at
326a0 20 74 68 65 20 73 74 61 72 74 2d 75 70 2e 0a 20   the start-up.. 
326b0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
326c0 20 44 61 74 61 62 61 73 65 20 63 68 61 6e 67 65   Database change
326d0 73 20 69 73 20 64 65 74 65 63 74 65 64 20 62 79  s is detected by
326e0 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20 62   looking at 15 b
326f0 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20  ytes beginning. 
32700 20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73 65       ** at offse
32710 74 20 32 34 20 69 6e 74 6f 20 74 68 65 20 66 69  t 24 into the fi
32720 6c 65 2e 20 20 54 68 65 20 66 69 72 73 74 20 34  le.  The first 4
32730 20 6f 66 20 74 68 65 73 65 20 31 36 20 62 79 74   of these 16 byt
32740 65 73 20 61 72 65 0a 20 20 20 20 20 20 2a 2a 20  es are.      ** 
32750 61 20 33 32 2d 62 69 74 20 63 6f 75 6e 74 65 72  a 32-bit counter
32760 20 74 68 61 74 20 69 73 20 69 6e 63 72 65 6d 65   that is increme
32770 6e 74 65 64 20 77 69 74 68 20 65 61 63 68 20 63  nted with each c
32780 68 61 6e 67 65 2e 20 20 54 68 65 0a 20 20 20 20  hange.  The.    
32790 20 20 2a 2a 20 6f 74 68 65 72 20 62 79 74 65 73    ** other bytes
327a0 20 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79   change randomly
327b0 20 77 69 74 68 20 65 61 63 68 20 66 69 6c 65 20   with each file 
327c0 63 68 61 6e 67 65 20 77 68 65 6e 0a 20 20 20 20  change when.    
327d0 20 20 2a 2a 20 61 20 63 6f 64 65 63 20 69 73 20    ** a codec is 
327e0 69 6e 20 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a  in use..      **
327f0 20 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65   .      ** There
32800 20 69 73 20 61 20 76 61 6e 69 73 68 69 6e 67 6c   is a vanishingl
32810 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74  y small chance t
32820 68 61 74 20 61 20 63 68 61 6e 67 65 20 77 69 6c  hat a change wil
32830 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 20 20  l not be .      
32840 2a 2a 20 64 65 74 65 63 74 65 64 2e 20 20 54 68  ** detected.  Th
32850 65 20 63 68 61 6e 63 65 20 6f 66 20 61 6e 20 75  e chance of an u
32860 6e 64 65 74 65 63 74 65 64 20 63 68 61 6e 67 65  ndetected change
32870 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61   is so small tha
32880 74 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61  t.      ** it ca
32890 6e 20 62 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a  n be neglected..
328a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 50        */.      P
328b0 67 6e 6f 20 6e 50 61 67 65 20 3d 20 30 3b 0a 20  gno nPage = 0;. 
328c0 20 20 20 20 20 63 68 61 72 20 64 62 46 69 6c 65       char dbFile
328d0 56 65 72 73 5b 73 69 7a 65 6f 66 28 70 50 61 67  Vers[sizeof(pPag
328e0 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 5d  er->dbFileVers)]
328f0 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ;..      rc = pa
32900 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
32910 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
32920 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
32930 6f 20 66 61 69 6c 65 64 3b 0a 0a 20 20 20 20 20  o failed;..     
32940 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a   if( nPage>0 ){.
32950 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
32960 28 22 43 4b 56 45 52 53 20 25 70 20 25 64 5c 6e  ("CKVERS %p %d\n
32970 22 2c 20 70 50 61 67 65 72 2c 20 73 69 7a 65 6f  ", pPager, sizeo
32980 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 29 3b  f(dbFileVers)));
32990 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
329a0 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
329b0 65 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65 56  er->fd, &dbFileV
329c0 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ers, sizeof(dbFi
329d0 6c 65 56 65 72 73 29 2c 20 32 34 29 3b 0a 20 20  leVers), 24);.  
329e0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
329f0 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53  LITE_OK && rc!=S
32a00 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
32a10 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
32a20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
32a30 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
32a40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
32a50 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65 72  memset(dbFileVer
32a60 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62 46  s, 0, sizeof(dbF
32a70 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20  ileVers));.     
32a80 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6d 65   }..      if( me
32a90 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62 46  mcmp(pPager->dbF
32aa0 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56  ileVers, dbFileV
32ab0 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ers, sizeof(dbFi
32ac0 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a 20  leVers))!=0 ){. 
32ad0 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73         pager_res
32ae0 65 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20  et(pPager);..   
32af0 20 20 20 20 20 2f 2a 20 55 6e 6d 61 70 20 74 68       /* Unmap th
32b00 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
32b10 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   It is possible 
32b20 74 68 61 74 20 65 78 74 65 72 6e 61 6c 20 70 72  that external pr
32b30 6f 63 65 73 73 65 73 0a 20 20 20 20 20 20 20 20  ocesses.        
32b40 2a 2a 20 6d 61 79 20 68 61 76 65 20 74 72 75 6e  ** may have trun
32b50 63 61 74 65 64 20 74 68 65 20 64 61 74 61 62 61  cated the databa
32b60 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 6e  se file and then
32b70 20 65 78 74 65 6e 64 65 64 20 69 74 20 62 61 63   extended it bac
32b80 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  k.        ** to 
32b90 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a  its original siz
32ba0 65 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f  e while this pro
32bb0 63 65 73 73 20 77 61 73 20 6e 6f 74 20 68 6f 6c  cess was not hol
32bc0 64 69 6e 67 20 61 20 6c 6f 63 6b 2e 0a 20 20 20  ding a lock..   
32bd0 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20       ** In this 
32be0 63 61 73 65 20 74 68 65 72 65 20 6d 61 79 20 65  case there may e
32bf0 78 69 73 74 20 61 20 50 61 67 65 72 2e 70 4d 61  xist a Pager.pMa
32c00 70 20 6d 61 70 70 69 6e 67 20 74 68 61 74 20 61  p mapping that a
32c10 70 70 65 61 72 73 0a 20 20 20 20 20 20 20 20 2a  ppears.        *
32c20 2a 20 74 6f 20 62 65 20 74 68 65 20 72 69 67 68  * to be the righ
32c30 74 20 73 69 7a 65 20 62 75 74 20 69 73 20 6e 6f  t size but is no
32c40 74 20 61 63 74 75 61 6c 6c 79 20 76 61 6c 69 64  t actually valid
32c50 2e 20 41 76 6f 69 64 20 74 68 69 73 0a 20 20 20  . Avoid this.   
32c60 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c       ** possibil
32c70 69 74 79 20 62 79 20 75 6e 6d 61 70 70 69 6e 67  ity by unmapping
32c80 20 74 68 65 20 64 62 20 68 65 72 65 2e 20 2a 2f   the db here. */
32c90 0a 20 20 20 20 20 20 20 20 69 66 28 20 55 53 45  .        if( USE
32ca0 46 45 54 43 48 28 70 50 61 67 65 72 29 20 29 7b  FETCH(pPager) ){
32cb0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
32cc0 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67  e3OsUnfetch(pPag
32cd0 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20  er->fd, 0, 0);. 
32ce0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
32cf0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
32d00 66 20 74 68 65 72 65 20 69 73 20 61 20 57 41 4c  f there is a WAL
32d10 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c   file in the fil
32d20 65 2d 73 79 73 74 65 6d 2c 20 6f 70 65 6e 20 74  e-system, open t
32d30 68 69 73 20 64 61 74 61 62 61 73 65 20 69 6e 20  his database in 
32d40 57 41 4c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 2e  WAL.    ** mode.
32d50 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
32d60 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69  following functi
32d70 6f 6e 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  on call is a no-
32d80 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  op..    */.    r
32d90 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 57 61 6c  c = pagerOpenWal
32da0 49 66 50 72 65 73 65 6e 74 28 70 50 61 67 65 72  IfPresent(pPager
32db0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
32dc0 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 61  E_OMIT_WAL.    a
32dd0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
32de0 57 61 6c 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51  Wal==0 || rc==SQ
32df0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 23 65 6e 64 69  LITE_OK );.#endi
32e00 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 61 67  f.  }..  if( pag
32e10 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
32e20 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
32e30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
32e40 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 42  .    rc = pagerB
32e50 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74  eginReadTransact
32e60 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ion(pPager);.  }
32e70 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
32e80 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
32e90 45 4e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  EN && rc==SQLITE
32ea0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
32eb0 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
32ec0 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e  Pager, &pPager->
32ed0 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 66  dbSize);.  }.. f
32ee0 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 72 63 21  ailed:.  if( rc!
32ef0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
32f00 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
32f10 20 29 3b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e   );.    pager_un
32f20 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
32f30 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
32f40 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
32f50 4f 50 45 4e 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  OPEN );.  }else{
32f60 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
32f70 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44  ate = PAGER_READ
32f80 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ER;.  }.  return
32f90 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66   rc;.}../*.** If
32fa0 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
32fb0 6f 75 6e 74 20 68 61 73 20 72 65 61 63 68 65 64  ount has reached
32fc0 20 7a 65 72 6f 2c 20 72 6f 6c 6c 62 61 63 6b 20   zero, rollback 
32fd0 61 6e 79 20 61 63 74 69 76 65 0a 2a 2a 20 74 72  any active.** tr
32fe0 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 75 6e  ansaction and un
32ff0 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 0a  lock the pager..
33000 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 6e  **.** Except, in
33010 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58   locking_mode=EX
33020 43 4c 55 53 49 56 45 20 77 68 65 6e 20 74 68 65  CLUSIVE when the
33030 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f  re is nothing to
33040 20 69 6e 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62   in.** the rollb
33050 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65  ack journal, the
33060 20 75 6e 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 70   unlock is not p
33070 65 72 66 6f 72 6d 65 64 20 61 6e 64 20 74 68 65  erformed and the
33080 72 65 20 69 73 0a 2a 2a 20 6e 6f 74 68 69 6e 67  re is.** nothing
33090 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 73 6f   to rollback, so
330a0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
330b0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73 74   a no-op..*/ .st
330c0 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55  atic void pagerU
330d0 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 50 61  nlockIfUnused(Pa
330e0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
330f0 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61  if( pPager->nMma
33100 70 4f 75 74 3d 3d 30 20 26 26 20 28 73 71 6c 69  pOut==0 && (sqli
33110 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
33120 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
33130 65 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70 61  e)==0) ){.    pa
33140 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
33150 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
33160 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  }.}../*.** Acqui
33170 72 65 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  re a reference t
33180 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 67  o page number pg
33190 6e 6f 20 69 6e 20 70 61 67 65 72 20 70 50 61 67  no in pager pPag
331a0 65 72 20 28 61 20 70 61 67 65 0a 2a 2a 20 72 65  er (a page.** re
331b0 66 65 72 65 6e 63 65 20 68 61 73 20 74 79 70 65  ference has type
331c0 20 44 62 50 61 67 65 2a 29 2e 20 49 66 20 74 68   DbPage*). If th
331d0 65 20 72 65 71 75 65 73 74 65 64 20 72 65 66 65  e requested refe
331e0 72 65 6e 63 65 20 69 73 20 0a 2a 2a 20 73 75 63  rence is .** suc
331f0 63 65 73 73 66 75 6c 6c 79 20 6f 62 74 61 69 6e  cessfully obtain
33200 65 64 2c 20 69 74 20 69 73 20 63 6f 70 69 65 64  ed, it is copied
33210 20 74 6f 20 2a 70 70 50 61 67 65 20 61 6e 64 20   to *ppPage and 
33220 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
33230 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
33240 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
33250 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
33260 65 20 63 61 63 68 65 2c 20 69 74 20 69 73 20 72  e cache, it is r
33270 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68  eturned. .** Oth
33280 65 72 77 69 73 65 2c 20 61 20 6e 65 77 20 70 61  erwise, a new pa
33290 67 65 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c  ge object is all
332a0 6f 63 61 74 65 64 20 61 6e 64 20 70 6f 70 75 6c  ocated and popul
332b0 61 74 65 64 20 77 69 74 68 20 64 61 74 61 0a 2a  ated with data.*
332c0 2a 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  * read from the 
332d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
332e0 6e 20 73 6f 6d 65 20 63 61 73 65 73 2c 20 74 68  n some cases, th
332f0 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 20  e pcache module 
33300 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f  may.** choose no
33310 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20  t to allocate a 
33320 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20  new page object 
33330 61 6e 64 20 6d 61 79 20 72 65 75 73 65 20 61 6e  and may reuse an
33340 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a   existing.** obj
33350 65 63 74 20 77 69 74 68 20 6e 6f 20 6f 75 74 73  ect with no outs
33360 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
33370 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78  es..**.** The ex
33380 74 72 61 20 64 61 74 61 20 61 70 70 65 6e 64 65  tra data appende
33390 64 20 74 6f 20 61 20 70 61 67 65 20 69 73 20 61  d to a page is a
333a0 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65  lways initialize
333b0 64 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 0a  d to zeros the .
333c0 2a 2a 20 66 69 72 73 74 20 74 69 6d 65 20 61 20  ** first time a 
333d0 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69  page is loaded i
333e0 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 49 66 20 74  nto memory. If t
333f0 68 65 20 70 61 67 65 20 72 65 71 75 65 73 74 65  he page requeste
33400 64 20 69 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79  d is .** already
33410 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 77 68   in the cache wh
33420 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
33430 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e   is called, then
33440 20 74 68 65 20 65 78 74 72 61 0a 2a 2a 20 64 61   the extra.** da
33450 74 61 20 69 73 20 6c 65 66 74 20 61 73 20 69 74  ta is left as it
33460 20 77 61 73 20 77 68 65 6e 20 74 68 65 20 70 61   was when the pa
33470 67 65 20 6f 62 6a 65 63 74 20 77 61 73 20 6c 61  ge object was la
33480 73 74 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  st used..**.** I
33490 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
334a0 6d 61 67 65 20 69 73 20 73 6d 61 6c 6c 65 72 20  mage is smaller 
334b0 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74  than the request
334c0 65 64 20 70 61 67 65 20 6f 72 20 69 66 20 61 20  ed page or if a 
334d0 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  .** non-zero val
334e0 75 65 20 69 73 20 70 61 73 73 65 64 20 61 73 20  ue is passed as 
334f0 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 70 61  the noContent pa
33500 72 61 6d 65 74 65 72 20 61 6e 64 20 74 68 65 20  rameter and the 
33510 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20 70 61  .** requested pa
33520 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
33530 79 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  y stored in the 
33540 63 61 63 68 65 2c 20 74 68 65 6e 20 6e 6f 20 0a  cache, then no .
33550 2a 2a 20 61 63 74 75 61 6c 20 64 69 73 6b 20 72  ** actual disk r
33560 65 61 64 20 6f 63 63 75 72 73 2e 20 49 6e 20 74  ead occurs. In t
33570 68 69 73 20 63 61 73 65 20 74 68 65 20 6d 65 6d  his case the mem
33580 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65  ory image of the
33590 20 0a 2a 2a 20 70 61 67 65 20 69 73 20 69 6e 69   .** page is ini
335a0 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 20  tialized to all 
335b0 7a 65 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  zeros. .**.** If
335c0 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72   noContent is tr
335d0 75 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ue, it means tha
335e0 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  t we do not care
335f0 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65   about the conte
33600 6e 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61  nts.** of the pa
33610 67 65 2e 20 54 68 69 73 20 6f 63 63 75 72 73 20  ge. This occurs 
33620 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73  in two scenarios
33630 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 57 68 65  :.**.**   a) Whe
33640 6e 20 72 65 61 64 69 6e 67 20 61 20 66 72 65 65  n reading a free
33650 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20  -list leaf page 
33660 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
33670 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 62  e, and.**.**   b
33680 29 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69  ) When a savepoi
33690 6e 74 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c  nt is being roll
336a0 65 64 20 62 61 63 6b 20 61 6e 64 20 77 65 20 6e  ed back and we n
336b0 65 65 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 20  eed to load.**  
336c0 20 20 20 20 61 20 6e 65 77 20 70 61 67 65 20 69      a new page i
336d0 6e 74 6f 20 74 68 65 20 63 61 63 68 65 20 74 6f  nto the cache to
336e0 20 62 65 20 66 69 6c 6c 65 64 20 77 69 74 68 20   be filled with 
336f0 74 68 65 20 64 61 74 61 20 72 65 61 64 0a 2a 2a  the data read.**
33700 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 73        from the s
33710 61 76 65 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c  avepoint journal
33720 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e  ..**.** If noCon
33730 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20 74 68  tent is true, th
33740 65 6e 20 74 68 65 20 64 61 74 61 20 72 65 74 75  en the data retu
33750 72 6e 65 64 20 69 73 20 7a 65 72 6f 65 64 20 69  rned is zeroed i
33760 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 62 65 69  nstead of.** bei
33770 6e 67 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ng read from the
33780 20 64 61 74 61 62 61 73 65 2e 20 41 64 64 69 74   database. Addit
33790 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20 62 69 74  ionally, the bit
337a0 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  s corresponding.
337b0 2a 2a 20 74 6f 20 70 67 6e 6f 20 69 6e 20 50 61  ** to pgno in Pa
337c0 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 28  ger.pInJournal (
337d0 62 69 74 76 65 63 20 6f 66 20 70 61 67 65 73 20  bitvec of pages 
337e0 61 6c 72 65 61 64 79 20 77 72 69 74 74 65 6e 20  already written 
337f0 74 6f 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  to the.** journa
33800 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20  l file) and the 
33810 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70  PagerSavepoint.p
33820 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76  InSavepoint bitv
33830 65 63 73 20 6f 66 20 61 6e 79 20 6f 70 65 6e 0a  ecs of any open.
33840 2a 2a 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72  ** savepoints ar
33850 65 20 73 65 74 2e 20 54 68 69 73 20 6d 65 61 6e  e set. This mean
33860 73 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  s if the page is
33870 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 20 61   made writable a
33880 74 20 61 6e 79 0a 2a 2a 20 70 6f 69 6e 74 20 69  t any.** point i
33890 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 75 73  n the future, us
338a0 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ing a call to sq
338b0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
338c0 29 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a  ), its contents.
338d0 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6a  ** will not be j
338e0 6f 75 72 6e 61 6c 65 64 2e 20 54 68 69 73 20 73  ournaled. This s
338f0 61 76 65 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54  aves IO..**.** T
33900 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d  he acquisition m
33910 69 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65  ight fail for se
33920 76 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20  veral reasons.  
33930 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a  In all cases,.**
33940 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
33950 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
33960 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61  turned and *ppPa
33970 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  ge is set to NUL
33980 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  L..**.** See als
33990 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  o sqlite3PagerLo
339a0 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68  okup().  Both th
339b0 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c  is routine and L
339c0 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a  ookup() attempt.
339d0 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67  ** to find a pag
339e0 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  e in the in-memo
339f0 72 79 20 63 61 63 68 65 20 66 69 72 73 74 2e 20  ry cache first. 
33a00 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
33a10 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69  not already.** i
33a20 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72  n memory, this r
33a30 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64  outine goes to d
33a40 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69  isk to read it i
33a50 6e 20 77 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70  n whereas Lookup
33a60 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72  ().** just retur
33a70 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74  ns 0.  This rout
33a80 69 6e 65 20 61 63 71 75 69 72 65 73 20 61 20 72  ine acquires a r
33a90 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72  ead-lock the fir
33aa0 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61  st time it.** ha
33ab0 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c  s to go to disk,
33ac0 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20   and could also 
33ad0 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20  playback an old 
33ae0 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73  journal if neces
33af0 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c  sary..** Since L
33b00 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f  ookup() never go
33b10 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e  es to disk, it n
33b20 65 76 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c  ever has to deal
33b30 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f   with locks.** o
33b40 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e  r journal files.
33b50 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
33b60 61 67 65 72 41 63 71 75 69 72 65 28 0a 20 20 50  agerAcquire(.  P
33b70 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
33b80 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
33b90 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  open on the data
33ba0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50  base file */.  P
33bb0 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
33bc0 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
33bd0 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20  r to fetch */.  
33be0 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  DbPage **ppPage,
33bf0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70      /* Write a p
33c00 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
33c10 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  ge here */.  int
33c20 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
33c30 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 58 58   /* PAGER_GET_XX
33c40 58 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20  X flags */.){.  
33c50 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
33c60 4f 4b 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  OK;.  PgHdr *pPg
33c70 20 3d 20 30 3b 0a 20 20 75 33 32 20 69 46 72 61   = 0;.  u32 iFra
33c80 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  me = 0;         
33c90 20 20 20 20 20 20 20 20 2f 2a 20 46 72 61 6d 65          /* Frame
33ca0 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 57 41   to read from WA
33cb0 4c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73  L file */.  cons
33cc0 74 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20  t int noContent 
33cd0 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52  = (flags & PAGER
33ce0 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 29 3b  _GET_NOCONTENT);
33cf0 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 61 63 63  ..  /* It is acc
33d00 65 70 74 61 62 6c 65 20 74 6f 20 75 73 65 20 61  eptable to use a
33d10 20 72 65 61 64 2d 6f 6e 6c 79 20 28 6d 6d 61 70   read-only (mmap
33d20 29 20 70 61 67 65 20 66 6f 72 20 61 6e 79 20 70  ) page for any p
33d30 61 67 65 20 65 78 63 65 70 74 0a 20 20 2a 2a 20  age except.  ** 
33d40 70 61 67 65 20 31 20 69 66 20 74 68 65 72 65 20  page 1 if there 
33d50 69 73 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e  is no write-tran
33d60 73 61 63 74 69 6f 6e 20 6f 70 65 6e 20 6f 72 20  saction open or 
33d70 74 68 65 20 41 43 51 55 49 52 45 5f 52 45 41 44  the ACQUIRE_READ
33d80 4f 4e 4c 59 0a 20 20 2a 2a 20 66 6c 61 67 20 77  ONLY.  ** flag w
33d90 61 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20  as specified by 
33da0 74 68 65 20 63 61 6c 6c 65 72 2e 20 41 6e 64 20  the caller. And 
33db0 73 6f 20 6c 6f 6e 67 20 61 73 20 74 68 65 20 64  so long as the d
33dc0 62 20 69 73 20 6e 6f 74 20 61 20 0a 20 20 2a 2a  b is not a .  **
33dd0 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e   temporary or in
33de0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
33df0 2e 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e  .  */.  const in
33e00 74 20 62 4d 6d 61 70 4f 6b 20 3d 20 28 70 67 6e  t bMmapOk = (pgn
33e10 6f 21 3d 31 20 26 26 20 55 53 45 46 45 54 43 48  o!=1 && USEFETCH
33e20 28 70 50 61 67 65 72 29 0a 20 20 20 26 26 20 28  (pPager).   && (
33e30 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
33e40 50 41 47 45 52 5f 52 45 41 44 45 52 20 7c 7c 20  PAGER_READER || 
33e50 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 47  (flags & PAGER_G
33e60 45 54 5f 52 45 41 44 4f 4e 4c 59 29 29 0a 23 69  ET_READONLY)).#i
33e70 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
33e80 43 4f 44 45 43 0a 20 20 20 26 26 20 70 50 61 67  CODEC.   && pPag
33e90 65 72 2d 3e 78 43 6f 64 65 63 3d 3d 30 0a 23 65  er->xCodec==0.#e
33ea0 6e 64 69 66 0a 20 20 29 3b 0a 0a 20 20 61 73 73  ndif.  );..  ass
33eb0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
33ec0 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45  ate>=PAGER_READE
33ed0 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  R );.  assert( a
33ee0 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
33ef0 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  e(pPager) );.  a
33f00 73 73 65 72 74 28 20 6e 6f 43 6f 6e 74 65 6e 74  ssert( noContent
33f10 3d 3d 30 20 7c 7c 20 62 4d 6d 61 70 4f 6b 3d 3d  ==0 || bMmapOk==
33f20 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f  0 );..  if( pgno
33f30 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
33f40 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
33f50 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 50 61  _BKPT;.  }.  pPa
33f60 67 65 72 2d 3e 68 61 73 42 65 65 6e 55 73 65 64  ger->hasBeenUsed
33f70 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 74   = 1;..  /* If t
33f80 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74  he pager is in t
33f90 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  he error state, 
33fa0 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
33fb0 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 0a 20 20  immediately. .  
33fc0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  ** Otherwise, re
33fd0 71 75 65 73 74 20 74 68 65 20 70 61 67 65 20 66  quest the page f
33fe0 72 6f 6d 20 74 68 65 20 50 43 61 63 68 65 20 6c  rom the PCache l
33ff0 61 79 65 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70  ayer. */.  if( p
34000 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d  Pager->errCode!=
34010 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
34020 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72   rc = pPager->er
34030 72 43 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rCode;.  }else{.
34040 20 20 20 20 69 66 28 20 62 4d 6d 61 70 4f 6b 20      if( bMmapOk 
34050 26 26 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  && pagerUseWal(p
34060 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
34070 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46  rc = sqlite3WalF
34080 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d  indFrame(pPager-
34090 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 46  >pWal, pgno, &iF
340a0 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28  rame);.      if(
340b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
340c0 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75   goto pager_acqu
340d0 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a  ire_err;.    }..
340e0 20 20 20 20 69 66 28 20 62 4d 6d 61 70 4f 6b 20      if( bMmapOk 
340f0 26 26 20 69 46 72 61 6d 65 3d 3d 30 20 29 7b 0a  && iFrame==0 ){.
34100 20 20 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74        void *pDat
34110 61 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 72 63  a = 0;..      rc
34120 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 65 74 63   = sqlite3OsFetc
34130 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 0a 20  h(pPager->fd, . 
34140 20 20 20 20 20 20 20 20 20 28 69 36 34 29 28 70           (i64)(p
34150 67 6e 6f 2d 31 29 20 2a 20 70 50 61 67 65 72 2d  gno-1) * pPager-
34160 3e 70 61 67 65 53 69 7a 65 2c 20 70 50 61 67 65  >pageSize, pPage
34170 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 26 70 44  r->pageSize, &pD
34180 61 74 61 0a 20 20 20 20 20 20 29 3b 0a 0a 20 20  ata.      );..  
34190 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
341a0 54 45 5f 4f 4b 20 26 26 20 70 44 61 74 61 20 29  TE_OK && pData )
341b0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
341c0 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50 41 47  ager->eState>PAG
341d0 45 52 5f 52 45 41 44 45 52 20 29 7b 0a 20 20 20  ER_READER ){.   
341e0 20 20 20 20 20 20 20 70 50 67 20 3d 20 73 71 6c         pPg = sql
341f0 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
34200 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
34210 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
34220 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20   if( pPg==0 ){. 
34230 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
34240 67 65 72 41 63 71 75 69 72 65 4d 61 70 50 61 67  gerAcquireMapPag
34250 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  e(pPager, pgno, 
34260 70 44 61 74 61 2c 20 26 70 50 67 29 3b 0a 20 20  pData, &pPg);.  
34270 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
34280 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
34290 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e  Unfetch(pPager->
342a0 66 64 2c 20 28 69 36 34 29 28 70 67 6e 6f 2d 31  fd, (i64)(pgno-1
342b0 29 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  )*pPager->pageSi
342c0 7a 65 2c 20 70 44 61 74 61 29 3b 0a 20 20 20 20  ze, pData);.    
342d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
342e0 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20 20  ( pPg ){.       
342f0 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
34300 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
34310 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
34320 70 50 67 3b 0a 20 20 20 20 20 20 20 20 20 20 72  pPg;.          r
34330 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
34340 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
34350 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 21   }.      if( rc!
34360 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
34370 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72        goto pager
34380 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20  _acquire_err;.  
34390 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
343a0 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
343b0 5f 70 63 61 63 68 65 5f 70 61 67 65 20 2a 70 42  _pcache_page *pB
343c0 61 73 65 3b 0a 20 20 20 20 20 20 70 42 61 73 65  ase;.      pBase
343d0 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
343e0 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50  Fetch(pPager->pP
343f0 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 33 29 3b  Cache, pgno, 3);
34400 0a 20 20 20 20 20 20 69 66 28 20 70 42 61 73 65  .      if( pBase
34410 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
34420 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  c = sqlite3Pcach
34430 65 46 65 74 63 68 53 74 72 65 73 73 28 70 50 61  eFetchStress(pPa
34440 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67  ger->pPCache, pg
34450 6e 6f 2c 20 26 70 42 61 73 65 29 3b 0a 20 20 20  no, &pBase);.   
34460 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
34470 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70 61  ITE_OK ) goto pa
34480 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
34490 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
344a0 50 67 20 3d 20 2a 70 70 50 61 67 65 20 3d 20 73  Pg = *ppPage = s
344b0 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
344c0 68 46 69 6e 69 73 68 28 70 50 61 67 65 72 2d 3e  hFinish(pPager->
344d0 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 70  pPCache, pgno, p
344e0 42 61 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Base);.      if(
344f0 20 70 50 67 3d 3d 30 20 29 20 72 63 20 3d 20 53   pPg==0 ) rc = S
34500 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
34510 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
34520 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
34530 20 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65     /* Either the
34540 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
34550 50 63 61 63 68 65 46 65 74 63 68 28 29 20 72 65  PcacheFetch() re
34560 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20  turned an error 
34570 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61  or the.    ** pa
34580 67 65 72 20 77 61 73 20 61 6c 72 65 61 64 79 20  ger was already 
34590 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61  in the error-sta
345a0 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  te when this fun
345b0 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64  ction was called
345c0 2e 0a 20 20 20 20 2a 2a 20 53 65 74 20 70 50 67  ..    ** Set pPg
345d0 20 74 6f 20 30 20 61 6e 64 20 6a 75 6d 70 20 74   to 0 and jump t
345e0 6f 20 74 68 65 20 65 78 63 65 70 74 69 6f 6e 20  o the exception 
345f0 68 61 6e 64 6c 65 72 2e 20 20 2a 2f 0a 20 20 20  handler.  */.   
34600 20 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 67 6f   pPg = 0;.    go
34610 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65  to pager_acquire
34620 5f 65 72 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65  _err;.  }.  asse
34630 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70  rt( (*ppPage)->p
34640 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61  gno==pgno );.  a
34650 73 73 65 72 74 28 20 28 2a 70 70 50 61 67 65 29  ssert( (*ppPage)
34660 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72  ->pPager==pPager
34670 20 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e 70   || (*ppPage)->p
34680 50 61 67 65 72 3d 3d 30 20 29 3b 0a 0a 20 20 69  Pager==0 );..  i
34690 66 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50  f( (*ppPage)->pP
346a0 61 67 65 72 20 26 26 20 21 6e 6f 43 6f 6e 74 65  ager && !noConte
346b0 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20  nt ){.    /* In 
346c0 74 68 69 73 20 63 61 73 65 20 74 68 65 20 70 63  this case the pc
346d0 61 63 68 65 20 61 6c 72 65 61 64 79 20 63 6f 6e  ache already con
346e0 74 61 69 6e 73 20 61 6e 20 69 6e 69 74 69 61 6c  tains an initial
346f0 69 7a 65 64 20 63 6f 70 79 20 6f 66 0a 20 20 20  ized copy of.   
34700 20 2a 2a 20 74 68 65 20 70 61 67 65 2e 20 52 65   ** the page. Re
34710 74 75 72 6e 20 77 69 74 68 6f 75 74 20 66 75 72  turn without fur
34720 74 68 65 72 20 61 64 6f 2e 20 20 2a 2f 0a 20 20  ther ado.  */.  
34730 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d    assert( pgno<=
34740 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 26  PAGER_MAX_PGNO &
34750 26 20 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a  & pgno!=PAGER_MJ
34760 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b  _PGNO(pPager) );
34770 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74  .    pPager->aSt
34780 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 48 49  at[PAGER_STAT_HI
34790 54 5d 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e  T]++;.    return
347a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d   SQLITE_OK;..  }
347b0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
347c0 20 70 61 67 65 72 20 63 61 63 68 65 20 68 61 73   pager cache has
347d0 20 63 72 65 61 74 65 64 20 61 20 6e 65 77 20 70   created a new p
347e0 61 67 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74  age. Its content
347f0 20 6e 65 65 64 73 20 74 6f 20 0a 20 20 20 20 2a   needs to .    *
34800 2a 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  * be initialized
34810 2e 20 20 2a 2f 0a 0a 20 20 20 20 70 50 67 20 3d  .  */..    pPg =
34820 20 2a 70 70 50 61 67 65 3b 0a 20 20 20 20 70 50   *ppPage;.    pP
34830 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67  g->pPager = pPag
34840 65 72 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  er;..    /* The 
34850 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d  maximum page num
34860 62 65 72 20 69 73 20 32 5e 33 31 2e 20 52 65 74  ber is 2^31. Ret
34870 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
34880 50 54 20 69 66 20 61 20 70 61 67 65 0a 20 20 20  PT if a page.   
34890 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65 61 74   ** number great
348a0 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 6f 72  er than this, or
348b0 20 74 68 65 20 75 6e 75 73 65 64 20 6c 6f 63 6b   the unused lock
348c0 69 6e 67 2d 70 61 67 65 2c 20 69 73 20 72 65 71  ing-page, is req
348d0 75 65 73 74 65 64 2e 20 2a 2f 0a 20 20 20 20 69  uested. */.    i
348e0 66 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41  f( pgno>PAGER_MA
348f0 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d  X_PGNO || pgno==
34900 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
34910 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72  ager) ){.      r
34920 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
34930 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  PT_BKPT;.      g
34940 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
34950 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20  e_err;.    }..  
34960 20 20 69 66 28 20 4d 45 4d 44 42 20 7c 7c 20 70    if( MEMDB || p
34970 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 67  Pager->dbSize<pg
34980 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20  no || noContent 
34990 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  || !isOpen(pPage
349a0 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20  r->fd) ){.      
349b0 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d  if( pgno>pPager-
349c0 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20  >mxPgno ){.     
349d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46     rc = SQLITE_F
349e0 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  ULL;.        got
349f0 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
34a00 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  err;.      }.   
34a10 20 20 20 69 66 28 20 6e 6f 43 6f 6e 74 65 6e 74     if( noContent
34a20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   ){.        /* F
34a30 61 69 6c 75 72 65 20 74 6f 20 73 65 74 20 74 68  ailure to set th
34a40 65 20 62 69 74 73 20 69 6e 20 74 68 65 20 49 6e  e bits in the In
34a50 4a 6f 75 72 6e 61 6c 20 62 69 74 2d 76 65 63 74  Journal bit-vect
34a60 6f 72 73 20 69 73 20 62 65 6e 69 67 6e 2e 0a 20  ors is benign.. 
34a70 20 20 20 20 20 20 20 2a 2a 20 49 74 20 6d 65 72         ** It mer
34a80 65 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20 77  ely means that w
34a90 65 20 6d 69 67 68 74 20 64 6f 20 73 6f 6d 65 20  e might do some 
34aa0 65 78 74 72 61 20 77 6f 72 6b 20 74 6f 20 6a 6f  extra work to jo
34ab0 75 72 6e 61 6c 20 61 20 0a 20 20 20 20 20 20 20  urnal a .       
34ac0 20 2a 2a 20 70 61 67 65 20 74 68 61 74 20 64 6f   ** page that do
34ad0 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
34ae0 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 20 4e 65  e journaled.  Ne
34af0 76 65 72 74 68 65 6c 65 73 73 2c 20 62 65 20 73  vertheless, be s
34b00 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ure .        ** 
34b10 74 6f 20 74 65 73 74 20 74 68 65 20 63 61 73 65  to test the case
34b20 20 77 68 65 72 65 20 61 20 6d 61 6c 6c 6f 63 20   where a malloc 
34b30 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
34b40 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 73 65 74  le trying to set
34b50 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 62   .        ** a b
34b60 69 74 20 69 6e 20 61 20 62 69 74 20 76 65 63 74  it in a bit vect
34b70 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  or..        */. 
34b80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65         sqlite3Be
34b90 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
34ba0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
34bb0 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f  gno<=pPager->dbO
34bc0 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  rigSize ){.     
34bd0 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72       TESTONLY( r
34be0 63 20 3d 20 29 20 73 71 6c 69 74 65 33 42 69 74  c = ) sqlite3Bit
34bf0 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70  vecSet(pPager->p
34c00 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29  InJournal, pgno)
34c10 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
34c20 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  case( rc==SQLITE
34c30 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
34c40 20 20 7d 0a 20 20 20 20 20 20 20 20 54 45 53 54    }.        TEST
34c50 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 61 64 64  ONLY( rc = ) add
34c60 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65  ToSavepointBitve
34c70 63 73 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  cs(pPager, pgno)
34c80 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
34c90 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
34ca0 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
34cb0 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
34cc0 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
34cd0 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  }.      memset(p
34ce0 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50  Pg->pData, 0, pP
34cf0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
34d00 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
34d10 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20  "ZERO %p %d\n", 
34d20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a  pPager, pgno));.
34d30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
34d40 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
34d50 28 70 50 61 67 65 72 29 20 26 26 20 62 4d 6d 61  (pPager) && bMma
34d60 70 4f 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pOk==0 ){.      
34d70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
34d80 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65  lFindFrame(pPage
34d90 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26  r->pWal, pgno, &
34da0 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  iFrame);.       
34db0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
34dc0 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67 65 72 5f  OK ) goto pager_
34dd0 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
34de0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
34df0 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d  t( pPg->pPager==
34e00 70 50 61 67 65 72 20 29 3b 0a 20 20 20 20 20 20  pPager );.      
34e10 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41  pPager->aStat[PA
34e20 47 45 52 5f 53 54 41 54 5f 4d 49 53 53 5d 2b 2b  GER_STAT_MISS]++
34e30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61  ;.      rc = rea
34e40 64 44 62 50 61 67 65 28 70 50 67 2c 20 69 46 72  dDbPage(pPg, iFr
34e50 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
34e60 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
34e70 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61  .        goto pa
34e80 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
34e90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
34ea0 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67     pager_set_pag
34eb0 65 68 61 73 68 28 70 50 67 29 3b 0a 20 20 7d 0a  ehash(pPg);.  }.
34ec0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
34ed0 5f 4f 4b 3b 0a 0a 70 61 67 65 72 5f 61 63 71 75  _OK;..pager_acqu
34ee0 69 72 65 5f 65 72 72 3a 0a 20 20 61 73 73 65 72  ire_err:.  asser
34ef0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
34f00 20 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b   );.  if( pPg ){
34f10 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
34f20 68 65 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 7d  heDrop(pPg);.  }
34f30 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66  .  pagerUnlockIf
34f40 55 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a  Unused(pPager);.
34f50 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a  .  *ppPage = 0;.
34f60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
34f70 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
34f80 70 61 67 65 20 69 66 20 69 74 20 69 73 20 61 6c  page if it is al
34f90 72 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d  ready in the in-
34fa0 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44  memory cache.  D
34fb0 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68  o.** not read th
34fc0 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b  e page from disk
34fd0 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
34fe0 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c  ter to the page,
34ff0 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20  .** or 0 if the 
35000 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
35010 61 63 68 65 2e 20 0a 2a 2a 0a 2a 2a 20 53 65 65  ache. .**.** See
35020 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67   also sqlite3Pag
35030 65 72 47 65 74 28 29 2e 20 20 54 68 65 20 64 69  erGet().  The di
35040 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
35050 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
35060 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65   and sqlite3Page
35070 72 47 65 74 28 29 20 69 73 20 74 68 61 74 20 5f  rGet() is that _
35080 67 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f  get() will go to
35090 20 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65   the disk and re
350a0 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67  ad.** in the pag
350b0 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  e if the page is
350c0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20   not already in 
350d0 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75  cache.  This rou
350e0 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tine.** returns 
350f0 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65  NULL if the page
35100 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
35110 20 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f   or if a disk I/
35120 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20  O error .** has 
35130 65 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a  ever happened..*
35140 2f 0a 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65  /.DbPage *sqlite
35150 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67  3PagerLookup(Pag
35160 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
35170 20 70 67 6e 6f 29 7b 0a 20 20 73 71 6c 69 74 65   pgno){.  sqlite
35180 33 5f 70 63 61 63 68 65 5f 70 61 67 65 20 2a 70  3_pcache_page *p
35190 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
351a0 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61  pPager!=0 );.  a
351b0 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29  ssert( pgno!=0 )
351c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
351d0 65 72 2d 3e 70 50 43 61 63 68 65 21 3d 30 20 29  er->pPCache!=0 )
351e0 3b 0a 20 20 70 50 61 67 65 20 3d 20 73 71 6c 69  ;.  pPage = sqli
351f0 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70  te3PcacheFetch(p
35200 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
35210 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 61 73 73 65  pgno, 0);.  asse
35220 72 74 28 20 70 50 61 67 65 3d 3d 30 20 7c 7c 20  rt( pPage==0 || 
35230 70 50 61 67 65 72 2d 3e 68 61 73 42 65 65 6e 55  pPager->hasBeenU
35240 73 65 64 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  sed );.  return 
35250 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
35260 63 68 46 69 6e 69 73 68 28 70 50 61 67 65 72 2d  chFinish(pPager-
35270 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20  >pPCache, pgno, 
35280 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pPage);.}../*.**
35290 20 52 65 6c 65 61 73 65 20 61 20 70 61 67 65 20   Release a page 
352a0 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a  reference..**.**
352b0 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   If the number o
352c0 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
352d0 74 68 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f  the page drop to
352e0 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a   zero, then the.
352f0 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64 65 64  ** page is added
35300 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74   to the LRU list
35310 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65  .  When all refe
35320 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61  rences to all pa
35330 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61  ges.** are relea
35340 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20  sed, a rollback 
35350 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c  occurs and the l
35360 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
35370 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65  ase is.** remove
35380 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
35390 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e  e3PagerUnrefNotN
353a0 75 6c 6c 28 44 62 50 61 67 65 20 2a 70 50 67 29  ull(DbPage *pPg)
353b0 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
353c0 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  r;.  assert( pPg
353d0 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 72 20  !=0 );.  pPager 
353e0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
353f0 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 20   if( pPg->flags 
35400 26 20 50 47 48 44 52 5f 4d 4d 41 50 20 29 7b 0a  & PGHDR_MMAP ){.
35410 20 20 20 20 70 61 67 65 72 52 65 6c 65 61 73 65      pagerRelease
35420 4d 61 70 50 61 67 65 28 70 50 67 29 3b 0a 20 20  MapPage(pPg);.  
35430 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
35440 65 33 50 63 61 63 68 65 52 65 6c 65 61 73 65 28  e3PcacheRelease(
35450 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65  pPg);.  }.  page
35460 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28  rUnlockIfUnused(
35470 70 50 61 67 65 72 29 3b 0a 7d 0a 76 6f 69 64 20  pPager);.}.void 
35480 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
35490 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  f(DbPage *pPg){.
354a0 20 20 69 66 28 20 70 50 67 20 29 20 73 71 6c 69    if( pPg ) sqli
354b0 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74  te3PagerUnrefNot
354c0 4e 75 6c 6c 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a  Null(pPg);.}../*
354d0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
354e0 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 74 20 74  n is called at t
354f0 68 65 20 73 74 61 72 74 20 6f 66 20 65 76 65 72  he start of ever
35500 79 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  y write transact
35510 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65 20 6d 75  ion..** There mu
35520 73 74 20 61 6c 72 65 61 64 79 20 62 65 20 61 20  st already be a 
35530 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c  RESERVED or EXCL
35540 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
35550 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66  e database .** f
35560 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ile when this ro
35570 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
35580 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20  .**.** Open the 
35590 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
355a0 20 70 61 67 65 72 20 70 50 61 67 65 72 20 61 6e   pager pPager an
355b0 64 20 77 72 69 74 65 20 61 20 6a 6f 75 72 6e 61  d write a journa
355c0 6c 20 68 65 61 64 65 72 0a 2a 2a 20 74 6f 20 74  l header.** to t
355d0 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 2e 20  he start of it. 
355e0 49 66 20 74 68 65 72 65 20 61 72 65 20 61 63 74  If there are act
355f0 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 2c 20  ive savepoints, 
35600 6f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75  open the sub-jou
35610 72 6e 61 6c 0a 2a 2a 20 61 73 20 77 65 6c 6c 2e  rnal.** as well.
35620 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
35630 73 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e  s only used when
35640 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
35650 65 20 69 73 20 62 65 69 6e 67 20 0a 2a 2a 20 6f  e is being .** o
35660 70 65 6e 65 64 20 74 6f 20 77 72 69 74 65 20 61  pened to write a
35670 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20 66 6f   rollback log fo
35680 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  r a transaction.
35690 20 49 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20   It is not used 
356a0 0a 2a 2a 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67  .** when opening
356b0 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 66   a hot journal f
356c0 69 6c 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62  ile to roll it b
356d0 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
356e0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
356f0 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 28  s already open (
35700 61 73 20 69 74 20 6d 61 79 20 62 65 20 69 6e 20  as it may be in 
35710 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 2c  exclusive mode),
35720 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 66 75  .** then this fu
35730 6e 63 74 69 6f 6e 20 6a 75 73 74 20 77 72 69 74  nction just writ
35740 65 73 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61  es a journal hea
35750 64 65 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  der to the start
35760 20 6f 66 20 74 68 65 0a 2a 2a 20 61 6c 72 65 61   of the.** alrea
35770 64 79 20 6f 70 65 6e 20 66 69 6c 65 2e 20 0a 2a  dy open file. .*
35780 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20  *.** Whether or 
35790 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  not the journal 
357a0 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 62  file is opened b
357b0 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  y this function,
357c0 20 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e 70 49   the.** Pager.pI
357d0 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20  nJournal bitvec 
357e0 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c  structure is all
357f0 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65  ocated..**.** Re
35800 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
35810 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  f everything is 
35820 73 75 63 63 65 73 73 66 75 6c 2e 20 4f 74 68 65  successful. Othe
35830 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 0a 2a  rwise, return .*
35840 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  * SQLITE_NOMEM i
35850 66 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f  f the attempt to
35860 20 61 6c 6c 6f 63 61 74 65 20 50 61 67 65 72 2e   allocate Pager.
35870 70 49 6e 4a 6f 75 72 6e 61 6c 20 66 61 69 6c 73  pInJournal fails
35880 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f 20 65  , or .** an IO e
35890 72 72 6f 72 20 63 6f 64 65 20 69 66 20 6f 70 65  rror code if ope
358a0 6e 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ning or writing 
358b0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
358c0 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
358d0 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e  c int pager_open
358e0 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  _journal(Pager *
358f0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
35900 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
35910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35920 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
35930 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  code */.  sqlite
35940 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56  3_vfs * const pV
35950 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
35960 73 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61  s;   /* Local ca
35970 63 68 65 20 6f 66 20 76 66 73 20 70 6f 69 6e 74  che of vfs point
35980 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  er */..  assert(
35990 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
359a0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
359b0 43 4b 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74  CKED );.  assert
359c0 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
359d0 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
359e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
359f0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->pInJournal==0 
35a00 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 6c  );.  .  /* If al
35a10 72 65 61 64 79 20 69 6e 20 74 68 65 20 65 72 72  ready in the err
35a20 6f 72 20 73 74 61 74 65 2c 20 74 68 69 73 20 66  or state, this f
35a30 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
35a40 6f 70 2e 20 20 42 75 74 20 6f 6e 0a 20 20 2a 2a  op.  But on.  **
35a50 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
35a60 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
35a70 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69 66   never called if
35a80 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20   we are already 
35a90 69 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72  in.  ** an error
35aa0 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69 66 28   state. */.  if(
35ab0 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65   NEVER(pPager->e
35ac0 72 72 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e  rrCode) ) return
35ad0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
35ae0 3b 0a 0a 20 20 69 66 28 20 21 70 61 67 65 72 55  ;..  if( !pagerU
35af0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 26 26  seWal(pPager) &&
35b00 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
35b10 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
35b20 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20  NALMODE_OFF ){. 
35b30 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f     pPager->pInJo
35b40 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42  urnal = sqlite3B
35b50 69 74 76 65 63 43 72 65 61 74 65 28 70 50 61 67  itvecCreate(pPag
35b60 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20  er->dbSize);.   
35b70 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e   if( pPager->pIn
35b80 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20  Journal==0 ){.  
35b90 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
35ba0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
35bb0 20 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68   .    /* Open th
35bc0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
35bd0 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
35be0 61 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20 20  ady open. */.   
35bf0 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61   if( !isOpen(pPa
35c00 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
35c10 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
35c20 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
35c30 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
35c40 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20  MORY ){.        
35c50 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61  sqlite3MemJourna
35c60 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  lOpen(pPager->jf
35c70 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  d);.      }else{
35c80 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69  .        const i
35c90 6e 74 20 66 6c 61 67 73 20 3d 20 20 20 20 20 20  nt flags =      
35ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35cb0 56 46 53 20 66 6c 61 67 73 20 74 6f 20 6f 70 65  VFS flags to ope
35cc0 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  n journal file *
35cd0 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  /.#if SQLITE_ENA
35ce0 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45 43 54  BLE_DATA_PROTECT
35cf0 49 4f 4e 0a 20 20 20 20 20 20 20 20 20 20 28 70  ION.          (p
35d00 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 26  Pager->vfsFlags&
35d10 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 49 4c 45  SQLITE_OPEN_FILE
35d20 50 52 4f 54 45 43 54 49 4f 4e 5f 4d 41 53 4b 29  PROTECTION_MASK)
35d30 7c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  |.#endif.       
35d40 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
35d50 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
35d60 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20  OPEN_CREATE|.   
35d70 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
35d80 74 65 6d 70 46 69 6c 65 20 3f 20 0a 20 20 20 20  tempFile ? .    
35d90 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f          (SQLITE_
35da0 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
35db0 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  SE|SQLITE_OPEN_T
35dc0 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3a 0a 20 20  EMP_JOURNAL):.  
35dd0 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54            (SQLIT
35de0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
35df0 4e 41 4c 29 0a 20 20 20 20 20 20 20 20 20 20 29  NAL).          )
35e00 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 65  ;..        /* Ve
35e10 72 69 66 79 20 74 68 61 74 20 74 68 65 20 64 61  rify that the da
35e20 74 61 62 61 73 65 20 73 74 69 6c 6c 20 68 61 73  tabase still has
35e30 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61   the same name a
35e40 73 20 69 74 20 64 69 64 20 77 68 65 6e 0a 20 20  s it did when.  
35e50 20 20 20 20 20 20 2a 2a 20 69 74 20 77 61 73 20        ** it was 
35e60 6f 72 69 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65  originally opene
35e70 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63  d. */.        rc
35e80 20 3d 20 64 61 74 61 62 61 73 65 49 73 55 6e 6d   = databaseIsUnm
35e90 6f 76 65 64 28 70 50 61 67 65 72 29 3b 0a 20 20  oved(pPager);.  
35ea0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
35eb0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66 64 65  LITE_OK ){.#ifde
35ec0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
35ed0 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20  ATOMIC_WRITE.   
35ee0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
35ef0 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a  te3JournalOpen(.
35f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56                pV
35f10 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
35f20 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
35f30 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c 42 75  d, flags, jrnlBu
35f40 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29  fferSize(pPager)
35f50 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 23 65  .          );.#e
35f60 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 72 63  lse.          rc
35f70 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
35f80 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
35f90 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
35fa0 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b  >jfd, flags, 0);
35fb0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
35fc0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
35fd0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
35fe0 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28  TE_OK || isOpen(
35ff0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
36000 20 20 20 20 7d 0a 20 20 0a 20 20 0a 20 20 20 20      }.  .  .    
36010 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 72  /* Write the fir
36020 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
36030 72 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r to the journal
36040 20 66 69 6c 65 20 61 6e 64 20 6f 70 65 6e 20 0a   file and open .
36050 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a      ** the sub-j
36060 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73  ournal if necess
36070 61 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ary..    */.    
36080 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
36090 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 4f  K ){.      /* TO
360a0 44 4f 3a 20 43 68 65 63 6b 20 69 66 20 61 6c 6c  DO: Check if all
360b0 20 6f 66 20 74 68 65 73 65 20 61 72 65 20 72 65   of these are re
360c0 61 6c 6c 79 20 72 65 71 75 69 72 65 64 2e 20 2a  ally required. *
360d0 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  /.      pPager->
360e0 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  nRec = 0;.      
360f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
36100 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ff = 0;.      pP
36110 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
36120 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
36130 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
36140 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72  0;.      rc = wr
36150 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  iteJournalHdr(pP
36160 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ager);.    }.  }
36170 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ..  if( rc!=SQLI
36180 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
36190 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
361a0 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  y(pPager->pInJou
361b0 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65  rnal);.    pPage
361c0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
361d0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
361e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
361f0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
36200 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20  ITER_LOCKED );. 
36210 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
36220 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52  e = PAGER_WRITER
36230 5f 43 41 43 48 45 4d 4f 44 3b 0a 20 20 7d 0a 0a  _CACHEMOD;.  }..
36240 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
36250 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 77 72  /*.** Begin a wr
36260 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
36270 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
36280 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 49   pager object. I
36290 66 20 61 20 0a 2a 2a 20 77 72 69 74 65 2d 74 72  f a .** write-tr
362a0 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c  ansaction has al
362b0 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65  ready been opene
362c0 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
362d0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
362e0 2a 2a 20 49 66 20 74 68 65 20 65 78 46 6c 61 67  ** If the exFlag
362f0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66 61 6c   argument is fal
36300 73 65 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65  se, then acquire
36310 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53 45   at least a RESE
36320 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20  RVED.** lock on 
36330 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
36340 65 2e 20 49 66 20 65 78 46 6c 61 67 20 69 73 20  e. If exFlag is 
36350 74 72 75 65 2c 20 74 68 65 6e 20 61 63 71 75 69  true, then acqui
36360 72 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 61  re at least.** a
36370 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
36380 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
36390 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64   is already held
363a0 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a  , no locking .**
363b0 20 66 75 6e 63 74 69 6f 6e 73 20 6e 65 65 64 20   functions need 
363c0 62 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  be called..**.**
363d0 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65   If the subjInMe
363e0 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73  mory argument is
363f0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
36400 61 6e 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  any sub-journal 
36410 6f 70 65 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e  opened.** within
36420 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
36430 6e 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64  n will be opened
36440 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   as an in-memory
36450 20 66 69 6c 65 2e 20 54 68 69 73 0a 2a 2a 20 68   file. This.** h
36460 61 73 20 6e 6f 20 65 66 66 65 63 74 20 69 66 20  as no effect if 
36470 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
36480 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65  is already opene
36490 64 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20  d (as it may be 
364a0 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20  when.** running 
364b0 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
364c0 65 29 20 6f 72 20 69 66 20 74 68 65 20 74 72 61  e) or if the tra
364d0 6e 73 61 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  nsaction does no
364e0 74 20 72 65 71 75 69 72 65 20 61 0a 2a 2a 20 73  t require a.** s
364f0 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74  ub-journal. If t
36500 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20  he subjInMemory 
36510 61 72 67 75 6d 65 6e 74 20 69 73 20 7a 65 72 6f  argument is zero
36520 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71 75 69  , then any requi
36530 72 65 64 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e  red.** sub-journ
36540 61 6c 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  al is implemente
36550 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 66 20 70  d in-memory if p
36560 50 61 67 65 72 20 69 73 20 61 6e 20 69 6e 2d 6d  Pager is an in-m
36570 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20  emory database, 
36580 0a 2a 2a 20 6f 72 20 75 73 69 6e 67 20 61 20 74  .** or using a t
36590 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6f 74  emporary file ot
365a0 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20  herwise..*/.int 
365b0 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69  sqlite3PagerBegi
365c0 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  n(Pager *pPager,
365d0 20 69 6e 74 20 65 78 46 6c 61 67 2c 20 69 6e 74   int exFlag, int
365e0 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29 7b 0a   subjInMemory){.
365f0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
36600 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 50 61  E_OK;..  if( pPa
36610 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 20 72  ger->errCode ) r
36620 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
36630 72 43 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28  rCode;.  assert(
36640 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
36650 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 26 26  =PAGER_READER &&
36660 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3c   pPager->eState<
36670 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20  PAGER_ERROR );. 
36680 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d   pPager->subjInM
36690 65 6d 6f 72 79 20 3d 20 28 75 38 29 73 75 62 6a  emory = (u8)subj
366a0 49 6e 4d 65 6d 6f 72 79 3b 0a 0a 20 20 69 66 28  InMemory;..  if(
366b0 20 41 4c 57 41 59 53 28 70 50 61 67 65 72 2d 3e   ALWAYS(pPager->
366c0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
366d0 41 44 45 52 29 20 29 7b 0a 20 20 20 20 61 73 73  ADER) ){.    ass
366e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e  ert( pPager->pIn
366f0 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 0a 20  Journal==0 );.. 
36700 20 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57     if( pagerUseW
36710 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
36720 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61      /* If the pa
36730 67 65 72 20 69 73 20 63 6f 6e 66 69 67 75 72 65  ger is configure
36740 64 20 74 6f 20 75 73 65 20 6c 6f 63 6b 69 6e 67  d to use locking
36750 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 2c  _mode=exclusive,
36760 20 61 6e 64 20 61 6e 0a 20 20 20 20 20 20 2a 2a   and an.      **
36770 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
36780 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
36790 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 68  is not already h
367a0 65 6c 64 2c 20 6f 62 74 61 69 6e 20 69 74 20 6e  eld, obtain it n
367b0 6f 77 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ow..      */.   
367c0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
367d0 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20  xclusiveMode && 
367e0 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73  sqlite3WalExclus
367f0 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e  iveMode(pPager->
36800 70 57 61 6c 2c 20 2d 31 29 20 29 7b 0a 20 20 20  pWal, -1) ){.   
36810 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c       rc = pagerL
36820 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 45 58  ockDb(pPager, EX
36830 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
36840 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
36850 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
36860 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
36870 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
36880 20 20 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63     sqlite3WalExc
36890 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65  lusiveMode(pPage
368a0 72 2d 3e 70 57 61 6c 2c 20 31 29 3b 0a 20 20 20  r->pWal, 1);.   
368b0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47     }..      /* G
368c0 72 61 62 20 74 68 65 20 77 72 69 74 65 20 6c 6f  rab the write lo
368d0 63 6b 20 6f 6e 20 74 68 65 20 6c 6f 67 20 66 69  ck on the log fi
368e0 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  le. If successfu
368f0 6c 2c 20 75 70 67 72 61 64 65 20 74 6f 0a 20 20  l, upgrade to.  
36900 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 52 45 53      ** PAGER_RES
36910 45 52 56 45 44 20 73 74 61 74 65 2e 20 4f 74 68  ERVED state. Oth
36920 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61  erwise, return a
36930 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20  n error code to 
36940 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20  the caller..    
36950 20 20 2a 2a 20 54 68 65 20 62 75 73 79 2d 68 61    ** The busy-ha
36960 6e 64 6c 65 72 20 69 73 20 6e 6f 74 20 69 6e 76  ndler is not inv
36970 6f 6b 65 64 20 69 66 20 61 6e 6f 74 68 65 72 20  oked if another 
36980 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c 72 65 61  connection alrea
36990 64 79 0a 20 20 20 20 20 20 2a 2a 20 68 6f 6c 64  dy.      ** hold
369a0 73 20 74 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b  s the write-lock
369b0 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 74  . If possible, t
369c0 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 77  he upper layer w
369d0 69 6c 6c 20 63 61 6c 6c 20 69 74 2e 0a 20 20 20  ill call it..   
369e0 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
369f0 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e   sqlite3WalBegin
36a00 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e  WriteTransaction
36a10 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a  (pPager->pWal);.
36a20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
36a30 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20 52 45 53   /* Obtain a RES
36a40 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  ERVED lock on th
36a50 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
36a60 20 49 66 20 74 68 65 20 65 78 46 6c 61 67 20 70   If the exFlag p
36a70 61 72 61 6d 65 74 65 72 0a 20 20 20 20 20 20 2a  arameter.      *
36a80 2a 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  * is true, then 
36a90 69 6d 6d 65 64 69 61 74 65 6c 79 20 75 70 67 72  immediately upgr
36aa0 61 64 65 20 74 68 69 73 20 74 6f 20 61 6e 20 45  ade this to an E
36ab0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54  XCLUSIVE lock. T
36ac0 68 65 0a 20 20 20 20 20 20 2a 2a 20 62 75 73 79  he.      ** busy
36ad0 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63  -handler callbac
36ae0 6b 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 68  k can be used wh
36af0 65 6e 20 75 70 67 72 61 64 69 6e 67 20 74 6f 20  en upgrading to 
36b00 74 68 65 20 45 58 43 4c 55 53 49 56 45 0a 20 20  the EXCLUSIVE.  
36b10 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20 62 75 74      ** lock, but
36b20 20 6e 6f 74 20 77 68 65 6e 20 6f 62 74 61 69 6e   not when obtain
36b30 69 6e 67 20 74 68 65 20 52 45 53 45 52 56 45 44  ing the RESERVED
36b40 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a   lock..      */.
36b50 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
36b60 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 52  LockDb(pPager, R
36b70 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20  ESERVED_LOCK);. 
36b80 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
36b90 49 54 45 5f 4f 4b 20 26 26 20 65 78 46 6c 61 67  ITE_OK && exFlag
36ba0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
36bb0 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
36bc0 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c  ock(pPager, EXCL
36bd0 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
36be0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
36bf0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
36c00 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 68  K ){.      /* Ch
36c10 61 6e 67 65 20 74 6f 20 57 52 49 54 45 52 5f 4c  ange to WRITER_L
36c20 4f 43 4b 45 44 20 73 74 61 74 65 2e 0a 20 20 20  OCKED state..   
36c30 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 57     **.      ** W
36c40 41 4c 20 6d 6f 64 65 20 73 65 74 73 20 50 61 67  AL mode sets Pag
36c50 65 72 2e 65 53 74 61 74 65 20 74 6f 20 50 41 47  er.eState to PAG
36c60 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
36c70 20 6f 72 20 43 41 43 48 45 4d 4f 44 0a 20 20 20   or CACHEMOD.   
36c80 20 20 20 2a 2a 20 77 68 65 6e 20 69 74 20 68 61     ** when it ha
36c90 73 20 61 6e 20 6f 70 65 6e 20 74 72 61 6e 73 61  s an open transa
36ca0 63 74 69 6f 6e 2c 20 62 75 74 20 6e 65 76 65 72  ction, but never
36cb0 20 74 6f 20 44 42 4d 4f 44 20 6f 72 20 46 49 4e   to DBMOD or FIN
36cc0 49 53 48 45 44 2e 0a 20 20 20 20 20 20 2a 2a 20  ISHED..      ** 
36cd0 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
36ce0 69 6e 20 74 68 6f 73 65 20 73 74 61 74 65 73 20  in those states 
36cf0 74 68 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c  the code to roll
36d00 20 62 61 63 6b 20 73 61 76 65 70 6f 69 6e 74 20   back savepoint 
36d10 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  .      ** transa
36d20 63 74 69 6f 6e 73 20 6d 61 79 20 63 6f 70 79 20  ctions may copy 
36d30 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 73 75  data from the su
36d40 62 2d 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74  b-journal into t
36d50 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20  he database .   
36d60 20 20 20 2a 2a 20 66 69 6c 65 20 61 73 20 77 65     ** file as we
36d70 6c 6c 20 61 73 20 69 6e 74 6f 20 74 68 65 20 70  ll as into the p
36d80 61 67 65 20 63 61 63 68 65 2e 20 57 68 69 63 68  age cache. Which
36d90 20 77 6f 75 6c 64 20 62 65 20 69 6e 63 6f 72 72   would be incorr
36da0 65 63 74 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a  ect in .      **
36db0 20 57 41 4c 20 6d 6f 64 65 2e 0a 20 20 20 20 20   WAL mode..     
36dc0 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72   */.      pPager
36dd0 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
36de0 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3b 0a  _WRITER_LOCKED;.
36df0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
36e00 48 69 6e 74 53 69 7a 65 20 3d 20 70 50 61 67 65  HintSize = pPage
36e10 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20  r->dbSize;.     
36e20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53   pPager->dbFileS
36e30 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
36e40 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67  Size;.      pPag
36e50 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d  er->dbOrigSize =
36e60 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
36e70 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
36e80 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
36e90 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
36ea0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
36eb0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
36ec0 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
36ed0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
36ee0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
36ef0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
36f00 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
36f10 4b 45 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72  KED );.    asser
36f20 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
36f30 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
36f40 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41  .  }..  PAGERTRA
36f50 43 45 28 28 22 54 52 41 4e 53 41 43 54 49 4f 4e  CE(("TRANSACTION
36f60 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
36f70 70 50 61 67 65 72 29 29 29 3b 0a 20 20 72 65 74  pPager)));.  ret
36f80 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
36f90 20 4d 61 72 6b 20 61 20 73 69 6e 67 6c 65 20 64   Mark a single d
36fa0 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74  ata page as writ
36fb0 65 61 62 6c 65 2e 20 54 68 65 20 70 61 67 65 20  eable. The page 
36fc0 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
36fd0 74 68 65 20 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75  the .** main jou
36fe0 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72  rnal or sub-jour
36ff0 6e 61 6c 20 61 73 20 72 65 71 75 69 72 65 64 2e  nal as required.
37000 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
37010 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20  written into.** 
37020 6f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  one of the journ
37030 61 6c 73 2c 20 74 68 65 20 63 6f 72 72 65 73 70  als, the corresp
37040 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73 65  onding bit is se
37050 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20 50 61 67  t in the .** Pag
37060 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69  er.pInJournal bi
37070 74 76 65 63 20 61 6e 64 20 74 68 65 20 50 61 67  tvec and the Pag
37080 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
37090 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73  avepoint bitvecs
370a0 0a 2a 2a 20 6f 66 20 61 6e 79 20 6f 70 65 6e 20  .** of any open 
370b0 73 61 76 65 70 6f 69 6e 74 73 20 61 73 20 61 70  savepoints as ap
370c0 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74  propriate..*/.st
370d0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
370e0 72 69 74 65 28 50 67 48 64 72 20 2a 70 50 67 29  rite(PgHdr *pPg)
370f0 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
37100 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
37110 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
37120 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 6e 4a  TE_OK;.  int inJ
37130 6f 75 72 6e 61 6c 3b 0a 0a 20 20 2f 2a 20 54 68  ournal;..  /* Th
37140 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f  is routine is no
37150 74 20 63 61 6c 6c 65 64 20 75 6e 6c 65 73 73 20  t called unless 
37160 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
37170 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
37180 0a 20 20 2a 2a 20 62 65 65 6e 20 73 74 61 72 74  .  ** been start
37190 65 64 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  ed. The journal 
371a0 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61 79 20  file may or may 
371b0 6e 6f 74 20 62 65 20 6f 70 65 6e 20 61 74 20 74  not be open at t
371c0 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20  his point..  ** 
371d0 49 74 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  It is never call
371e0 65 64 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20  ed in the ERROR 
371f0 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  state..  */.  as
37200 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
37210 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
37220 45 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20  ER_LOCKED.      
37230 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
37240 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
37250 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20  _CACHEMOD.      
37260 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
37270 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
37280 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73  _DBMOD.  );.  as
37290 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
372a0 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
372b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
372c0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 30  ager->errCode==0
372d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
372e0 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d  ager->readOnly==
372f0 30 20 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41  0 );..  CHECK_PA
37300 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 54  GE(pPg);..  /* T
37310 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
37320 6e 65 65 64 73 20 74 6f 20 62 65 20 6f 70 65 6e  needs to be open
37330 65 64 2e 20 48 69 67 68 65 72 20 6c 65 76 65 6c  ed. Higher level
37340 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20 61   routines have a
37350 6c 72 65 61 64 79 0a 20 20 2a 2a 20 6f 62 74 61  lready.  ** obta
37360 69 6e 65 64 20 74 68 65 20 6e 65 63 65 73 73 61  ined the necessa
37370 72 79 20 6c 6f 63 6b 73 20 74 6f 20 62 65 67 69  ry locks to begi
37380 6e 20 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e  n the write-tran
37390 73 61 63 74 69 6f 6e 2c 20 62 75 74 20 74 68 65  saction, but the
373a0 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a  .  ** rollback j
373b0 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74  ournal might not
373c0 20 79 65 74 20 62 65 20 6f 70 65 6e 2e 20 4f 70   yet be open. Op
373d0 65 6e 20 69 74 20 6e 6f 77 20 69 66 20 74 68 69  en it now if thi
373e0 73 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20  s is the case.. 
373f0 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69 73   **.  ** This is
37400 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 63 61 6c   done before cal
37410 6c 69 6e 67 20 73 71 6c 69 74 65 33 50 63 61 63  ling sqlite3Pcac
37420 68 65 4d 61 6b 65 44 69 72 74 79 28 29 20 6f 6e  heMakeDirty() on
37430 20 74 68 65 20 70 61 67 65 2e 20 0a 20 20 2a 2a   the page. .  **
37440 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 69   Otherwise, if i
37450 74 20 77 65 72 65 20 64 6f 6e 65 20 61 66 74 65  t were done afte
37460 72 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  r calling sqlite
37470 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79  3PcacheMakeDirty
37480 28 29 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6e  (), then.  ** an
37490 20 65 72 72 6f 72 20 6d 69 67 68 74 20 6f 63 63   error might occ
374a0 75 72 20 61 6e 64 20 74 68 65 20 70 61 67 65 72  ur and the pager
374b0 20 77 6f 75 6c 64 20 65 6e 64 20 75 70 20 69 6e   would end up in
374c0 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73   WRITER_LOCKED s
374d0 74 61 74 65 0a 20 20 2a 2a 20 77 69 74 68 20 70  tate.  ** with p
374e0 61 67 65 73 20 6d 61 72 6b 65 64 20 61 73 20 64  ages marked as d
374f0 69 72 74 79 20 69 6e 20 74 68 65 20 63 61 63 68  irty in the cach
37500 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  e..  */.  if( pP
37510 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
37520 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
37530 44 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  D ){.    rc = pa
37540 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
37550 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
37560 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
37570 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
37580 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
37590 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
375a0 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
375b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
375c0 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
375d0 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 2f  (pPager) );..  /
375e0 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20  * Mark the page 
375f0 61 73 20 64 69 72 74 79 2e 20 20 49 66 20 74 68  as dirty.  If th
37600 65 20 70 61 67 65 20 68 61 73 20 61 6c 72 65 61  e page has alrea
37610 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 0a  dy been written.
37620 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72    ** to the jour
37630 6e 61 6c 20 74 68 65 6e 20 77 65 20 63 61 6e 20  nal then we can 
37640 72 65 74 75 72 6e 20 72 69 67 68 74 20 61 77 61  return right awa
37650 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  y..  */.  sqlite
37660 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79  3PcacheMakeDirty
37670 28 70 50 67 29 3b 0a 20 20 69 6e 4a 6f 75 72 6e  (pPg);.  inJourn
37680 61 6c 20 3d 20 70 61 67 65 49 6e 4a 6f 75 72 6e  al = pageInJourn
37690 61 6c 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b  al(pPager, pPg);
376a0 0a 20 20 69 66 28 20 69 6e 4a 6f 75 72 6e 61 6c  .  if( inJournal
376b0 20 26 26 20 28 70 50 61 67 65 72 2d 3e 6e 53 61   && (pPager->nSa
376c0 76 65 70 6f 69 6e 74 3d 3d 30 20 7c 7c 20 21 73  vepoint==0 || !s
376d0 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
376e0 70 50 67 29 29 20 29 7b 0a 20 20 20 20 61 73 73  pPg)) ){.    ass
376f0 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
37700 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 7d  l(pPager) );.  }
37710 65 6c 73 65 7b 0a 20 20 0a 20 20 20 20 2f 2a 20  else{.  .    /* 
37720 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  The transaction 
37730 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73  journal now exis
37740 74 73 20 61 6e 64 20 77 65 20 68 61 76 65 20 61  ts and we have a
37750 20 52 45 53 45 52 56 45 44 20 6f 72 20 61 6e 0a   RESERVED or an.
37760 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45      ** EXCLUSIVE
37770 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69   lock on the mai
37780 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
37790 20 20 57 72 69 74 65 20 74 68 65 20 63 75 72 72    Write the curr
377a0 65 6e 74 20 70 61 67 65 20 74 6f 0a 20 20 20 20  ent page to.    
377b0 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ** the transacti
377c0 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74  on journal if it
377d0 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c   is not there al
377e0 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ready..    */.  
377f0 20 20 69 66 28 20 21 69 6e 4a 6f 75 72 6e 61 6c    if( !inJournal
37800 20 26 26 20 21 70 61 67 65 72 55 73 65 57 61 6c   && !pagerUseWal
37810 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
37820 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55    assert( pagerU
37830 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30  seWal(pPager)==0
37840 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50   );.      if( pP
37850 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  g->pgno<=pPager-
37860 3e 64 62 4f 72 69 67 53 69 7a 65 20 26 26 20 69  >dbOrigSize && i
37870 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
37880 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 75 33  d) ){.        u3
37890 32 20 63 6b 73 75 6d 3b 0a 20 20 20 20 20 20 20  2 cksum;.       
378a0 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 20   char *pData2;. 
378b0 20 20 20 20 20 20 20 69 36 34 20 69 4f 66 66 20         i64 iOff 
378c0 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
378d0 6c 4f 66 66 3b 0a 0a 20 20 20 20 20 20 20 20 2f  lOff;..        /
378e0 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65  * We should neve
378f0 72 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a  r write to the j
37900 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20  ournal file the 
37910 70 61 67 65 20 74 68 61 74 0a 20 20 20 20 20 20  page that.      
37920 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68    ** contains th
37930 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73  e database locks
37940 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
37950 20 61 73 73 65 72 74 20 76 65 72 69 66 69 65 73   assert verifies
37960 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74  .        ** that
37970 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20   we do not. */. 
37980 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
37990 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f  Pg->pgno!=PAGER_
379a0 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
379b0 29 3b 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65  );..        asse
379c0 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
379d0 6e 61 6c 48 64 72 3c 3d 70 50 61 67 65 72 2d 3e  nalHdr<=pPager->
379e0 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20  journalOff );.  
379f0 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61        CODEC2(pPa
37a00 67 65 72 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c  ger, pPg->pData,
37a10 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72   pPg->pgno, 7, r
37a20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
37a30 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20  EM, pData2);.   
37a40 20 20 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67       cksum = pag
37a50 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c  er_cksum(pPager,
37a60 20 28 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 0a   (u8*)pData2);..
37a70 20 20 20 20 20 20 20 20 2f 2a 20 45 76 65 6e 20          /* Even 
37a80 69 66 20 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b  if an IO or disk
37a90 66 75 6c 6c 20 65 72 72 6f 72 20 6f 63 63 75 72  full error occur
37aa0 73 20 77 68 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c  s while journall
37ab0 69 6e 67 20 74 68 65 0a 20 20 20 20 20 20 20 20  ing the.        
37ac0 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 62  ** page in the b
37ad0 6c 6f 63 6b 20 61 62 6f 76 65 2c 20 73 65 74 20  lock above, set 
37ae0 74 68 65 20 6e 65 65 64 2d 73 79 6e 63 20 66 6c  the need-sync fl
37af0 61 67 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e  ag for the page.
37b00 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 74 68 65  .        ** Othe
37b10 72 77 69 73 65 2c 20 77 68 65 6e 20 74 68 65 20  rwise, when the 
37b20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
37b30 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20  olled back, the 
37b40 6c 6f 67 69 63 20 69 6e 0a 20 20 20 20 20 20 20  logic in.       
37b50 20 2a 2a 20 70 6c 61 79 62 61 63 6b 5f 6f 6e 65   ** playback_one
37b60 5f 70 61 67 65 28 29 20 77 69 6c 6c 20 74 68 69  _page() will thi
37b70 6e 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 65  nk that the page
37b80 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 73   needs to be res
37b90 74 6f 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a  tored.        **
37ba0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
37bb0 20 66 69 6c 65 2e 20 41 6e 64 20 69 66 20 61 6e   file. And if an
37bc0 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
37bd0 20 77 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c   while doing so,
37be0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
37bf0 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20   corruption may 
37c00 66 6f 6c 6c 6f 77 2e 0a 20 20 20 20 20 20 20 20  follow..        
37c10 2a 2f 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e  */.        pPg->
37c20 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e  flags |= PGHDR_N
37c30 45 45 44 5f 53 59 4e 43 3b 0a 0a 20 20 20 20 20  EED_SYNC;..     
37c40 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
37c50 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
37c60 20 69 4f 66 66 2c 20 70 50 67 2d 3e 70 67 6e 6f   iOff, pPg->pgno
37c70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
37c80 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
37c90 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
37ca0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
37cb0 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
37cc0 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65  d, pData2, pPage
37cd0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 69 4f 66  r->pageSize, iOf
37ce0 66 2b 34 29 3b 0a 20 20 20 20 20 20 20 20 69 66  f+4);.        if
37cf0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
37d00 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
37d10 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33       rc = write3
37d20 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
37d30 64 2c 20 69 4f 66 66 2b 70 50 61 67 65 72 2d 3e  d, iOff+pPager->
37d40 70 61 67 65 53 69 7a 65 2b 34 2c 20 63 6b 73 75  pageSize+4, cksu
37d50 6d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  m);.        if( 
37d60 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
37d70 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20  return rc;..    
37d80 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 4f      IOTRACE(("JO
37d90 55 54 20 25 70 20 25 64 20 25 6c 6c 64 20 25 64  UT %p %d %lld %d
37da0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67  \n", pPager, pPg
37db0 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20  ->pgno, .       
37dc0 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
37dd0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50  ->journalOff, pP
37de0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 29  ager->pageSize))
37df0 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 5f  ;.        PAGER_
37e00 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67  INCR(sqlite3_pag
37e10 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 29  er_writej_count)
37e20 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54  ;.        PAGERT
37e30 52 41 43 45 28 28 22 4a 4f 55 52 4e 41 4c 20 25  RACE(("JOURNAL %
37e40 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79  d page %d needSy
37e50 6e 63 3d 25 64 20 68 61 73 68 28 25 30 38 78 29  nc=%d hash(%08x)
37e60 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
37e70 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
37e80 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20  ), pPg->pgno, . 
37e90 20 20 20 20 20 20 20 20 20 20 20 20 28 28 70 50              ((pP
37ea0 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
37eb0 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 2c 20  EED_SYNC)?1:0), 
37ec0 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
37ed0 50 67 29 29 29 3b 0a 0a 20 20 20 20 20 20 20 20  Pg)));..        
37ee0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
37ef0 66 66 20 2b 3d 20 38 20 2b 20 70 50 61 67 65 72  ff += 8 + pPager
37f00 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
37f10 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
37f20 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ++;.        asse
37f30 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  rt( pPager->pInJ
37f40 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20  ournal!=0 );.   
37f50 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
37f60 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65  3BitvecSet(pPage
37f70 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
37f80 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
37f90 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d     testcase( rc=
37fa0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
37fb0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
37fc0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
37fd0 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  | rc==SQLITE_NOM
37fe0 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  EM );.        rc
37ff0 20 7c 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69   |= addToSavepoi
38000 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72  ntBitvecs(pPager
38010 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
38020 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
38030 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
38040 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
38050 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
38060 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
38070 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
38080 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
38090 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
380a0 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 57  >eState!=PAGER_W
380b0 52 49 54 45 52 5f 44 42 4d 4f 44 20 29 7b 0a 20  RITER_DBMOD ){. 
380c0 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c           pPg->fl
380d0 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45  ags |= PGHDR_NEE
380e0 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20  D_SYNC;.        
380f0 7d 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54  }.        PAGERT
38100 52 41 43 45 28 28 22 41 50 50 45 4e 44 20 25 64  RACE(("APPEND %d
38110 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e   page %d needSyn
38120 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%d\n",.       
38130 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
38140 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
38150 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  gno,.           
38160 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73      ((pPg->flags
38170 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
38180 29 3f 31 3a 30 29 29 29 3b 0a 20 20 20 20 20 20  )?1:0)));.      
38190 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
381a0 2a 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65  * If the stateme
381b0 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70  nt journal is op
381c0 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  en and the page 
381d0 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20  is not in it,.  
381e0 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20    ** then write 
381f0 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
38200 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e   to the statemen
38210 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65  t journal.  Note
38220 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65   that.    ** the
38230 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
38240 61 6c 20 66 6f 72 6d 61 74 20 64 69 66 66 65 72  al format differ
38250 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64  s from the stand
38260 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ard journal form
38270 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 61  at.    ** in tha
38280 74 20 69 74 20 6f 6d 69 74 73 20 74 68 65 20 63  t it omits the c
38290 68 65 63 6b 73 75 6d 73 20 61 6e 64 20 74 68 65  hecksums and the
382a0 20 68 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a   header..    */.
382b0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
382c0 6e 53 61 76 65 70 6f 69 6e 74 3e 30 20 26 26 20  nSavepoint>0 && 
382d0 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
382e0 28 70 50 67 29 20 29 7b 0a 20 20 20 20 20 20 72  (pPg) ){.      r
382f0 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61  c = subjournalPa
38300 67 65 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  ge(pPg);.    }. 
38310 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20   }..  /* Update 
38320 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
38330 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20  e and return..  
38340 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
38350 3e 64 62 53 69 7a 65 3c 70 50 67 2d 3e 70 67 6e  >dbSize<pPg->pgn
38360 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  o ){.    pPager-
38370 3e 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70  >dbSize = pPg->p
38380 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  gno;.  }.  retur
38390 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
383a0 68 69 73 20 69 73 20 61 20 76 61 72 69 61 6e 74  his is a variant
383b0 20 6f 66 20 73 71 6c 69 74 65 33 50 61 67 65 72   of sqlite3Pager
383c0 57 72 69 74 65 28 29 20 74 68 61 74 20 72 75 6e  Write() that run
383d0 73 20 77 68 65 6e 20 74 68 65 20 73 65 63 74 6f  s when the secto
383e0 72 20 73 69 7a 65 0a 2a 2a 20 69 73 20 6c 61 72  r size.** is lar
383f0 67 65 72 20 74 68 61 6e 20 74 68 65 20 70 61 67  ger than the pag
38400 65 20 73 69 7a 65 2e 20 20 53 51 4c 69 74 65 20  e size.  SQLite 
38410 6d 61 6b 65 73 20 74 68 65 20 28 72 65 61 73 6f  makes the (reaso
38420 6e 61 62 6c 65 29 20 61 73 73 75 6d 70 74 69 6f  nable) assumptio
38430 6e 20 74 68 61 74 0a 2a 2a 20 61 6c 6c 20 62 79  n that.** all by
38440 74 65 73 20 6f 66 20 61 20 73 65 63 74 6f 72 20  tes of a sector 
38450 61 72 65 20 77 72 69 74 74 65 6e 20 74 6f 67 65  are written toge
38460 74 68 65 72 20 62 79 20 68 61 72 64 77 61 72 65  ther by hardware
38470 2e 20 20 48 65 6e 63 65 2c 20 61 6c 6c 20 62 79  .  Hence, all by
38480 74 65 73 20 6f 66 0a 2a 2a 20 61 20 73 65 63 74  tes of.** a sect
38490 6f 72 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f  or need to be jo
384a0 75 72 6e 61 6c 6c 65 64 20 69 6e 20 63 61 73 65  urnalled in case
384b0 20 6f 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73   of a power loss
384c0 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
384d0 66 0a 2a 2a 20 61 20 77 72 69 74 65 2e 0a 2a 2a  f.** a write..**
384e0 0a 2a 2a 20 55 73 75 61 6c 6c 79 2c 20 74 68 65  .** Usually, the
384f0 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20   sector size is 
38500 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
38510 61 6c 20 74 6f 20 74 68 65 20 70 61 67 65 20 73  al to the page s
38520 69 7a 65 2c 20 69 6e 20 77 68 69 63 68 0a 2a 2a  ize, in which.**
38530 20 63 61 73 65 20 70 61 67 65 73 20 63 61 6e 20   case pages can 
38540 62 65 20 69 6e 64 69 76 69 64 75 61 6c 6c 79 20  be individually 
38550 77 72 69 74 74 65 6e 2e 20 20 54 68 69 73 20 72  written.  This r
38560 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 72 75 6e 73  outine only runs
38570 20 69 6e 20 74 68 65 20 65 78 63 65 70 74 69 6f   in the exceptio
38580 6e 61 6c 0a 2a 2a 20 63 61 73 65 20 77 68 65 72  nal.** case wher
38590 65 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  e the page size 
385a0 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
385b0 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 2e  the sector size.
385c0 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
385d0 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 70  E_NOINLINE int p
385e0 61 67 65 72 57 72 69 74 65 4c 61 72 67 65 53 65  agerWriteLargeSe
385f0 63 74 6f 72 28 50 67 48 64 72 20 2a 70 50 67 29  ctor(PgHdr *pPg)
38600 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
38610 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
38620 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
38630 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 61 67  e */.  Pgno nPag
38640 65 43 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20  eCount;         
38650 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e        /* Total n
38660 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
38670 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
38680 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 31 3b 20 20  */.  Pgno pg1;  
38690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
386a0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67      /* First pag
386b0 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20  e of the sector 
386c0 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f  pPg is located o
386d0 6e 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67  n. */.  int nPag
386e0 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
386f0 20 20 20 20 20