/ Hex Artifact Content
Login

Artifact 93757b9cc236e24c965468f33fc5d7d0895a72623393fb1c68674974fa407b32:


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 53 51 4c 49  PAGERID(p) (SQLI
15a0: 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 2d  TE_PTR_TO_INT(p-
15b0: 3e 66 64 29 29 0a 23 64 65 66 69 6e 65 20 46 49  >fd)).#define FI
15c0: 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29 20 28  LEHANDLEID(fd) (
15d0: 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
15e0: 54 28 66 64 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  T(fd))../*.** Th
15f0: 65 20 50 61 67 65 72 2e 65 53 74 61 74 65 20 76  e Pager.eState v
1600: 61 72 69 61 62 6c 65 20 73 74 6f 72 65 73 20 74  ariable stores t
1610: 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61 74  he current 'stat
1620: 65 27 20 6f 66 20 61 20 70 61 67 65 72 2e 20 41  e' of a pager. A
1630: 0a 2a 2a 20 70 61 67 65 72 20 6d 61 79 20 62 65  .** pager may be
1640: 20 69 6e 20 61 6e 79 20 6f 6e 65 20 6f 66 20 74   in any one of t
1650: 68 65 20 73 65 76 65 6e 20 73 74 61 74 65 73 20  he seven states 
1660: 73 68 6f 77 6e 20 69 6e 20 74 68 65 20 66 6f 6c  shown in the fol
1670: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65 20  lowing.** state 
1680: 64 69 61 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 20  diagram..**.**  
1690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a0: 20 20 20 20 20 20 20 20 20 20 4f 50 45 4e 20 3c            OPEN <
16b0: 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d 2d 2d 2d 2b 0a 2a  ------+------+.*
16c0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
16e0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
16f0: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1710: 20 20 56 20 20 20 20 20 20 20 20 20 7c 20 20 20    V         |   
1720: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
1730: 20 20 20 20 20 20 2b 2d 2d 2d 2d 2d 2d 2d 2d 2d        +---------
1740: 3e 20 52 45 41 44 45 52 2d 2d 2d 2d 2d 2d 2d 2b  > READER-------+
1750: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
1760: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1770: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
1780: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
1790: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
17a0: 20 20 20 20 20 20 20 20 20 20 20 56 20 20 20 20             V    
17b0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
17c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
17d0: 3c 2d 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 4c  <-------WRITER_L
17e0: 4f 43 4b 45 44 2d 2d 2d 2d 2d 2d 3e 20 45 52 52  OCKED------> ERR
17f0: 4f 52 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  OR.**           
1800: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20      |           
1810: 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20     |            
1820: 20 20 20 20 5e 20 20 0a 2a 2a 20 20 20 20 20 20      ^  .**      
1830: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1840: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
1850: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
1860: 20 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d              |<--
1870: 2d 2d 2d 2d 57 52 49 54 45 52 5f 43 41 43 48 45  ----WRITER_CACHE
1880: 4d 4f 44 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a  MOD-------->|.**
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
18b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
18c0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
18d0: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
18e0: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
18f0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
1900: 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52       |<-------WR
1910: 49 54 45 52 5f 44 42 4d 4f 44 2d 2d 2d 2d 2d 2d  ITER_DBMOD------
1920: 2d 2d 2d 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20  ---->|.**       
1930: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
1940: 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20         |        
1950: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
1960: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
1970: 20 20 20 20 20 20 20 20 20 20 56 20 20 20 20 20            V     
1980: 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20             |.** 
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 3c                +<
19a0: 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 46 49 4e  ------WRITER_FIN
19b0: 49 53 48 45 44 2d 2d 2d 2d 2d 2d 2d 2d 3e 2b 0a  ISHED-------->+.
19c0: 2a 2a 0a 2a 2a 0a 2a 2a 20 4c 69 73 74 20 6f 66  **.**.** List of
19d0: 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f   state transitio
19e0: 6e 73 20 61 6e 64 20 74 68 65 20 43 20 5b 66 75  ns and the C [fu
19f0: 6e 63 74 69 6f 6e 5d 20 74 68 61 74 20 70 65 72  nction] that per
1a00: 66 6f 72 6d 73 20 65 61 63 68 3a 0a 2a 2a 20 0a  forms each:.** .
1a10: 2a 2a 20 20 20 4f 50 45 4e 20 20 20 20 20 20 20  **   OPEN       
1a20: 20 20 20 20 20 20 20 2d 3e 20 52 45 41 44 45 52         -> READER
1a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 73                [s
1a40: 71 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65  qlite3PagerShare
1a50: 64 4c 6f 63 6b 5d 0a 2a 2a 20 20 20 52 45 41 44  dLock].**   READ
1a60: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e  ER            ->
1a70: 20 4f 50 45 4e 20 20 20 20 20 20 20 20 20 20 20   OPEN           
1a80: 20 20 20 20 20 5b 70 61 67 65 72 5f 75 6e 6c 6f       [pager_unlo
1a90: 63 6b 5d 0a 2a 2a 0a 2a 2a 20 20 20 52 45 41 44  ck].**.**   READ
1aa0: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e  ER            ->
1ab0: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20   WRITER_LOCKED  
1ac0: 20 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67       [sqlite3Pag
1ad0: 65 72 42 65 67 69 6e 5d 0a 2a 2a 20 20 20 57 52  erBegin].**   WR
1ae0: 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20 20 20  ITER_LOCKED     
1af0: 2d 3e 20 57 52 49 54 45 52 5f 43 41 43 48 45 4d  -> WRITER_CACHEM
1b00: 4f 44 20 20 20 20 20 5b 70 61 67 65 72 5f 6f 70  OD     [pager_op
1b10: 65 6e 5f 6a 6f 75 72 6e 61 6c 5d 0a 2a 2a 20 20  en_journal].**  
1b20: 20 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44   WRITER_CACHEMOD
1b30: 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 44 42 4d     -> WRITER_DBM
1b40: 4f 44 20 20 20 20 20 20 20 20 5b 73 79 6e 63 4a  OD        [syncJ
1b50: 6f 75 72 6e 61 6c 5d 0a 2a 2a 20 20 20 57 52 49  ournal].**   WRI
1b60: 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 2d  TER_DBMOD      -
1b70: 3e 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45  > WRITER_FINISHE
1b80: 44 20 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61  D     [sqlite3Pa
1b90: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
1ba0: 65 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a  e].**   WRITER_*
1bb0: 2a 2a 20 20 20 20 20 20 20 20 2d 3e 20 52 45 41  **        -> REA
1bc0: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DER             
1bd0: 20 5b 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e   [pager_end_tran
1be0: 73 61 63 74 69 6f 6e 5d 0a 2a 2a 0a 2a 2a 20 20  saction].**.**  
1bf0: 20 57 52 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20   WRITER_***     
1c00: 20 20 20 2d 3e 20 45 52 52 4f 52 20 20 20 20 20     -> ERROR     
1c10: 20 20 20 20 20 20 20 20 20 20 5b 70 61 67 65 72            [pager
1c20: 5f 65 72 72 6f 72 5d 0a 2a 2a 20 20 20 45 52 52  _error].**   ERR
1c30: 4f 52 20 20 20 20 20 20 20 20 20 20 20 20 20 2d  OR             -
1c40: 3e 20 4f 50 45 4e 20 20 20 20 20 20 20 20 20 20  > OPEN          
1c50: 20 20 20 20 20 20 5b 70 61 67 65 72 5f 75 6e 6c        [pager_unl
1c60: 6f 63 6b 5d 0a 2a 2a 20 0a 2a 2a 0a 2a 2a 20 20  ock].** .**.**  
1c70: 4f 50 45 4e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 54  OPEN:.**.**    T
1c80: 68 65 20 70 61 67 65 72 20 73 74 61 72 74 73 20  he pager starts 
1c90: 75 70 20 69 6e 20 74 68 69 73 20 73 74 61 74 65  up in this state
1ca0: 2e 20 4e 6f 74 68 69 6e 67 20 69 73 20 67 75 61  . Nothing is gua
1cb0: 72 61 6e 74 65 65 64 20 69 6e 20 74 68 69 73 0a  ranteed in this.
1cc0: 2a 2a 20 20 20 20 73 74 61 74 65 20 2d 20 74 68  **    state - th
1cd0: 65 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61  e file may or ma
1ce0: 79 20 6e 6f 74 20 62 65 20 6c 6f 63 6b 65 64 20  y not be locked 
1cf0: 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
1d00: 20 73 69 7a 65 20 69 73 0a 2a 2a 20 20 20 20 75   size is.**    u
1d10: 6e 6b 6e 6f 77 6e 2e 20 54 68 65 20 64 61 74 61  nknown. The data
1d20: 62 61 73 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  base may not be 
1d30: 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e  read or written.
1d40: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 4e 6f 20 72  .**.**    * No r
1d50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
1d60: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
1d70: 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6e 79 20  ve..**    * Any 
1d80: 6c 6f 63 6b 2c 20 6f 72 20 6e 6f 20 6c 6f 63 6b  lock, or no lock
1d90: 20 61 74 20 61 6c 6c 2c 20 6d 61 79 20 62 65 20   at all, may be 
1da0: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1db0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
1dc0: 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20 64   * The dbSize, d
1dd0: 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62  bOrigSize and db
1de0: 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c  FileSize variabl
1df0: 65 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 72  es may not be tr
1e00: 75 73 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 52 45  usted..**.**  RE
1e10: 41 44 45 52 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 49  ADER:.**.**    I
1e20: 6e 20 74 68 69 73 20 73 74 61 74 65 20 61 6c 6c  n this state all
1e30: 20 74 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74   the requirement
1e40: 73 20 66 6f 72 20 72 65 61 64 69 6e 67 20 74 68  s for reading th
1e50: 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 0a 2a  e database in .*
1e60: 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20 28 6e  *    rollback (n
1e70: 6f 6e 2d 57 41 4c 29 20 6d 6f 64 65 20 61 72 65  on-WAL) mode are
1e80: 20 6d 65 74 2e 20 55 6e 6c 65 73 73 20 74 68 65   met. Unless the
1e90: 20 70 61 67 65 72 20 69 73 20 28 6f 72 20 72 65   pager is (or re
1ea0: 63 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 77 61 73  cently.**    was
1eb0: 29 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6c  ) in exclusive-l
1ec0: 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c 20 61 20 75  ocking mode, a u
1ed0: 73 65 72 2d 6c 65 76 65 6c 20 72 65 61 64 20 74  ser-level read t
1ee0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a  ransaction is .*
1ef0: 2a 20 20 20 20 6f 70 65 6e 2e 20 54 68 65 20 64  *    open. The d
1f00: 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 20  atabase size is 
1f10: 6b 6e 6f 77 6e 20 69 6e 20 74 68 69 73 20 73 74  known in this st
1f20: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  ate..**.**    A 
1f30: 63 6f 6e 6e 65 63 74 69 6f 6e 20 72 75 6e 6e 69  connection runni
1f40: 6e 67 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 5f  ng with locking_
1f50: 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 65 6e 74 65  mode=normal ente
1f60: 72 73 20 74 68 69 73 20 73 74 61 74 65 20 77 68  rs this state wh
1f70: 65 6e 0a 2a 2a 20 20 20 20 69 74 20 6f 70 65 6e  en.**    it open
1f80: 73 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  s a read-transac
1f90: 74 69 6f 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  tion on the data
1fa0: 62 61 73 65 20 61 6e 64 20 72 65 74 75 72 6e 73  base and returns
1fb0: 20 74 6f 20 73 74 61 74 65 0a 2a 2a 20 20 20 20   to state.**    
1fc0: 4f 50 45 4e 20 61 66 74 65 72 20 74 68 65 20 72  OPEN after the r
1fd0: 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead-transaction 
1fe0: 69 73 20 63 6f 6d 70 6c 65 74 65 64 2e 20 48 6f  is completed. Ho
1ff0: 77 65 76 65 72 20 61 20 63 6f 6e 6e 65 63 74 69  wever a connecti
2000: 6f 6e 0a 2a 2a 20 20 20 20 72 75 6e 6e 69 6e 67  on.**    running
2010: 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
2020: 3d 65 78 63 6c 75 73 69 76 65 20 28 69 6e 63 6c  =exclusive (incl
2030: 75 64 69 6e 67 20 74 65 6d 70 20 64 61 74 61 62  uding temp datab
2040: 61 73 65 73 29 20 72 65 6d 61 69 6e 73 20 69 6e  ases) remains in
2050: 0a 2a 2a 20 20 20 20 74 68 69 73 20 73 74 61 74  .**    this stat
2060: 65 20 65 76 65 6e 20 61 66 74 65 72 20 74 68 65  e even after the
2070: 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
2080: 6e 20 69 73 20 63 6c 6f 73 65 64 2e 20 54 68 65  n is closed. The
2090: 20 6f 6e 6c 79 20 77 61 79 0a 2a 2a 20 20 20 20   only way.**    
20a0: 61 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  a locking_mode=e
20b0: 78 63 6c 75 73 69 76 65 20 63 6f 6e 6e 65 63 74  xclusive connect
20c0: 69 6f 6e 20 63 61 6e 20 74 72 61 6e 73 69 74 69  ion can transiti
20d0: 6f 6e 20 66 72 6f 6d 20 52 45 41 44 45 52 20 74  on from READER t
20e0: 6f 20 4f 50 45 4e 0a 2a 2a 20 20 20 20 69 73 20  o OPEN.**    is 
20f0: 76 69 61 20 74 68 65 20 45 52 52 4f 52 20 73 74  via the ERROR st
2100: 61 74 65 20 28 73 65 65 20 62 65 6c 6f 77 29 2e  ate (see below).
2110: 0a 2a 2a 20 0a 2a 2a 20 20 20 20 2a 20 41 20 72  .** .**    * A r
2120: 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead transaction 
2130: 6d 61 79 20 62 65 20 61 63 74 69 76 65 20 28 62  may be active (b
2140: 75 74 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  ut a write-trans
2150: 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 29 2e 0a  action cannot)..
2160: 2a 2a 20 20 20 20 2a 20 41 20 53 48 41 52 45 44  **    * A SHARED
2170: 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
2180: 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   is held on the 
2190: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
21a0: 2a 20 20 20 20 2a 20 54 68 65 20 64 62 53 69 7a  *    * The dbSiz
21b0: 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 62  e variable may b
21c0: 65 20 74 72 75 73 74 65 64 20 28 65 76 65 6e 20  e trusted (even 
21d0: 69 66 20 61 20 75 73 65 72 2d 6c 65 76 65 6c 20  if a user-level 
21e0: 72 65 61 64 20 0a 2a 2a 20 20 20 20 20 20 74 72  read .**      tr
21f0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 6f 74  ansaction is not
2200: 20 61 63 74 69 76 65 29 2e 20 54 68 65 20 64 62   active). The db
2210: 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62 46  OrigSize and dbF
2220: 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65  ileSize variable
2230: 73 0a 2a 2a 20 20 20 20 20 20 6d 61 79 20 6e 6f  s.**      may no
2240: 74 20 62 65 20 74 72 75 73 74 65 64 20 61 74 20  t be trusted at 
2250: 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a 2a 20 20  this point..**  
2260: 20 20 2a 20 49 66 20 74 68 65 20 64 61 74 61 62    * If the datab
2270: 61 73 65 20 69 73 20 61 20 57 41 4c 20 64 61 74  ase is a WAL dat
2280: 61 62 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20  abase, then the 
2290: 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  WAL connection i
22a0: 73 20 6f 70 65 6e 2e 0a 2a 2a 20 20 20 20 2a 20  s open..**    * 
22b0: 45 76 65 6e 20 69 66 20 61 20 72 65 61 64 2d 74  Even if a read-t
22c0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 6f  ransaction is no
22d0: 74 20 6f 70 65 6e 2c 20 69 74 20 69 73 20 67 75  t open, it is gu
22e0: 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 0a 2a  aranteed that .*
22f0: 2a 20 20 20 20 20 20 74 68 65 72 65 20 69 73 20  *      there is 
2300: 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 69  no hot-journal i
2310: 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
2320: 6d 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52  m..**.**  WRITER
2330: 5f 4c 4f 43 4b 45 44 3a 0a 2a 2a 0a 2a 2a 20 20  _LOCKED:.**.**  
2340: 20 20 54 68 65 20 70 61 67 65 72 20 6d 6f 76 65    The pager move
2350: 73 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 20  s to this state 
2360: 66 72 6f 6d 20 52 45 41 44 45 52 20 77 68 65 6e  from READER when
2370: 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
2380: 74 69 6f 6e 0a 2a 2a 20 20 20 20 69 73 20 66 69  tion.**    is fi
2390: 72 73 74 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68  rst opened on th
23a0: 65 20 64 61 74 61 62 61 73 65 2e 20 49 6e 20 57  e database. In W
23b0: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61  RITER_LOCKED sta
23c0: 74 65 2c 20 61 6c 6c 20 6c 6f 63 6b 73 20 0a 2a  te, all locks .*
23d0: 2a 20 20 20 20 72 65 71 75 69 72 65 64 20 74 6f  *    required to
23e0: 20 73 74 61 72 74 20 61 20 77 72 69 74 65 2d 74   start a write-t
23f0: 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 68  ransaction are h
2400: 65 6c 64 2c 20 62 75 74 20 6e 6f 20 61 63 74 75  eld, but no actu
2410: 61 6c 20 0a 2a 2a 20 20 20 20 6d 6f 64 69 66 69  al .**    modifi
2420: 63 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 63  cations to the c
2430: 61 63 68 65 20 6f 72 20 64 61 74 61 62 61 73 65  ache or database
2440: 20 68 61 76 65 20 74 61 6b 65 6e 20 70 6c 61 63   have taken plac
2450: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49 6e 20 72  e..**.**    In r
2460: 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c 20 61 20  ollback mode, a 
2470: 52 45 53 45 52 56 45 44 20 6f 72 20 28 69 66 20  RESERVED or (if 
2480: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
2490: 77 61 73 20 6f 70 65 6e 65 64 20 77 69 74 68 20  was opened with 
24a0: 0a 2a 2a 20 20 20 20 42 45 47 49 4e 20 45 58 43  .**    BEGIN EXC
24b0: 4c 55 53 49 56 45 29 20 45 58 43 4c 55 53 49 56  LUSIVE) EXCLUSIV
24c0: 45 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  E lock is obtain
24d0: 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ed on the databa
24e0: 73 65 20 66 69 6c 65 20 77 68 65 6e 0a 2a 2a 20  se file when.** 
24f0: 20 20 20 6d 6f 76 69 6e 67 20 74 6f 20 74 68 69     moving to thi
2500: 73 20 73 74 61 74 65 2c 20 62 75 74 20 74 68 65  s state, but the
2510: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2520: 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20   not written to 
2530: 6f 72 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 20 20  or opened .**   
2540: 20 74 6f 20 69 6e 20 74 68 69 73 20 73 74 61 74   to in this stat
2550: 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73 61  e. If the transa
2560: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
2570: 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63  ed or rolled bac
2580: 6b 20 77 68 69 6c 65 20 0a 2a 2a 20 20 20 20 69  k while .**    i
2590: 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  n WRITER_LOCKED 
25a0: 73 74 61 74 65 2c 20 61 6c 6c 20 74 68 61 74 20  state, all that 
25b0: 69 73 20 72 65 71 75 69 72 65 64 20 69 73 20 74  is required is t
25c0: 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  o unlock the dat
25d0: 61 62 61 73 65 20 0a 2a 2a 20 20 20 20 66 69 6c  abase .**    fil
25e0: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49 4e 20 57  e..**.**    IN W
25f0: 41 4c 20 6d 6f 64 65 2c 20 57 61 6c 42 65 67 69  AL mode, WalBegi
2600: 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
2610: 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  n() is called to
2620: 20 6c 6f 63 6b 20 74 68 65 20 6c 6f 67 20 66 69   lock the log fi
2630: 6c 65 2e 0a 2a 2a 20 20 20 20 49 66 20 74 68 65  le..**    If the
2640: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 72   connection is r
2650: 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f 63 6b  unning with lock
2660: 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
2670: 76 65 2c 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a  ve, an attempt.*
2680: 2a 20 20 20 20 69 73 20 6d 61 64 65 20 74 6f 20  *    is made to 
2690: 6f 62 74 61 69 6e 20 61 6e 20 45 58 43 4c 55 53  obtain an EXCLUS
26a0: 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
26b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
26c0: 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72 69 74  *.**    * A writ
26d0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
26e0: 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a   active..**    *
26f0: 20 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   If the connecti
2700: 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20 72 6f  on is open in ro
2710: 6c 6c 62 61 63 6b 2d 6d 6f 64 65 2c 20 61 20 52  llback-mode, a R
2720: 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61 74  ESERVED or great
2730: 65 72 20 0a 2a 2a 20 20 20 20 20 20 6c 6f 63 6b  er .**      lock
2740: 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   is held on the 
2750: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
2760: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63 6f  *    * If the co
2770: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
2780: 20 69 6e 20 57 41 4c 2d 6d 6f 64 65 2c 20 61 20   in WAL-mode, a 
2790: 57 41 4c 20 77 72 69 74 65 20 74 72 61 6e 73 61  WAL write transa
27a0: 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 69 73  ction.**      is
27b0: 20 6f 70 65 6e 20 28 69 2e 65 2e 20 73 71 6c 69   open (i.e. sqli
27c0: 74 65 33 57 61 6c 42 65 67 69 6e 57 72 69 74 65  te3WalBeginWrite
27d0: 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 20 68 61  Transaction() ha
27e0: 73 20 62 65 65 6e 20 73 75 63 63 65 73 73 66 75  s been successfu
27f0: 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 63 61 6c 6c  lly.**      call
2800: 65 64 29 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  ed)..**    * The
2810: 20 64 62 53 69 7a 65 2c 20 64 62 4f 72 69 67 53   dbSize, dbOrigS
2820: 69 7a 65 20 61 6e 64 20 64 62 46 69 6c 65 53 69  ize and dbFileSi
2830: 7a 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  ze variables are
2840: 20 61 6c 6c 20 76 61 6c 69 64 2e 0a 2a 2a 20 20   all valid..**  
2850: 20 20 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73    * The contents
2860: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63 61   of the pager ca
2870: 63 68 65 20 68 61 76 65 20 6e 6f 74 20 62 65 65  che have not bee
2880: 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 20 20  n modified..**  
2890: 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20    * The journal 
28a0: 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61 79 20  file may or may 
28b0: 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20  not be open..** 
28c0: 20 20 20 2a 20 4e 6f 74 68 69 6e 67 20 28 6e 6f     * Nothing (no
28d0: 74 20 65 76 65 6e 20 74 68 65 20 66 69 72 73 74  t even the first
28e0: 20 68 65 61 64 65 72 29 20 68 61 73 20 62 65 65   header) has bee
28f0: 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
2900: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
2910: 20 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44   WRITER_CACHEMOD
2920: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20 70 61 67  :.**.**    A pag
2930: 65 72 20 6d 6f 76 65 73 20 66 72 6f 6d 20 57 52  er moves from WR
2940: 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74  ITER_LOCKED stat
2950: 65 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 20  e to this state 
2960: 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 0a 2a  when a page is.*
2970: 2a 20 20 20 20 66 69 72 73 74 20 6d 6f 64 69 66  *    first modif
2980: 69 65 64 20 62 79 20 74 68 65 20 75 70 70 65 72  ied by the upper
2990: 20 6c 61 79 65 72 2e 20 49 6e 20 72 6f 6c 6c 62   layer. In rollb
29a0: 61 63 6b 20 6d 6f 64 65 20 74 68 65 20 6a 6f 75  ack mode the jou
29b0: 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20  rnal file.**    
29c0: 69 73 20 6f 70 65 6e 65 64 20 28 69 66 20 69 74  is opened (if it
29d0: 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
29e0: 6f 70 65 6e 29 20 61 6e 64 20 61 20 68 65 61 64  open) and a head
29f0: 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  er written to th
2a00: 65 0a 2a 2a 20 20 20 20 73 74 61 72 74 20 6f 66  e.**    start of
2a10: 20 69 74 2e 20 54 68 65 20 64 61 74 61 62 61 73   it. The databas
2a20: 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 68  e file on disk h
2a30: 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69  as not been modi
2a40: 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  fied..**.**    *
2a50: 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   A write transac
2a60: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a  tion is active..
2a70: 2a 2a 20 20 20 20 2a 20 41 20 52 45 53 45 52 56  **    * A RESERV
2a80: 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ED or greater lo
2a90: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
2aa0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2ab0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75  .**    * The jou
2ac0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
2ad0: 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  n and the first 
2ae0: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
2af0: 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20  written .**     
2b00: 20 74 6f 20 69 74 2c 20 62 75 74 20 74 68 65 20   to it, but the 
2b10: 68 65 61 64 65 72 20 68 61 73 20 6e 6f 74 20 62  header has not b
2b20: 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 20 64 69  een synced to di
2b30: 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  sk..**    * The 
2b40: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
2b50: 70 61 67 65 20 63 61 63 68 65 20 68 61 76 65 20  page cache have 
2b60: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a  been modified..*
2b70: 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 44 42 4d  *.**  WRITER_DBM
2b80: 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 54 68 65  OD:.**.**    The
2b90: 20 70 61 67 65 72 20 74 72 61 6e 73 69 74 69 6f   pager transitio
2ba0: 6e 73 20 66 72 6f 6d 20 57 52 49 54 45 52 5f 43  ns from WRITER_C
2bb0: 41 43 48 45 4d 4f 44 20 69 6e 74 6f 20 57 52 49  ACHEMOD into WRI
2bc0: 54 45 52 5f 44 42 4d 4f 44 20 73 74 61 74 65 0a  TER_DBMOD state.
2bd0: 2a 2a 20 20 20 20 77 68 65 6e 20 69 74 20 6d 6f  **    when it mo
2be0: 64 69 66 69 65 73 20 74 68 65 20 63 6f 6e 74 65  difies the conte
2bf0: 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  nts of the datab
2c00: 61 73 65 20 66 69 6c 65 2e 20 57 41 4c 20 63 6f  ase file. WAL co
2c10: 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 20 20 20  nnections.**    
2c20: 6e 65 76 65 72 20 65 6e 74 65 72 20 74 68 69 73  never enter this
2c30: 20 73 74 61 74 65 20 28 73 69 6e 63 65 20 74 68   state (since th
2c40: 65 79 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79  ey do not modify
2c50: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2c60: 6c 65 2c 0a 2a 2a 20 20 20 20 6a 75 73 74 20 74  le,.**    just t
2c70: 68 65 20 6c 6f 67 20 66 69 6c 65 29 2e 0a 2a 2a  he log file)..**
2c80: 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65  .**    * A write
2c90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
2ca0: 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20  active..**    * 
2cb0: 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6f 72 20  An EXCLUSIVE or 
2cc0: 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20  greater lock is 
2cd0: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
2ce0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
2cf0: 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66   * The journal f
2d00: 69 6c 65 20 69 73 20 6f 70 65 6e 20 61 6e 64 20  ile is open and 
2d10: 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72  the first header
2d20: 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65   has been writte
2d30: 6e 20 0a 2a 2a 20 20 20 20 20 20 61 6e 64 20 73  n .**      and s
2d40: 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a  ynced to disk..*
2d50: 2a 20 20 20 20 2a 20 54 68 65 20 63 6f 6e 74 65  *    * The conte
2d60: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  nts of the page 
2d70: 63 61 63 68 65 20 68 61 76 65 20 62 65 65 6e 20  cache have been 
2d80: 6d 6f 64 69 66 69 65 64 20 28 61 6e 64 20 70 6f  modified (and po
2d90: 73 73 69 62 6c 79 0a 2a 2a 20 20 20 20 20 20 77  ssibly.**      w
2da0: 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 29 2e  ritten to disk).
2db0: 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 46  .**.**  WRITER_F
2dc0: 49 4e 49 53 48 45 44 3a 0a 2a 2a 0a 2a 2a 20 20  INISHED:.**.**  
2dd0: 20 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73    It is not poss
2de0: 69 62 6c 65 20 66 6f 72 20 61 20 57 41 4c 20 63  ible for a WAL c
2df0: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 65 6e 74  onnection to ent
2e00: 65 72 20 74 68 69 73 20 73 74 61 74 65 2e 0a 2a  er this state..*
2e10: 2a 0a 2a 2a 20 20 20 20 41 20 72 6f 6c 6c 62 61  *.**    A rollba
2e20: 63 6b 2d 6d 6f 64 65 20 70 61 67 65 72 20 63 68  ck-mode pager ch
2e30: 61 6e 67 65 73 20 74 6f 20 57 52 49 54 45 52 5f  anges to WRITER_
2e40: 46 49 4e 49 53 48 45 44 20 73 74 61 74 65 20 66  FINISHED state f
2e50: 72 6f 6d 20 57 52 49 54 45 52 5f 44 42 4d 4f 44  rom WRITER_DBMOD
2e60: 0a 2a 2a 20 20 20 20 73 74 61 74 65 20 61 66 74  .**    state aft
2e70: 65 72 20 74 68 65 20 65 6e 74 69 72 65 20 74 72  er the entire tr
2e80: 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65  ansaction has be
2e90: 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  en successfully 
2ea0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
2eb0: 0a 2a 2a 20 20 20 20 64 61 74 61 62 61 73 65 20  .**    database 
2ec0: 66 69 6c 65 2e 20 49 6e 20 74 68 69 73 20 73 74  file. In this st
2ed0: 61 74 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ate the transact
2ee0: 69 6f 6e 20 6d 61 79 20 62 65 20 63 6f 6d 6d 69  ion may be commi
2ef0: 74 74 65 64 20 73 69 6d 70 6c 79 0a 2a 2a 20 20  tted simply.**  
2f00: 20 20 62 79 20 66 69 6e 61 6c 69 7a 69 6e 67 20    by finalizing 
2f10: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2f20: 2e 20 4f 6e 63 65 20 69 6e 20 57 52 49 54 45 52  . Once in WRITER
2f30: 5f 46 49 4e 49 53 48 45 44 20 73 74 61 74 65 2c  _FINISHED state,
2f40: 20 69 74 20 69 73 20 0a 2a 2a 20 20 20 20 6e 6f   it is .**    no
2f50: 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6d 6f  t possible to mo
2f60: 64 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73  dify the databas
2f70: 65 20 66 75 72 74 68 65 72 2e 20 41 74 20 74 68  e further. At th
2f80: 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 75 70  is point, the up
2f90: 70 65 72 20 0a 2a 2a 20 20 20 20 6c 61 79 65 72  per .**    layer
2fa0: 20 6d 75 73 74 20 65 69 74 68 65 72 20 63 6f 6d   must either com
2fb0: 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  mit or rollback 
2fc0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
2fd0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72  .**.**    * A wr
2fe0: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
2ff0: 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20  is active..**   
3000: 20 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20   * An EXCLUSIVE 
3010: 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
3020: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
3030: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
3040: 20 20 20 20 2a 20 41 6c 6c 20 77 72 69 74 69 6e      * All writin
3050: 67 20 61 6e 64 20 73 79 6e 63 69 6e 67 20 6f 66  g and syncing of
3060: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 64 61 74   journal and dat
3070: 61 62 61 73 65 20 64 61 74 61 20 68 61 73 20 66  abase data has f
3080: 69 6e 69 73 68 65 64 2e 0a 2a 2a 20 20 20 20 20  inished..**     
3090: 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   If no error occ
30a0: 75 72 72 65 64 2c 20 61 6c 6c 20 74 68 61 74 20  urred, all that 
30b0: 72 65 6d 61 69 6e 73 20 69 73 20 74 6f 20 66 69  remains is to fi
30c0: 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
30d0: 61 6c 20 74 6f 0a 2a 2a 20 20 20 20 20 20 63 6f  al to.**      co
30e0: 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63  mmit the transac
30f0: 74 69 6f 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f  tion. If an erro
3100: 72 20 64 69 64 20 6f 63 63 75 72 2c 20 74 68 65  r did occur, the
3110: 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6e 65 65   caller will nee
3120: 64 0a 2a 2a 20 20 20 20 20 20 74 6f 20 72 6f 6c  d.**      to rol
3130: 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
3140: 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 20 45  ction. .**.**  E
3150: 52 52 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 54  RROR:.**.**    T
3160: 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 69  he ERROR state i
3170: 73 20 65 6e 74 65 72 65 64 20 77 68 65 6e 20 61  s entered when a
3180: 6e 20 49 4f 20 6f 72 20 64 69 73 6b 2d 66 75 6c  n IO or disk-ful
3190: 6c 20 65 72 72 6f 72 20 28 69 6e 63 6c 75 64 69  l error (includi
31a0: 6e 67 0a 2a 2a 20 20 20 20 53 51 4c 49 54 45 5f  ng.**    SQLITE_
31b0: 49 4f 45 52 52 5f 4e 4f 4d 45 4d 29 20 6f 63 63  IOERR_NOMEM) occ
31c0: 75 72 73 20 61 74 20 61 20 70 6f 69 6e 74 20 69  urs at a point i
31d0: 6e 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  n the code that 
31e0: 6d 61 6b 65 73 20 69 74 20 0a 2a 2a 20 20 20 20  makes it .**    
31f0: 64 69 66 66 69 63 75 6c 74 20 74 6f 20 62 65 20  difficult to be 
3200: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 69 6e  sure that the in
3210: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 73 74  -memory pager st
3220: 61 74 65 20 28 63 61 63 68 65 20 63 6f 6e 74 65  ate (cache conte
3230: 6e 74 73 2c 20 0a 2a 2a 20 20 20 20 64 62 20 73  nts, .**    db s
3240: 69 7a 65 20 65 74 63 2e 29 20 61 72 65 20 63 6f  ize etc.) are co
3250: 6e 73 69 73 74 65 6e 74 20 77 69 74 68 20 74 68  nsistent with th
3260: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
3270: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 0a 2a  e file-system..*
3280: 2a 0a 2a 2a 20 20 20 20 54 65 6d 70 6f 72 61 72  *.**    Temporar
3290: 79 20 70 61 67 65 72 20 66 69 6c 65 73 20 6d 61  y pager files ma
32a0: 79 20 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f  y enter the ERRO
32b0: 52 20 73 74 61 74 65 2c 20 62 75 74 20 69 6e 2d  R state, but in-
32c0: 6d 65 6d 6f 72 79 20 70 61 67 65 72 73 0a 2a 2a  memory pagers.**
32d0: 20 20 20 20 63 61 6e 6e 6f 74 2e 0a 2a 2a 0a 2a      cannot..**.*
32e0: 2a 20 20 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  *    For example
32f0: 2c 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  , if an IO error
3300: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 70 65   occurs while pe
3310: 72 66 6f 72 6d 69 6e 67 20 61 20 72 6f 6c 6c 62  rforming a rollb
3320: 61 63 6b 2c 20 0a 2a 2a 20 20 20 20 74 68 65 20  ack, .**    the 
3330: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
3340: 70 61 67 65 2d 63 61 63 68 65 20 6d 61 79 20 62  page-cache may b
3350: 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63  e left in an inc
3360: 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e  onsistent state.
3370: 0a 2a 2a 20 20 20 20 41 74 20 74 68 69 73 20 70  .**    At this p
3380: 6f 69 6e 74 20 69 74 20 77 6f 75 6c 64 20 62 65  oint it would be
3390: 20 64 61 6e 67 65 72 6f 75 73 20 74 6f 20 63 68   dangerous to ch
33a0: 61 6e 67 65 20 62 61 63 6b 20 74 6f 20 52 45 41  ange back to REA
33b0: 44 45 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20  DER state.**    
33c0: 28 61 73 20 75 73 75 61 6c 6c 79 20 68 61 70 70  (as usually happ
33d0: 65 6e 73 20 61 66 74 65 72 20 61 20 72 6f 6c 6c  ens after a roll
33e0: 62 61 63 6b 29 2e 20 41 6e 79 20 73 75 62 73 65  back). Any subse
33f0: 71 75 65 6e 74 20 72 65 61 64 65 72 73 20 6d 69  quent readers mi
3400: 67 68 74 0a 2a 2a 20 20 20 20 72 65 70 6f 72 74  ght.**    report
3410: 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
3420: 74 69 6f 6e 20 28 64 75 65 20 74 6f 20 74 68 65  tion (due to the
3430: 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63 61   inconsistent ca
3440: 63 68 65 29 2c 20 61 6e 64 20 69 66 0a 2a 2a 20  che), and if.** 
3450: 20 20 20 74 68 65 79 20 75 70 67 72 61 64 65 20     they upgrade 
3460: 74 6f 20 77 72 69 74 65 72 73 2c 20 74 68 65 79  to writers, they
3470: 20 6d 61 79 20 69 6e 61 64 76 65 72 74 65 6e 74   may inadvertent
3480: 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65 20 64  ly corrupt the d
3490: 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 66 69  atabase.**    fi
34a0: 6c 65 2e 20 54 6f 20 61 76 6f 69 64 20 74 68 69  le. To avoid thi
34b0: 73 20 68 61 7a 61 72 64 2c 20 74 68 65 20 70 61  s hazard, the pa
34c0: 67 65 72 20 73 77 69 74 63 68 65 73 20 69 6e 74  ger switches int
34d0: 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  o the ERROR stat
34e0: 65 0a 2a 2a 20 20 20 20 69 6e 73 74 65 61 64 20  e.**    instead 
34f0: 6f 66 20 52 45 41 44 45 52 20 66 6f 6c 6c 6f 77  of READER follow
3500: 69 6e 67 20 73 75 63 68 20 61 6e 20 65 72 72 6f  ing such an erro
3510: 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 6e 63 65  r..**.**    Once
3520: 20 69 74 20 68 61 73 20 65 6e 74 65 72 65 64 20   it has entered 
3530: 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c  the ERROR state,
3540: 20 61 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   any attempt to 
3550: 75 73 65 20 74 68 65 20 70 61 67 65 72 0a 2a 2a  use the pager.**
3560: 20 20 20 20 74 6f 20 72 65 61 64 20 6f 72 20 77      to read or w
3570: 72 69 74 65 20 64 61 74 61 20 72 65 74 75 72 6e  rite data return
3580: 73 20 61 6e 20 65 72 72 6f 72 2e 20 45 76 65 6e  s an error. Even
3590: 74 75 61 6c 6c 79 2c 20 6f 6e 63 65 20 61 6c 6c  tually, once all
35a0: 20 0a 2a 2a 20 20 20 20 6f 75 74 73 74 61 6e 64   .**    outstand
35b0: 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ing transactions
35c0: 20 68 61 76 65 20 62 65 65 6e 20 61 62 61 6e 64   have been aband
35d0: 6f 6e 65 64 2c 20 74 68 65 20 70 61 67 65 72 20  oned, the pager 
35e0: 69 73 20 61 62 6c 65 20 74 6f 0a 2a 2a 20 20 20  is able to.**   
35f0: 20 74 72 61 6e 73 69 74 69 6f 6e 20 62 61 63 6b   transition back
3600: 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2c 20   to OPEN state, 
3610: 64 69 73 63 61 72 64 69 6e 67 20 74 68 65 20 63  discarding the c
3620: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a  ontents of the .
3630: 2a 2a 20 20 20 20 70 61 67 65 2d 63 61 63 68 65  **    page-cache
3640: 20 61 6e 64 20 61 6e 79 20 6f 74 68 65 72 20 69   and any other i
3650: 6e 2d 6d 65 6d 6f 72 79 20 73 74 61 74 65 20 61  n-memory state a
3660: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
3670: 20 45 76 65 72 79 74 68 69 6e 67 0a 2a 2a 20 20   Everything.**  
3680: 20 20 69 73 20 72 65 6c 6f 61 64 65 64 20 66 72    is reloaded fr
3690: 6f 6d 20 64 69 73 6b 20 28 61 6e 64 2c 20 69 66  om disk (and, if
36a0: 20 6e 65 63 65 73 73 61 72 79 2c 20 68 6f 74 2d   necessary, hot-
36b0: 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
36c0: 20 70 65 66 6f 72 6d 65 64 29 0a 2a 2a 20 20 20   peformed).**   
36d0: 20 77 68 65 6e 20 61 20 72 65 61 64 2d 74 72 61   when a read-tra
36e0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 65 78 74  nsaction is next
36f0: 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 70   opened on the p
3700: 61 67 65 72 20 28 74 72 61 6e 73 69 74 69 6f 6e  ager (transition
3710: 69 6e 67 0a 2a 2a 20 20 20 20 74 68 65 20 70 61  ing.**    the pa
3720: 67 65 72 20 69 6e 74 6f 20 52 45 41 44 45 52 20  ger into READER 
3730: 73 74 61 74 65 29 2e 20 41 74 20 74 68 61 74 20  state). At that 
3740: 70 6f 69 6e 74 20 74 68 65 20 73 79 73 74 65 6d  point the system
3750: 20 68 61 73 20 72 65 63 6f 76 65 72 65 64 20 0a   has recovered .
3760: 2a 2a 20 20 20 20 66 72 6f 6d 20 74 68 65 20 65  **    from the e
3770: 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53  rror..**.**    S
3780: 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 65  pecifically, the
3790: 20 70 61 67 65 72 20 6a 75 6d 70 73 20 69 6e 74   pager jumps int
37a0: 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  o the ERROR stat
37b0: 65 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  e if:.**.**     
37c0: 20 31 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63   1. An error occ
37d0: 75 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70  urs while attemp
37e0: 74 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  ting a rollback.
37f0: 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e   This happens in
3800: 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 75 6e 63  .**         func
3810: 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61 67 65  tion sqlite3Page
3820: 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 2a 2a 0a  rRollback()..**.
3830: 2a 2a 20 20 20 20 20 20 32 2e 20 41 6e 20 65 72  **      2. An er
3840: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
3850: 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 66   attempting to f
3860: 69 6e 61 6c 69 7a 65 20 61 20 6a 6f 75 72 6e 61  inalize a journa
3870: 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20  l file.**       
3880: 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 63 6f    following a co
3890: 6d 6d 69 74 20 69 6e 20 66 75 6e 63 74 69 6f 6e  mmit in function
38a0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
38b0: 6d 69 74 50 68 61 73 65 54 77 6f 28 29 2e 0a 2a  mitPhaseTwo()..*
38c0: 2a 0a 2a 2a 20 20 20 20 20 20 33 2e 20 41 6e 20  *.**      3. An 
38d0: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
38e0: 6c 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  le attempting to
38f0: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f   write to the jo
3900: 75 72 6e 61 6c 20 6f 72 0a 2a 2a 20 20 20 20 20  urnal or.**     
3910: 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
3920: 65 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20 70 61  e in function pa
3930: 67 65 72 53 74 72 65 73 73 28 29 20 69 6e 20 6f  gerStress() in o
3940: 72 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 0a  rder to free up.
3950: 2a 2a 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72  **         memor
3960: 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49 6e 20 6f  y..**.**    In o
3970: 74 68 65 72 20 63 61 73 65 73 2c 20 74 68 65 20  ther cases, the 
3980: 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
3990: 64 20 74 6f 20 74 68 65 20 62 2d 74 72 65 65 20  d to the b-tree 
39a0: 6c 61 79 65 72 2e 20 54 68 65 20 62 2d 74 72 65  layer. The b-tre
39b0: 65 0a 2a 2a 20 20 20 20 6c 61 79 65 72 20 74 68  e.**    layer th
39c0: 65 6e 20 61 74 74 65 6d 70 74 73 20 61 20 72 6f  en attempts a ro
39d0: 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e  llback operation
39e0: 2e 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 63  . If the error c
39f0: 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20 20 20 20  ondition .**    
3a00: 70 65 72 73 69 73 74 73 2c 20 74 68 65 20 70 61  persists, the pa
3a10: 67 65 72 20 65 6e 74 65 72 73 20 74 68 65 20 45  ger enters the E
3a20: 52 52 4f 52 20 73 74 61 74 65 20 76 69 61 20 63  RROR state via c
3a30: 6f 6e 64 69 74 69 6f 6e 20 28 31 29 20 61 62 6f  ondition (1) abo
3a40: 76 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 43 6f 6e  ve..**.**    Con
3a50: 64 69 74 69 6f 6e 20 28 33 29 20 69 73 20 6e 65  dition (3) is ne
3a60: 63 65 73 73 61 72 79 20 62 65 63 61 75 73 65 20  cessary because 
3a70: 69 74 20 63 61 6e 20 62 65 20 74 72 69 67 67 65  it can be trigge
3a80: 72 65 64 20 62 79 20 61 20 72 65 61 64 2d 6f 6e  red by a read-on
3a90: 6c 79 0a 2a 2a 20 20 20 20 73 74 61 74 65 6d 65  ly.**    stateme
3aa0: 6e 74 20 65 78 65 63 75 74 65 64 20 77 69 74 68  nt executed with
3ab0: 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
3ac0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
3ad0: 69 66 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20  if the error.** 
3ae0: 20 20 20 63 6f 64 65 20 77 65 72 65 20 73 69 6d     code were sim
3af0: 70 6c 79 20 72 65 74 75 72 6e 65 64 20 74 6f 20  ply returned to 
3b00: 74 68 65 20 75 73 65 72 2c 20 74 68 65 20 62 2d  the user, the b-
3b10: 74 72 65 65 20 6c 61 79 65 72 20 77 6f 75 6c 64  tree layer would
3b20: 20 6e 6f 74 0a 2a 2a 20 20 20 20 61 75 74 6f 6d   not.**    autom
3b30: 61 74 69 63 61 6c 6c 79 20 61 74 74 65 6d 70 74  atically attempt
3b40: 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20   a rollback, as 
3b50: 69 74 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  it assumes that 
3b60: 61 6e 20 65 72 72 6f 72 20 69 6e 20 61 0a 2a 2a  an error in a.**
3b70: 20 20 20 20 72 65 61 64 2d 6f 6e 6c 79 20 73 74      read-only st
3b80: 61 74 65 6d 65 6e 74 20 63 61 6e 6e 6f 74 20 6c  atement cannot l
3b90: 65 61 76 65 20 74 68 65 20 70 61 67 65 72 20 69  eave the pager i
3ba0: 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 20  n an internally 
3bb0: 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 0a 2a 2a  inconsistent .**
3bc0: 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a      state..**.**
3bd0: 20 20 20 20 2a 20 54 68 65 20 50 61 67 65 72 2e      * The Pager.
3be0: 65 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65  errCode variable
3bf0: 20 69 73 20 73 65 74 20 74 6f 20 73 6f 6d 65 74   is set to somet
3c00: 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
3c10: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 20 20  SQLITE_OK..**   
3c20: 20 2a 20 54 68 65 72 65 20 61 72 65 20 6f 6e 65   * There are one
3c30: 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74 61 6e   or more outstan
3c40: 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
3c50: 74 6f 20 70 61 67 65 73 20 28 61 66 74 65 72 20  to pages (after 
3c60: 74 68 65 0a 2a 2a 20 20 20 20 20 20 6c 61 73 74  the.**      last
3c70: 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 64 72   reference is dr
3c80: 6f 70 70 65 64 20 74 68 65 20 70 61 67 65 72 20  opped the pager 
3c90: 73 68 6f 75 6c 64 20 6d 6f 76 65 20 62 61 63 6b  should move back
3ca0: 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 29 2e   to OPEN state).
3cb0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 70 61 67  .**    * The pag
3cc0: 65 72 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 2d  er is not an in-
3cd0: 6d 65 6d 6f 72 79 20 70 61 67 65 72 2e 0a 2a 2a  memory pager..**
3ce0: 20 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 73      .**.** Notes
3cf0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 20 70 61  :.**.**   * A pa
3d00: 67 65 72 20 69 73 20 6e 65 76 65 72 20 69 6e 20  ger is never in 
3d10: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 6f 72 20  WRITER_DBMOD or 
3d20: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
3d30: 73 74 61 74 65 20 69 66 20 74 68 65 0a 2a 2a 20  state if the.** 
3d40: 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69      connection i
3d50: 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 20 6d 6f  s open in WAL mo
3d60: 64 65 2e 20 41 20 57 41 4c 20 63 6f 6e 6e 65 63  de. A WAL connec
3d70: 74 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 69  tion is always i
3d80: 6e 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 6f 66 20  n one.**     of 
3d90: 74 68 65 20 66 69 72 73 74 20 66 6f 75 72 20 73  the first four s
3da0: 74 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  tates..**.**   *
3db0: 20 4e 6f 72 6d 61 6c 6c 79 2c 20 61 20 63 6f 6e   Normally, a con
3dc0: 6e 65 63 74 69 6f 6e 20 6f 70 65 6e 20 69 6e 20  nection open in 
3dd0: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 69  exclusive mode i
3de0: 73 20 6e 65 76 65 72 20 69 6e 20 50 41 47 45 52  s never in PAGER
3df0: 5f 4f 50 45 4e 0a 2a 2a 20 20 20 20 20 73 74 61  _OPEN.**     sta
3e00: 74 65 2e 20 54 68 65 72 65 20 61 72 65 20 74 77  te. There are tw
3e10: 6f 20 65 78 63 65 70 74 69 6f 6e 73 3a 20 69 6d  o exceptions: im
3e20: 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
3e30: 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 20 68  exclusive-mode h
3e40: 61 73 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 74  as.**     been t
3e50: 75 72 6e 65 64 20 6f 6e 20 28 61 6e 64 20 62 65  urned on (and be
3e60: 66 6f 72 65 20 61 6e 79 20 72 65 61 64 20 6f 72  fore any read or
3e70: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
3e80: 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 20 20 20 20  ons are .**     
3e90: 65 78 65 63 75 74 65 64 29 2c 20 61 6e 64 20 77  executed), and w
3ea0: 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73  hen the pager is
3eb0: 20 6c 65 61 76 69 6e 67 20 74 68 65 20 22 65 72   leaving the "er
3ec0: 72 6f 72 20 73 74 61 74 65 22 2e 0a 2a 2a 0a 2a  ror state"..**.*
3ed0: 2a 20 20 20 2a 20 53 65 65 20 61 6c 73 6f 3a 20  *   * See also: 
3ee0: 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
3ef0: 74 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  te()..*/.#define
3f00: 20 50 41 47 45 52 5f 4f 50 45 4e 20 20 20 20 20   PAGER_OPEN     
3f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 23               0.#
3f20: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 52 45 41  define PAGER_REA
3f30: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DER             
3f40: 20 20 20 31 0a 23 64 65 66 69 6e 65 20 50 41 47     1.#define PAG
3f50: 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
3f60: 20 20 20 20 20 20 20 20 20 32 0a 23 64 65 66 69           2.#defi
3f70: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f80: 43 41 43 48 45 4d 4f 44 20 20 20 20 20 20 20 33  CACHEMOD       3
3f90: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3fa0: 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 20  RITER_DBMOD     
3fb0: 20 20 20 20 20 34 0a 23 64 65 66 69 6e 65 20 50       4.#define P
3fc0: 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49  AGER_WRITER_FINI
3fd0: 53 48 45 44 20 20 20 20 20 20 20 35 0a 23 64 65  SHED       5.#de
3fe0: 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52 4f 52  fine PAGER_ERROR
3ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4000: 20 36 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 50 61   6../*.** The Pa
4010: 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62  ger.eLock variab
4020: 6c 65 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77  le is almost alw
4030: 61 79 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6f  ays set to one o
4040: 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77  f the .** follow
4050: 69 6e 67 20 6c 6f 63 6b 69 6e 67 2d 73 74 61 74  ing locking-stat
4060: 65 73 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  es, according to
4070: 20 74 68 65 20 6c 6f 63 6b 20 63 75 72 72 65 6e   the lock curren
4080: 74 6c 79 20 68 65 6c 64 20 6f 6e 0a 2a 2a 20 74  tly held on.** t
4090: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
40a0: 3a 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45  : NO_LOCK, SHARE
40b0: 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44  D_LOCK, RESERVED
40c0: 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53 49  _LOCK or EXCLUSI
40d0: 56 45 5f 4c 4f 43 4b 2e 0a 2a 2a 20 54 68 69 73  VE_LOCK..** This
40e0: 20 76 61 72 69 61 62 6c 65 20 69 73 20 6b 65 70   variable is kep
40f0: 74 20 75 70 20 74 6f 20 64 61 74 65 20 61 73 20  t up to date as 
4100: 6c 6f 63 6b 73 20 61 72 65 20 74 61 6b 65 6e 20  locks are taken 
4110: 61 6e 64 20 72 65 6c 65 61 73 65 64 20 62 79 0a  and released by.
4120: 2a 2a 20 74 68 65 20 70 61 67 65 72 4c 6f 63 6b  ** the pagerLock
4130: 44 62 28 29 20 61 6e 64 20 70 61 67 65 72 55 6e  Db() and pagerUn
4140: 6c 6f 63 6b 44 62 28 29 20 77 72 61 70 70 65 72  lockDb() wrapper
4150: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
4160: 56 46 53 20 78 4c 6f 63 6b 28 29 20 6f 72 20 78  VFS xLock() or x
4170: 55 6e 6c 6f 63 6b 28 29 20 72 65 74 75 72 6e 73  Unlock() returns
4180: 20 61 6e 20 65 72 72 6f 72 20 6f 74 68 65 72 20   an error other 
4190: 74 68 61 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  than SQLITE_BUSY
41a0: 0a 2a 2a 20 28 69 2e 65 2e 20 6f 6e 65 20 6f 66  .** (i.e. one of
41b0: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 45 52   the SQLITE_IOER
41c0: 52 20 73 75 62 74 79 70 65 73 29 2c 20 69 74 20  R subtypes), it 
41d0: 69 73 20 6e 6f 74 20 63 6c 65 61 72 20 77 68 65  is not clear whe
41e0: 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74  ther or not.** t
41f0: 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 77 61 73  he operation was
4200: 20 73 75 63 63 65 73 73 66 75 6c 2e 20 49 6e 20   successful. In 
4210: 74 68 65 73 65 20 63 69 72 63 75 6d 73 74 61 6e  these circumstan
4220: 63 65 73 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  ces pagerLockDb(
4230: 29 20 61 6e 64 0a 2a 2a 20 70 61 67 65 72 55 6e  ) and.** pagerUn
4240: 6c 6f 63 6b 44 62 28 29 20 74 61 6b 65 20 61 20  lockDb() take a 
4250: 63 6f 6e 73 65 72 76 61 74 69 76 65 20 61 70 70  conservative app
4260: 72 6f 61 63 68 20 2d 20 65 4c 6f 63 6b 20 69 73  roach - eLock is
4270: 20 61 6c 77 61 79 73 20 75 70 64 61 74 65 64 0a   always updated.
4280: 2a 2a 20 77 68 65 6e 20 75 6e 6c 6f 63 6b 69 6e  ** when unlockin
4290: 67 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64 20  g the file, and 
42a0: 6f 6e 6c 79 20 75 70 64 61 74 65 64 20 77 68 65  only updated whe
42b0: 6e 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69  n locking the fi
42c0: 6c 65 20 69 66 20 74 68 65 0a 2a 2a 20 56 46 53  le if the.** VFS
42d0: 20 63 61 6c 6c 20 69 73 20 73 75 63 63 65 73 73   call is success
42e0: 66 75 6c 2e 20 54 68 69 73 20 77 61 79 2c 20 74  ful. This way, t
42f0: 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76  he Pager.eLock v
4300: 61 72 69 61 62 6c 65 20 6d 61 79 20 62 65 20 73  ariable may be s
4310: 65 74 0a 2a 2a 20 74 6f 20 61 20 6c 65 73 73 20  et.** to a less 
4320: 65 78 63 6c 75 73 69 76 65 20 28 6c 6f 77 65 72  exclusive (lower
4330: 29 20 76 61 6c 75 65 20 74 68 61 6e 20 74 68 65  ) value than the
4340: 20 6c 6f 63 6b 20 74 68 61 74 20 69 73 20 61 63   lock that is ac
4350: 74 75 61 6c 6c 79 20 68 65 6c 64 0a 2a 2a 20 61  tually held.** a
4360: 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76  t the system lev
4370: 65 6c 2c 20 62 75 74 20 69 74 20 69 73 20 6e 65  el, but it is ne
4380: 76 65 72 20 73 65 74 20 74 6f 20 61 20 6d 6f 72  ver set to a mor
4390: 65 20 65 78 63 6c 75 73 69 76 65 20 76 61 6c 75  e exclusive valu
43a0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  e..**.** This is
43b0: 20 75 73 75 61 6c 6c 79 20 73 61 66 65 2e 20 49   usually safe. I
43c0: 66 20 61 6e 20 78 55 6e 6c 6f 63 6b 20 66 61 69  f an xUnlock fai
43d0: 6c 73 20 6f 72 20 61 70 70 65 61 72 73 20 74 6f  ls or appears to
43e0: 20 66 61 69 6c 2c 20 74 68 65 72 65 20 6d 61 79   fail, there may
43f0: 20 0a 2a 2a 20 62 65 20 61 20 66 65 77 20 72 65   .** be a few re
4400: 64 75 6e 64 61 6e 74 20 78 4c 6f 63 6b 28 29 20  dundant xLock() 
4410: 63 61 6c 6c 73 20 6f 72 20 61 20 6c 6f 63 6b 20  calls or a lock 
4420: 6d 61 79 20 62 65 20 68 65 6c 64 20 66 6f 72 20  may be held for 
4430: 6c 6f 6e 67 65 72 20 74 68 61 6e 0a 2a 2a 20 72  longer than.** r
4440: 65 71 75 69 72 65 64 2c 20 62 75 74 20 6e 6f 74  equired, but not
4450: 68 69 6e 67 20 72 65 61 6c 6c 79 20 67 6f 65 73  hing really goes
4460: 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68   wrong..**.** Th
4470: 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 77  e exception is w
4480: 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  hen the database
4490: 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65   file is unlocke
44a0: 64 20 61 73 20 74 68 65 20 70 61 67 65 72 20 6d  d as the pager m
44b0: 6f 76 65 73 0a 2a 2a 20 66 72 6f 6d 20 45 52 52  oves.** from ERR
44c0: 4f 52 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65  OR to OPEN state
44d0: 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
44e0: 74 68 65 72 65 20 6d 61 79 20 62 65 20 61 20 68  there may be a h
44f0: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
4500: 0a 2a 2a 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  .** in the file-
4510: 73 79 73 74 65 6d 20 74 68 61 74 20 6e 65 65 64  system that need
4520: 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
4530: 61 63 6b 20 28 61 73 20 70 61 72 74 20 6f 66 20  ack (as part of 
4540: 61 6e 20 4f 50 45 4e 2d 3e 53 48 41 52 45 44 0a  an OPEN->SHARED.
4550: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 2c 20 62  ** transition, b
4560: 79 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72  y the same pager
4570: 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 29 2e 20   or any other). 
4580: 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 78  If the call to x
4590: 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 66 61 69 6c  Unlock().** fail
45a0: 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  s at this point 
45b0: 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73  and the pager is
45c0: 20 6c 65 66 74 20 68 6f 6c 64 69 6e 67 20 61 6e   left holding an
45d0: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c   EXCLUSIVE lock,
45e0: 20 74 68 69 73 0a 2a 2a 20 63 61 6e 20 63 6f 6e   this.** can con
45f0: 66 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f  fuse the call to
4600: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
4610: 6f 63 6b 28 29 20 63 61 6c 6c 20 6d 61 64 65 20  ock() call made 
4620: 6c 61 74 65 72 20 61 73 20 70 61 72 74 0a 2a 2a  later as part.**
4630: 20 6f 66 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20   of hot-journal 
4640: 64 65 74 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  detection..**.**
4650: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
4660: 6f 63 6b 28 29 20 69 73 20 64 65 66 69 6e 65 64  ock() is defined
4670: 20 61 73 20 72 65 74 75 72 6e 69 6e 67 20 74 72   as returning tr
4680: 75 65 20 22 69 66 20 74 68 65 72 65 20 69 73 20  ue "if there is 
4690: 61 20 52 45 53 45 52 56 45 44 20 0a 2a 2a 20 6c  a RESERVED .** l
46a0: 6f 63 6b 20 68 65 6c 64 20 62 79 20 74 68 69 73  ock held by this
46b0: 20 70 72 6f 63 65 73 73 20 6f 72 20 61 6e 79 20   process or any 
46c0: 6f 74 68 65 72 73 22 2e 20 53 6f 20 78 43 68 65  others". So xChe
46d0: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
46e0: 61 79 20 0a 2a 2a 20 72 65 74 75 72 6e 20 74 72  ay .** return tr
46f0: 75 65 20 62 65 63 61 75 73 65 20 74 68 65 20 63  ue because the c
4700: 61 6c 6c 65 72 20 69 74 73 65 6c 66 20 69 73 20  aller itself is 
4710: 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55  holding an EXCLU
4720: 53 49 56 45 20 6c 6f 63 6b 20 28 62 75 74 0a 2a  SIVE lock (but.*
4730: 2a 20 64 6f 65 73 6e 27 74 20 6b 6e 6f 77 20 69  * doesn't know i
4740: 74 20 62 65 63 61 75 73 65 20 6f 66 20 61 20 70  t because of a p
4750: 72 65 76 69 6f 75 73 20 65 72 72 6f 72 20 69 6e  revious error in
4760: 20 78 55 6e 6c 6f 63 6b 29 2e 20 49 66 20 74 68   xUnlock). If th
4770: 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20 61 20  is happens.** a 
4780: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  hot-journal may 
4790: 62 65 20 6d 69 73 74 61 6b 65 6e 20 66 6f 72 20  be mistaken for 
47a0: 61 20 6a 6f 75 72 6e 61 6c 20 62 65 69 6e 67 20  a journal being 
47b0: 63 72 65 61 74 65 64 20 62 79 20 61 6e 20 61 63  created by an ac
47c0: 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  tive.** transact
47d0: 69 6f 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20 70  ion in another p
47e0: 72 6f 63 65 73 73 2c 20 63 61 75 73 69 6e 67 20  rocess, causing 
47f0: 53 51 4c 69 74 65 20 74 6f 20 72 65 61 64 20 66  SQLite to read f
4800: 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
4810: 0a 2a 2a 20 77 69 74 68 6f 75 74 20 72 6f 6c 6c  .** without roll
4820: 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a  ing it back..**.
4830: 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  ** To work aroun
4840: 64 20 74 68 69 73 2c 20 69 66 20 61 20 63 61 6c  d this, if a cal
4850: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 20 66  l to xUnlock() f
4860: 61 69 6c 73 20 77 68 65 6e 20 75 6e 6c 6f 63 6b  ails when unlock
4870: 69 6e 67 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  ing the.** datab
4880: 61 73 65 20 69 6e 20 74 68 65 20 45 52 52 4f 52  ase in the ERROR
4890: 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65 4c   state, Pager.eL
48a0: 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e  ock is set to UN
48b0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 49 74 0a 2a  KNOWN_LOCK. It.*
48c0: 2a 20 69 73 20 6f 6e 6c 79 20 63 68 61 6e 67 65  * is only change
48d0: 64 20 62 61 63 6b 20 74 6f 20 61 20 72 65 61 6c  d back to a real
48e0: 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 20 61   locking state a
48f0: 66 74 65 72 20 61 20 73 75 63 63 65 73 73 66 75  fter a successfu
4900: 6c 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 78 4c 6f  l call.** to xLo
4910: 63 6b 28 45 58 43 4c 55 53 49 56 45 29 2e 20 41  ck(EXCLUSIVE). A
4920: 6c 73 6f 2c 20 74 68 65 20 63 6f 64 65 20 74 6f  lso, the code to
4930: 20 64 6f 20 74 68 65 20 4f 50 45 4e 2d 3e 53 48   do the OPEN->SH
4940: 41 52 45 44 20 73 74 61 74 65 20 74 72 61 6e 73  ARED state trans
4950: 69 74 69 6f 6e 0a 2a 2a 20 6f 6d 69 74 73 20 74  ition.** omits t
4960: 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61 20 68  he check for a h
4970: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 50 61  ot-journal if Pa
4980: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
4990: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
49a0: 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 6e 73 74 65   .** lock. Inste
49b0: 61 64 2c 20 69 74 20 61 73 73 75 6d 65 73 20 61  ad, it assumes a
49c0: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 65 78 69   hot-journal exi
49d0: 73 74 73 20 61 6e 64 20 6f 62 74 61 69 6e 73 20  sts and obtains 
49e0: 61 6e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  an EXCLUSIVE.** 
49f0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
4a00: 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65  base file before
4a10: 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72   attempting to r
4a20: 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 53 65 65  oll it back. See
4a30: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 50 61 67   function.** Pag
4a40: 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 20 66  erSharedLock() f
4a50: 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 2e 0a  or more detail..
4a60: 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f 63  **.** Pager.eLoc
4a70: 6b 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 73 65  k may only be se
4a80: 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
4a90: 4b 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  K when the pager
4aa0: 20 69 73 20 69 6e 20 0a 2a 2a 20 50 41 47 45 52   is in .** PAGER
4ab0: 5f 4f 50 45 4e 20 73 74 61 74 65 2e 0a 2a 2f 0a  _OPEN state..*/.
4ac0: 23 64 65 66 69 6e 65 20 55 4e 4b 4e 4f 57 4e 5f  #define UNKNOWN_
4ad0: 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 20 20 20  LOCK            
4ae0: 20 20 20 20 28 45 58 43 4c 55 53 49 56 45 5f 4c      (EXCLUSIVE_L
4af0: 4f 43 4b 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 41 20  OCK+1)../*.** A 
4b00: 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20 69  macro used for i
4b10: 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64 65  nvoking the code
4b20: 63 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  c if there is on
4b30: 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  e.*/.#ifdef SQLI
4b40: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20 64  TE_HAS_CODEC.# d
4b50: 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44  efine CODEC1(P,D
4b60: 2c 4e 2c 58 2c 45 29 20 5c 0a 20 20 20 20 69 66  ,N,X,E) \.    if
4b70: 28 20 50 2d 3e 78 43 6f 64 65 63 20 26 26 20 50  ( P->xCodec && P
4b80: 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f 64  ->xCodec(P->pCod
4b90: 65 63 2c 44 2c 4e 2c 58 29 3d 3d 30 20 29 7b 20  ec,D,N,X)==0 ){ 
4ba0: 45 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 43 4f  E; }.# define CO
4bb0: 44 45 43 32 28 50 2c 44 2c 4e 2c 58 2c 45 2c 4f  DEC2(P,D,N,X,E,O
4bc0: 29 20 5c 0a 20 20 20 20 69 66 28 20 50 2d 3e 78  ) \.    if( P->x
4bd0: 43 6f 64 65 63 3d 3d 30 20 29 7b 20 4f 3d 28 63  Codec==0 ){ O=(c
4be0: 68 61 72 2a 29 44 3b 20 7d 65 6c 73 65 20 5c 0a  har*)D; }else \.
4bf0: 20 20 20 20 69 66 28 20 28 4f 3d 28 63 68 61 72      if( (O=(char
4c00: 2a 29 28 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e  *)(P->xCodec(P->
4c10: 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 29 29 3d  pCodec,D,N,X)))=
4c20: 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 65 6c 73 65  =0 ){ E; }.#else
4c30: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31  .# define CODEC1
4c40: 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 20 20 2f 2a  (P,D,N,X,E)   /*
4c50: 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65 66 69   NO-OP */.# defi
4c60: 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c  ne CODEC2(P,D,N,
4c70: 58 2c 45 2c 4f 29 20 4f 3d 28 63 68 61 72 2a 29  X,E,O) O=(char*)
4c80: 44 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  D.#endif../*.** 
4c90: 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f  The maximum allo
4ca0: 77 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 2e  wed sector size.
4cb0: 20 36 34 4b 69 42 2e 20 49 66 20 74 68 65 20 78   64KiB. If the x
4cc0: 53 65 63 74 6f 72 73 69 7a 65 28 29 20 6d 65 74  Sectorsize() met
4cd0: 68 6f 64 20 0a 2a 2a 20 72 65 74 75 72 6e 73 20  hod .** returns 
4ce0: 61 20 76 61 6c 75 65 20 6c 61 72 67 65 72 20 74  a value larger t
4cf0: 68 61 6e 20 74 68 69 73 2c 20 74 68 65 6e 20 4d  han this, then M
4d00: 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69  AX_SECTOR_SIZE i
4d10: 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a  s used instead..
4d20: 2a 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 63 6f  ** This could co
4d30: 6e 63 65 69 76 61 62 6c 79 20 63 61 75 73 65 20  nceivably cause 
4d40: 63 6f 72 72 75 70 74 69 6f 6e 20 66 6f 6c 6c 6f  corruption follo
4d50: 77 69 6e 67 20 61 20 70 6f 77 65 72 20 66 61 69  wing a power fai
4d60: 6c 75 72 65 20 6f 6e 0a 2a 2a 20 73 75 63 68 20  lure on.** such 
4d70: 61 20 73 79 73 74 65 6d 2e 20 54 68 69 73 20 69  a system. This i
4d80: 73 20 63 75 72 72 65 6e 74 6c 79 20 61 6e 20 75  s currently an u
4d90: 6e 64 6f 63 75 6d 65 6e 74 65 64 20 6c 69 6d 69  ndocumented limi
4da0: 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41  t..*/.#define MA
4db0: 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 30 78  X_SECTOR_SIZE 0x
4dc0: 31 30 30 30 30 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e  10000.../*.** An
4dd0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
4de0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
4df0: 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
4e00: 64 20 66 6f 72 20 65 61 63 68 20 61 63 74 69 76  d for each activ
4e10: 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 61  e.** savepoint a
4e20: 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  nd statement tra
4e30: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  nsaction in the 
4e40: 73 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63 68  system. All such
4e50: 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 61   structures.** a
4e60: 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  re stored in the
4e70: 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
4e80: 74 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63 68  t[] array, which
4e90: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
4ea0: 64 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73 69  d.** resized usi
4eb0: 6e 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f  ng sqlite3Reallo
4ec0: 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  c()..**.** When 
4ed0: 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 63  a savepoint is c
4ee0: 72 65 61 74 65 64 2c 20 74 68 65 20 50 61 67 65  reated, the Page
4ef0: 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
4f00: 66 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a 2a  ffset field is.*
4f10: 2a 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20 61  * set to 0. If a
4f20: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
4f30: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
4f40: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
4f50: 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73 61   while.** the sa
4f60: 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76  vepoint is activ
4f70: 65 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66 73  e, then iHdrOffs
4f80: 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  et is set to the
4f90: 20 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a 2a   byte offset .**
4fa0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
4fb0: 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20  lowing the last 
4fc0: 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77  journal record w
4fd0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
4fe0: 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  main.** journal 
4ff0: 62 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72 6e  before the journ
5000: 61 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73 20  al-header. This 
5010: 69 73 20 72 65 71 75 69 72 65 64 20 64 75 72 69  is required duri
5020: 6e 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20  ng savepoint.** 
5030: 72 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70 61  rollback (see pa
5040: 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70  gerPlaybackSavep
5050: 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70 65  oint())..*/.type
5060: 64 65 66 20 73 74 72 75 63 74 20 50 61 67 65 72  def struct Pager
5070: 53 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72 53  Savepoint PagerS
5080: 61 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63 74  avepoint;.struct
5090: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
50a0: 7b 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b  {.  i64 iOffset;
50b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50c0: 20 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66 66   /* Starting off
50d0: 73 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75 72  set in main jour
50e0: 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64  nal */.  i64 iHd
50f0: 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  rOffset;        
5100: 20 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62 6f        /* See abo
5110: 76 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  ve */.  Bitvec *
5120: 70 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20  pInSavepoint;   
5130: 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 70       /* Set of p
5140: 61 67 65 73 20 69 6e 20 74 68 69 73 20 73 61 76  ages in this sav
5150: 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e 6f  epoint */.  Pgno
5160: 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20   nOrig;         
5170: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
5180: 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  inal number of p
5190: 61 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f 0a  ages in file */.
51a0: 20 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b 20    Pgno iSubRec; 
51b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
51c0: 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74  * Index of first
51d0: 20 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d 6a   record in sub-j
51e0: 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65  ournal */.#ifnde
51f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
5200: 4c 0a 20 20 75 33 32 20 61 57 61 6c 44 61 74 61  L.  u32 aWalData
5210: 5b 57 41 4c 5f 53 41 56 45 50 4f 49 4e 54 5f 4e  [WAL_SAVEPOINT_N
5220: 44 41 54 41 5d 3b 20 20 20 20 20 20 20 20 2f 2a  DATA];        /*
5230: 20 57 41 4c 20 73 61 76 65 70 6f 69 6e 74 20 63   WAL savepoint c
5240: 6f 6e 74 65 78 74 20 2a 2f 0a 23 65 6e 64 69 66  ontext */.#endif
5250: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 69 74 73 20  .};../*.** Bits 
5260: 6f 66 20 74 68 65 20 50 61 67 65 72 2e 64 6f 4e  of the Pager.doN
5270: 6f 74 53 70 69 6c 6c 20 66 6c 61 67 2e 20 20 53  otSpill flag.  S
5280: 65 65 20 66 75 72 74 68 65 72 20 64 65 73 63 72  ee further descr
5290: 69 70 74 69 6f 6e 20 62 65 6c 6f 77 2e 0a 2a 2f  iption below..*/
52a0: 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46 4c  .#define SPILLFL
52b0: 41 47 5f 4f 46 46 20 20 20 20 20 20 20 20 20 30  AG_OFF         0
52c0: 78 30 31 20 2f 2a 20 4e 65 76 65 72 20 73 70 69  x01 /* Never spi
52d0: 6c 6c 20 63 61 63 68 65 2e 20 20 53 65 74 20 76  ll cache.  Set v
52e0: 69 61 20 70 72 61 67 6d 61 20 2a 2f 0a 23 64 65  ia pragma */.#de
52f0: 66 69 6e 65 20 53 50 49 4c 4c 46 4c 41 47 5f 52  fine SPILLFLAG_R
5300: 4f 4c 4c 42 41 43 4b 20 20 20 20 30 78 30 32 20  OLLBACK    0x02 
5310: 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f 6c 6c 69  /* Current rolli
5320: 6e 67 20 62 61 63 6b 2c 20 73 6f 20 64 6f 20 6e  ng back, so do n
5330: 6f 74 20 73 70 69 6c 6c 20 2a 2f 0a 23 64 65 66  ot spill */.#def
5340: 69 6e 65 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f  ine SPILLFLAG_NO
5350: 53 59 4e 43 20 20 20 20 20 20 30 78 30 34 20 2f  SYNC      0x04 /
5360: 2a 20 53 70 69 6c 6c 20 69 73 20 6f 6b 2c 20 62  * Spill is ok, b
5370: 75 74 20 64 6f 20 6e 6f 74 20 73 79 6e 63 20 2a  ut do not sync *
5380: 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 70 65 6e  /../*.** An open
5390: 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20 61   page cache is a
53a0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 73 74  n instance of st
53b0: 72 75 63 74 20 50 61 67 65 72 2e 20 41 20 64 65  ruct Pager. A de
53c0: 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20  scription of.** 
53d0: 73 6f 6d 65 20 6f 66 20 74 68 65 20 6d 6f 72 65  some of the more
53e0: 20 69 6d 70 6f 72 74 61 6e 74 20 6d 65 6d 62 65   important membe
53f0: 72 20 76 61 72 69 61 62 6c 65 73 20 66 6f 6c 6c  r variables foll
5400: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 65 53 74 61 74  ows:.**.** eStat
5410: 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 63 75  e.**.**   The cu
5420: 72 72 65 6e 74 20 27 73 74 61 74 65 27 20 6f 66  rrent 'state' of
5430: 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
5440: 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65  t. See the comme
5450: 6e 74 20 61 6e 64 20 73 74 61 74 65 0a 2a 2a 20  nt and state.** 
5460: 20 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20    diagram above 
5470: 66 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f  for a descriptio
5480: 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 73  n of the pager s
5490: 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 65 4c 6f 63  tate..**.** eLoc
54a0: 6b 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20  k.**.**   For a 
54b0: 72 65 61 6c 20 6f 6e 2d 64 69 73 6b 20 64 61 74  real on-disk dat
54c0: 61 62 61 73 65 2c 20 74 68 65 20 63 75 72 72 65  abase, the curre
54d0: 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  nt lock held on 
54e0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
54f0: 65 20 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b  e -.**   NO_LOCK
5500: 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52  , SHARED_LOCK, R
5510: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20  ESERVED_LOCK or 
5520: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a  EXCLUSIVE_LOCK..
5530: 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20 74 65  **.**   For a te
5540: 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65  mporary or in-me
5550: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 28 6e  mory database (n
5560: 65 69 74 68 65 72 20 6f 66 20 77 68 69 63 68 20  either of which 
5570: 72 65 71 75 69 72 65 20 61 6e 79 0a 2a 2a 20 20  require any.**  
5580: 20 6c 6f 63 6b 73 29 2c 20 74 68 69 73 20 76 61   locks), this va
5590: 72 69 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73  riable is always
55a0: 20 73 65 74 20 74 6f 20 45 58 43 4c 55 53 49 56   set to EXCLUSIV
55b0: 45 5f 4c 4f 43 4b 2e 20 53 69 6e 63 65 20 73 75  E_LOCK. Since su
55c0: 63 68 0a 2a 2a 20 20 20 64 61 74 61 62 61 73 65  ch.**   database
55d0: 73 20 61 6c 77 61 79 73 20 68 61 76 65 20 50 61  s always have Pa
55e0: 67 65 72 2e 65 78 63 6c 75 73 69 76 65 4d 6f 64  ger.exclusiveMod
55f0: 65 3d 3d 31 2c 20 74 68 69 73 20 74 72 69 63 6b  e==1, this trick
5600: 73 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 20  s the pager.**  
5610: 20 6c 6f 67 69 63 20 69 6e 74 6f 20 74 68 69 6e   logic into thin
5620: 6b 69 6e 67 20 74 68 61 74 20 69 74 20 61 6c 72  king that it alr
5630: 65 61 64 79 20 68 61 73 20 61 6c 6c 20 74 68 65  eady has all the
5640: 20 6c 6f 63 6b 73 20 69 74 20 77 69 6c 6c 20 65   locks it will e
5650: 76 65 72 0a 2a 2a 20 20 20 6e 65 65 64 20 28 61  ver.**   need (a
5660: 6e 64 20 6e 6f 20 72 65 61 73 6f 6e 20 74 6f 20  nd no reason to 
5670: 72 65 6c 65 61 73 65 20 74 68 65 6d 29 2e 0a 2a  release them)..*
5680: 2a 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65 20 28  *.**   In some (
5690: 6f 62 73 63 75 72 65 29 20 63 69 72 63 75 6d 73  obscure) circums
56a0: 74 61 6e 63 65 73 2c 20 74 68 69 73 20 76 61 72  tances, this var
56b0: 69 61 62 6c 65 20 6d 61 79 20 61 6c 73 6f 20 62  iable may also b
56c0: 65 20 73 65 74 20 74 6f 0a 2a 2a 20 20 20 55 4e  e set to.**   UN
56d0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20  KNOWN_LOCK. See 
56e0: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76  the comment abov
56f0: 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66  e the #define of
5700: 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f   UNKNOWN_LOCK fo
5710: 72 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a  r.**   details..
5720: 2a 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e  **.** changeCoun
5730: 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  tDone.**.**   Th
5740: 69 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61  is boolean varia
5750: 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d  ble is used to m
5760: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
5770: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
5780: 20 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79   .**   (the 4-by
5790: 74 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20  te header field 
57a0: 61 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 32  at byte offset 2
57b0: 34 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  4 of the databas
57c0: 65 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20  e file) is .**  
57d0: 20 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72   not updated mor
57e0: 65 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63  e often than nec
57f0: 65 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20  essary. .**.**  
5800: 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 74 72   It is set to tr
5810: 75 65 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e  ue when the chan
5820: 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64  ge-counter field
5830: 20 69 73 20 75 70 64 61 74 65 64 2c 20 77 68 69   is updated, whi
5840: 63 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c  ch .**   can onl
5850: 79 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65  y happen if an e
5860: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
5870: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
5880: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20  abase file..**  
5890: 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 28   It is cleared (
58a0: 73 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68  set to false) wh
58b0: 65 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73  enever an exclus
58c0: 69 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20  ive lock is .** 
58d0: 20 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f    relinquished o
58e0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
58f0: 69 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61  ile. Each time a
5900: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
5910: 63 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20  committed,.**   
5920: 54 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  The changeCountD
5930: 6f 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70  one flag is insp
5940: 65 63 74 65 64 2e 20 49 66 20 69 74 20 69 73 20  ected. If it is 
5950: 74 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f  true, the work o
5960: 66 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20  f.**   updating 
5970: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
5980: 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f  er is omitted fo
5990: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  r the current tr
59a0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
59b0: 20 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73     This mechanis
59c0: 6d 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65  m means that whe
59d0: 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  n running in exc
59e0: 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63  lusive mode, a c
59f0: 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20  onnection .**   
5a00: 6e 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65  need only update
5a10: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
5a20: 74 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68  ter once, for th
5a30: 65 20 66 69 72 73 74 20 74 72 61 6e 73 61 63 74  e first transact
5a40: 69 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74  ion.**   committ
5a50: 65 64 2e 0a 2a 2a 0a 2a 2a 20 73 65 74 4d 61 73  ed..**.** setMas
5a60: 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65 6e  ter.**.**   When
5a70: 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73   PagerCommitPhas
5a80: 65 4f 6e 65 28 29 20 69 73 20 63 61 6c 6c 65 64  eOne() is called
5a90: 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20 74 72 61   to commit a tra
5aa0: 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79  nsaction, it may
5ab0: 0a 2a 2a 20 20 20 28 6f 72 20 6d 61 79 20 6e 6f  .**   (or may no
5ac0: 74 29 20 73 70 65 63 69 66 79 20 61 20 6d 61 73  t) specify a mas
5ad0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter-journal name
5ae0: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
5af0: 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20 6a 6f  nto the .**   jo
5b00: 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72  urnal file befor
5b10: 65 20 69 74 20 69 73 20 73 79 6e 63 65 64 20 74  e it is synced t
5b20: 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20  o disk..**.**   
5b30: 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  Whether or not a
5b40: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
5b50: 6e 74 61 69 6e 73 20 61 20 6d 61 73 74 65 72 2d  ntains a master-
5b60: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
5b70: 61 66 66 65 63 74 73 20 0a 2a 2a 20 20 20 74 68  affects .**   th
5b80: 65 20 77 61 79 20 69 6e 20 77 68 69 63 68 20 74  e way in which t
5b90: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
5ba0: 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 61 66 74  is finalized aft
5bb0: 65 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  er the transacti
5bc0: 6f 6e 20 69 73 20 0a 2a 2a 20 20 20 63 6f 6d 6d  on is .**   comm
5bd0: 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
5be0: 62 61 63 6b 20 77 68 65 6e 20 72 75 6e 6e 69 6e  back when runnin
5bf0: 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f  g in "journal_mo
5c00: 64 65 3d 50 45 52 53 49 53 54 22 20 6d 6f 64 65  de=PERSIST" mode
5c10: 2e 0a 2a 2a 20 20 20 49 66 20 61 20 6a 6f 75 72  ..**   If a jour
5c20: 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  nal file does no
5c30: 74 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73 74  t contain a mast
5c40: 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er-journal point
5c50: 65 72 2c 20 69 74 20 69 73 0a 2a 2a 20 20 20 66  er, it is.**   f
5c60: 69 6e 61 6c 69 7a 65 64 20 62 79 20 6f 76 65 72  inalized by over
5c70: 77 72 69 74 69 6e 67 20 74 68 65 20 66 69 72 73  writing the firs
5c80: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
5c90: 20 77 69 74 68 20 7a 65 72 6f 65 73 2e 20 49 66   with zeroes. If
5ca0: 0a 2a 2a 20 20 20 69 74 20 64 6f 65 73 20 63 6f  .**   it does co
5cb0: 6e 74 61 69 6e 20 61 20 6d 61 73 74 65 72 2d 6a  ntain a master-j
5cc0: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 74  ournal pointer t
5cd0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
5ce0: 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 0a 2a 2a  is finalized .**
5cf0: 20 20 20 62 79 20 74 72 75 6e 63 61 74 69 6e 67     by truncating
5d00: 20 69 74 20 74 6f 20 7a 65 72 6f 20 62 79 74 65   it to zero byte
5d10: 73 2c 20 6a 75 73 74 20 61 73 20 69 66 20 74 68  s, just as if th
5d20: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 65 72  e connection wer
5d30: 65 20 0a 2a 2a 20 20 20 72 75 6e 6e 69 6e 67 20  e .**   running 
5d40: 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  in "journal_mode
5d50: 3d 74 72 75 6e 63 61 74 65 22 20 6d 6f 64 65 2e  =truncate" mode.
5d60: 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f 75 72 6e 61 6c  .**.**   Journal
5d70: 20 66 69 6c 65 73 20 74 68 61 74 20 63 6f 6e 74   files that cont
5d80: 61 69 6e 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ain master journ
5d90: 61 6c 20 70 6f 69 6e 74 65 72 73 20 63 61 6e 6e  al pointers cann
5da0: 6f 74 20 62 65 20 66 69 6e 61 6c 69 7a 65 64 0a  ot be finalized.
5db0: 2a 2a 20 20 20 73 69 6d 70 6c 79 20 62 79 20 6f  **   simply by o
5dc0: 76 65 72 77 72 69 74 69 6e 67 20 74 68 65 20 66  verwriting the f
5dd0: 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  irst journal-hea
5de0: 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65 73 2c  der with zeroes,
5df0: 20 61 73 20 74 68 65 0a 2a 2a 20 20 20 6d 61 73   as the.**   mas
5e00: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
5e10: 74 65 72 20 63 6f 75 6c 64 20 69 6e 74 65 72 66  ter could interf
5e20: 65 72 65 20 77 69 74 68 20 68 6f 74 2d 6a 6f 75  ere with hot-jou
5e30: 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 66  rnal rollback of
5e40: 20 61 6e 79 0a 2a 2a 20 20 20 73 75 62 73 65 71   any.**   subseq
5e50: 75 65 6e 74 6c 79 20 69 6e 74 65 72 72 75 70 74  uently interrupt
5e60: 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  ed transaction t
5e70: 68 61 74 20 72 65 75 73 65 73 20 74 68 65 20 6a  hat reuses the j
5e80: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a  ournal file..**.
5e90: 2a 2a 20 20 20 54 68 65 20 66 6c 61 67 20 69 73  **   The flag is
5ea0: 20 63 6c 65 61 72 65 64 20 61 73 20 73 6f 6f 6e   cleared as soon
5eb0: 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   as the journal 
5ec0: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5ed0: 64 20 28 65 69 74 68 65 72 0a 2a 2a 20 20 20 62  d (either.**   b
5ee0: 79 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  y PagerCommitPha
5ef0: 73 65 54 77 6f 20 6f 72 20 50 61 67 65 72 52 6f  seTwo or PagerRo
5f00: 6c 6c 62 61 63 6b 29 2e 20 49 66 20 61 6e 20 49  llback). If an I
5f10: 4f 20 65 72 72 6f 72 20 70 72 65 76 65 6e 74 73  O error prevents
5f20: 20 74 68 65 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61   the.**   journa
5f30: 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69 6e  l file from bein
5f40: 67 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 66  g successfully f
5f50: 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20 73 65  inalized, the se
5f60: 74 4d 61 73 74 65 72 20 66 6c 61 67 0a 2a 2a 20  tMaster flag.** 
5f70: 20 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e 79    is cleared any
5f80: 77 61 79 20 28 61 6e 64 20 74 68 65 20 70 61 67  way (and the pag
5f90: 65 72 20 77 69 6c 6c 20 6d 6f 76 65 20 74 6f 20  er will move to 
5fa0: 45 52 52 4f 52 20 73 74 61 74 65 29 2e 0a 2a 2a  ERROR state)..**
5fb0: 0a 2a 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c 0a 2a  .** doNotSpill.*
5fc0: 2a 0a 2a 2a 20 20 20 54 68 69 73 20 76 61 72 69  *.**   This vari
5fd0: 61 62 6c 65 73 20 63 6f 6e 74 72 6f 6c 20 74 68  ables control th
5fe0: 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 63 61  e behavior of ca
5ff0: 63 68 65 2d 73 70 69 6c 6c 73 20 20 28 63 61 6c  che-spills  (cal
6000: 6c 73 20 6d 61 64 65 20 62 79 0a 2a 2a 20 20 20  ls made by.**   
6010: 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c  the pcache modul
6020: 65 20 74 6f 20 74 68 65 20 70 61 67 65 72 53 74  e to the pagerSt
6030: 72 65 73 73 28 29 20 72 6f 75 74 69 6e 65 20 74  ress() routine t
6040: 6f 20 77 72 69 74 65 20 63 61 63 68 65 64 20 64  o write cached d
6050: 61 74 61 0a 2a 2a 20 20 20 74 6f 20 74 68 65 20  ata.**   to the 
6060: 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 6e 20 6f  file-system in o
6070: 72 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 20  rder to free up 
6080: 6d 65 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a 20 20  memory)..**.**  
6090: 20 57 68 65 6e 20 62 69 74 73 20 53 50 49 4c 4c   When bits SPILL
60a0: 46 4c 41 47 5f 4f 46 46 20 6f 72 20 53 50 49 4c  FLAG_OFF or SPIL
60b0: 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 6f  LFLAG_ROLLBACK o
60c0: 66 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 61 72 65  f doNotSpill are
60d0: 20 73 65 74 2c 0a 2a 2a 20 20 20 77 72 69 74 69   set,.**   writi
60e0: 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
60f0: 73 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74 72  se from pagerStr
6100: 65 73 73 28 29 20 69 73 20 64 69 73 61 62 6c 65  ess() is disable
6110: 64 20 61 6c 74 6f 67 65 74 68 65 72 2e 0a 2a 2a  d altogether..**
6120: 20 20 20 54 68 65 20 53 50 49 4c 4c 46 4c 41 47     The SPILLFLAG
6130: 5f 52 4f 4c 4c 42 41 43 4b 20 63 61 73 65 20 69  _ROLLBACK case i
6140: 73 20 64 6f 6e 65 20 69 6e 20 61 20 76 65 72 79  s done in a very
6150: 20 6f 62 73 63 75 72 65 20 63 61 73 65 20 74 68   obscure case th
6160: 61 74 0a 2a 2a 20 20 20 63 6f 6d 65 73 20 75 70  at.**   comes up
6170: 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e   during savepoin
6180: 74 20 72 6f 6c 6c 62 61 63 6b 20 74 68 61 74 20  t rollback that 
6190: 72 65 71 75 69 72 65 73 20 74 68 65 20 70 63 61  requires the pca
61a0: 63 68 65 20 6d 6f 64 75 6c 65 0a 2a 2a 20 20 20  che module.**   
61b0: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  to allocate a ne
61c0: 77 20 70 61 67 65 20 74 6f 20 70 72 65 76 65 6e  w page to preven
61d0: 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  t the journal fi
61e0: 6c 65 20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72  le from being wr
61f0: 69 74 74 65 6e 0a 2a 2a 20 20 20 77 68 69 6c 65  itten.**   while
6200: 20 69 74 20 69 73 20 62 65 69 6e 67 20 74 72 61   it is being tra
6210: 76 65 72 73 65 64 20 62 79 20 63 6f 64 65 20 69  versed by code i
6220: 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  n pager_playback
6230: 28 29 2e 20 20 54 68 65 20 53 50 49 4c 4c 46 4c  ().  The SPILLFL
6240: 41 47 5f 4f 46 46 0a 2a 2a 20 20 20 63 61 73 65  AG_OFF.**   case
6250: 20 69 73 20 61 20 75 73 65 72 20 70 72 65 66 65   is a user prefe
6260: 72 65 6e 63 65 2e 0a 2a 2a 20 0a 2a 2a 20 20 20  rence..** .**   
6270: 49 66 20 74 68 65 20 53 50 49 4c 4c 46 4c 41 47  If the SPILLFLAG
6280: 5f 4e 4f 53 59 4e 43 20 62 69 74 20 69 73 20 73  _NOSYNC bit is s
6290: 65 74 2c 20 77 72 69 74 69 6e 67 20 74 6f 20 74  et, writing to t
62a0: 68 65 20 64 61 74 61 62 61 73 65 20 66 72 6f 6d  he database from
62b0: 0a 2a 2a 20 20 20 70 61 67 65 72 53 74 72 65 73  .**   pagerStres
62c0: 73 28 29 20 69 73 20 70 65 72 6d 69 74 74 65 64  s() is permitted
62d0: 2c 20 62 75 74 20 73 79 6e 63 69 6e 67 20 74 68  , but syncing th
62e0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
62f0: 73 20 6e 6f 74 2e 0a 2a 2a 20 20 20 54 68 69 73  s not..**   This
6300: 20 66 6c 61 67 20 69 73 20 73 65 74 20 62 79 20   flag is set by 
6310: 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
6320: 65 28 29 20 77 68 65 6e 20 74 68 65 20 66 69 6c  e() when the fil
6330: 65 2d 73 79 73 74 65 6d 20 73 65 63 74 6f 72 2d  e-system sector-
6340: 73 69 7a 65 0a 2a 2a 20 20 20 69 73 20 6c 61 72  size.**   is lar
6350: 67 65 72 20 74 68 61 6e 20 74 68 65 20 64 61 74  ger than the dat
6360: 61 62 61 73 65 20 70 61 67 65 2d 73 69 7a 65 20  abase page-size 
6370: 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 76  in order to prev
6380: 65 6e 74 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79  ent a journal sy
6390: 6e 63 0a 2a 2a 20 20 20 66 72 6f 6d 20 68 61 70  nc.**   from hap
63a0: 70 65 6e 69 6e 67 20 69 6e 20 62 65 74 77 65 65  pening in betwee
63b0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e  n the journallin
63c0: 67 20 6f 66 20 74 77 6f 20 70 61 67 65 73 20 6f  g of two pages o
63d0: 6e 20 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f  n the same secto
63e0: 72 2e 20 0a 2a 2a 0a 2a 2a 20 73 75 62 6a 49 6e  r. .**.** subjIn
63f0: 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a 2a 20 20 20 54  Memory.**.**   T
6400: 68 69 73 20 69 73 20 61 20 62 6f 6f 6c 65 61 6e  his is a boolean
6410: 20 76 61 72 69 61 62 6c 65 2e 20 49 66 20 74 72   variable. If tr
6420: 75 65 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71  ue, then any req
6430: 75 69 72 65 64 20 73 75 62 2d 6a 6f 75 72 6e 61  uired sub-journa
6440: 6c 0a 2a 2a 20 20 20 69 73 20 6f 70 65 6e 65 64  l.**   is opened
6450: 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   as an in-memory
6460: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
6470: 66 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e  f false, then in
6480: 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20 73 75 62  -memory.**   sub
6490: 2d 6a 6f 75 72 6e 61 6c 73 20 61 72 65 20 6f 6e  -journals are on
64a0: 6c 79 20 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d  ly used for in-m
64b0: 65 6d 6f 72 79 20 70 61 67 65 72 20 66 69 6c 65  emory pager file
64c0: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20  s..**.**   This 
64d0: 76 61 72 69 61 62 6c 65 20 69 73 20 75 70 64 61  variable is upda
64e0: 74 65 64 20 62 79 20 74 68 65 20 75 70 70 65 72  ted by the upper
64f0: 20 6c 61 79 65 72 20 65 61 63 68 20 74 69 6d 65   layer each time
6500: 20 61 20 6e 65 77 20 0a 2a 2a 20 20 20 77 72 69   a new .**   wri
6510: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
6520: 73 20 6f 70 65 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  s opened..**.** 
6530: 64 62 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69  dbSize, dbOrigSi
6540: 7a 65 2c 20 64 62 46 69 6c 65 53 69 7a 65 0a 2a  ze, dbFileSize.*
6550: 2a 0a 2a 2a 20 20 20 56 61 72 69 61 62 6c 65 20  *.**   Variable 
6560: 64 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  dbSize is set to
6570: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
6580: 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
6590: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
65a0: 49 74 20 69 73 20 76 61 6c 69 64 20 69 6e 20 50  It is valid in P
65b0: 41 47 45 52 5f 52 45 41 44 45 52 20 61 6e 64 20  AGER_READER and 
65c0: 68 69 67 68 65 72 20 73 74 61 74 65 73 20 28 61  higher states (a
65d0: 6c 6c 20 73 74 61 74 65 73 20 65 78 63 65 70 74  ll states except
65e0: 20 66 6f 72 0a 2a 2a 20 20 20 4f 50 45 4e 20 61   for.**   OPEN a
65f0: 6e 64 20 45 52 52 4f 52 29 2e 20 0a 2a 2a 0a 2a  nd ERROR). .**.*
6600: 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 73 65  *   dbSize is se
6610: 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73  t based on the s
6620: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
6630: 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20  ase file, which 
6640: 6d 61 79 20 62 65 20 0a 2a 2a 20 20 20 6c 61 72  may be .**   lar
6650: 67 65 72 20 74 68 61 6e 20 74 68 65 20 73 69 7a  ger than the siz
6660: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
6670: 65 20 28 74 68 65 20 76 61 6c 75 65 20 73 74 6f  e (the value sto
6680: 72 65 64 20 61 74 20 6f 66 66 73 65 74 0a 2a 2a  red at offset.**
6690: 20 20 20 32 38 20 6f 66 20 74 68 65 20 64 61 74     28 of the dat
66a0: 61 62 61 73 65 20 68 65 61 64 65 72 20 62 79 20  abase header by 
66b0: 74 68 65 20 62 74 72 65 65 29 2e 20 49 66 20 74  the btree). If t
66c0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
66d0: 69 6c 65 0a 2a 2a 20 20 20 69 73 20 6e 6f 74 20  ile.**   is not 
66e0: 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69  an integer multi
66f0: 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 2d  ple of the page-
6700: 73 69 7a 65 2c 20 74 68 65 20 76 61 6c 75 65 20  size, the value 
6710: 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 20 20 64  stored in.**   d
6720: 62 53 69 7a 65 20 69 73 20 72 6f 75 6e 64 65 64  bSize is rounded
6730: 20 64 6f 77 6e 20 28 69 2e 65 2e 20 61 20 35 4b   down (i.e. a 5K
6740: 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20 70  B file with 2K p
6750: 61 67 65 2d 73 69 7a 65 20 68 61 73 20 64 62 53  age-size has dbS
6760: 69 7a 65 3d 3d 32 29 2e 0a 2a 2a 20 20 20 45 78  ize==2)..**   Ex
6770: 63 65 70 74 2c 20 61 6e 79 20 66 69 6c 65 20 74  cept, any file t
6780: 68 61 74 20 69 73 20 67 72 65 61 74 65 72 20 74  hat is greater t
6790: 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73  han 0 bytes in s
67a0: 69 7a 65 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ize is considere
67b0: 64 0a 2a 2a 20 20 20 74 6f 20 68 61 76 65 20 61  d.**   to have a
67c0: 74 20 6c 65 61 73 74 20 6f 6e 65 20 70 61 67 65  t least one page
67d0: 2e 20 28 69 2e 65 2e 20 61 20 31 4b 42 20 66 69  . (i.e. a 1KB fi
67e0: 6c 65 20 77 69 74 68 20 32 4b 20 70 61 67 65 2d  le with 2K page-
67f0: 73 69 7a 65 20 6c 65 61 64 73 0a 2a 2a 20 20 20  size leads.**   
6800: 74 6f 20 64 62 53 69 7a 65 3d 3d 31 29 2e 0a 2a  to dbSize==1)..*
6810: 2a 0a 2a 2a 20 20 20 44 75 72 69 6e 67 20 61 20  *.**   During a 
6820: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
6830: 6e 2c 20 69 66 20 70 61 67 65 73 20 77 69 74 68  n, if pages with
6840: 20 70 61 67 65 2d 6e 75 6d 62 65 72 73 20 67 72   page-numbers gr
6850: 65 61 74 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20  eater than.**   
6860: 64 62 53 69 7a 65 20 61 72 65 20 6d 6f 64 69 66  dbSize are modif
6870: 69 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65  ied in the cache
6880: 2c 20 64 62 53 69 7a 65 20 69 73 20 75 70 64 61  , dbSize is upda
6890: 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ted accordingly.
68a0: 0a 2a 2a 20 20 20 53 69 6d 69 6c 61 72 6c 79 2c  .**   Similarly,
68b0: 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
68c0: 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 75 73   is truncated us
68d0: 69 6e 67 20 50 61 67 65 72 54 72 75 6e 63 61 74  ing PagerTruncat
68e0: 65 49 6d 61 67 65 28 29 2c 20 0a 2a 2a 20 20 20  eImage(), .**   
68f0: 64 62 53 69 7a 65 20 69 73 20 75 70 64 61 74 65  dbSize is update
6900: 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 61  d..**.**   Varia
6910: 62 6c 65 73 20 64 62 4f 72 69 67 53 69 7a 65 20  bles dbOrigSize 
6920: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 61  and dbFileSize a
6930: 72 65 20 76 61 6c 69 64 20 69 6e 20 73 74 61 74  re valid in stat
6940: 65 73 20 0a 2a 2a 20 20 20 50 41 47 45 52 5f 57  es .**   PAGER_W
6950: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 61 6e 64  RITER_LOCKED and
6960: 20 68 69 67 68 65 72 2e 20 64 62 4f 72 69 67 53   higher. dbOrigS
6970: 69 7a 65 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ize is a copy of
6980: 20 74 68 65 20 64 62 53 69 7a 65 0a 2a 2a 20 20   the dbSize.**  
6990: 20 76 61 72 69 61 62 6c 65 20 61 74 20 74 68 65   variable at the
69a0: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
69b0: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73  ansaction. It is
69c0: 20 75 73 65 64 20 64 75 72 69 6e 67 20 72 6f 6c   used during rol
69d0: 6c 62 61 63 6b 2c 0a 2a 2a 20 20 20 61 6e 64 20  lback,.**   and 
69e0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
69f0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 70 61 67 65  ther or not page
6a00: 73 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75  s need to be jou
6a10: 72 6e 61 6c 6c 65 64 20 62 65 66 6f 72 65 0a 2a  rnalled before.*
6a20: 2a 20 20 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  *   being modifi
6a30: 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 72 6f  ed..**.**   Thro
6a40: 75 67 68 6f 75 74 20 61 20 77 72 69 74 65 2d 74  ughout a write-t
6a50: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 64 62 46 69  ransaction, dbFi
6a60: 6c 65 53 69 7a 65 20 63 6f 6e 74 61 69 6e 73 20  leSize contains 
6a70: 74 68 65 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 20  the size of.**  
6a80: 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
6a90: 6b 20 69 6e 20 70 61 67 65 73 2e 20 49 74 20 69  k in pages. It i
6aa0: 73 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20  s set to a copy 
6ab0: 6f 66 20 64 62 53 69 7a 65 20 77 68 65 6e 20 74  of dbSize when t
6ac0: 68 65 0a 2a 2a 20 20 20 77 72 69 74 65 2d 74 72  he.**   write-tr
6ad0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 66 69 72  ansaction is fir
6ae0: 73 74 20 6f 70 65 6e 65 64 2c 20 61 6e 64 20 75  st opened, and u
6af0: 70 64 61 74 65 64 20 77 68 65 6e 20 56 46 53 20  pdated when VFS 
6b00: 63 61 6c 6c 73 20 61 72 65 20 6d 61 64 65 0a 2a  calls are made.*
6b10: 2a 20 20 20 74 6f 20 77 72 69 74 65 20 6f 72 20  *   to write or 
6b20: 74 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74  truncate the dat
6b30: 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69  abase file on di
6b40: 73 6b 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65  sk. .**.**   The
6b50: 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 68 65   only reason the
6b60: 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69   dbFileSize vari
6b70: 61 62 6c 65 20 69 73 20 72 65 71 75 69 72 65 64  able is required
6b80: 20 69 73 20 74 6f 20 73 75 70 70 72 65 73 73 20   is to suppress 
6b90: 0a 2a 2a 20 20 20 75 6e 6e 65 63 65 73 73 61 72  .**   unnecessar
6ba0: 79 20 63 61 6c 6c 73 20 74 6f 20 78 54 72 75 6e  y calls to xTrun
6bb0: 63 61 74 65 28 29 20 61 66 74 65 72 20 63 6f 6d  cate() after com
6bc0: 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61  mitting a transa
6bd0: 63 74 69 6f 6e 2e 20 49 66 2c 20 0a 2a 2a 20 20  ction. If, .**  
6be0: 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
6bf0: 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
6c00: 2c 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65  , the dbFileSize
6c10: 20 76 61 72 69 61 62 6c 65 20 69 6e 64 69 63 61   variable indica
6c20: 74 65 73 20 0a 2a 2a 20 20 20 74 68 61 74 20 74  tes .**   that t
6c30: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
6c40: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
6c50: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
6c60: 67 65 20 28 50 61 67 65 72 2e 64 62 53 69 7a 65  ge (Pager.dbSize
6c70: 29 2c 20 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74  ), .**   pager_t
6c80: 72 75 6e 63 61 74 65 28 29 20 69 73 20 63 61 6c  runcate() is cal
6c90: 6c 65 64 2e 20 54 68 65 20 70 61 67 65 72 5f 74  led. The pager_t
6ca0: 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75  runcate() call u
6cb0: 73 65 73 20 78 46 69 6c 65 73 69 7a 65 28 29 0a  ses xFilesize().
6cc0: 2a 2a 20 20 20 74 6f 20 6d 65 61 73 75 72 65 20  **   to measure 
6cd0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
6ce0: 65 20 6f 6e 20 64 69 73 6b 2c 20 61 6e 64 20 74  e on disk, and t
6cf0: 68 65 6e 20 74 72 75 6e 63 61 74 65 73 20 69 74  hen truncates it
6d00: 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a   if required..**
6d10: 20 20 20 64 62 46 69 6c 65 53 69 7a 65 20 69 73     dbFileSize is
6d20: 20 6e 6f 74 20 75 73 65 64 20 77 68 65 6e 20 72   not used when r
6d30: 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74 72  olling back a tr
6d40: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68  ansaction. In th
6d50: 69 73 20 63 61 73 65 0a 2a 2a 20 20 20 70 61 67  is case.**   pag
6d60: 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69 73  er_truncate() is
6d70: 20 63 61 6c 6c 65 64 20 75 6e 63 6f 6e 64 69 74   called uncondit
6d80: 69 6f 6e 61 6c 6c 79 20 28 77 68 69 63 68 20 6d  ionally (which m
6d90: 65 61 6e 73 20 74 68 65 72 65 20 6d 61 79 20 62  eans there may b
6da0: 65 0a 2a 2a 20 20 20 61 20 63 61 6c 6c 20 74 6f  e.**   a call to
6db0: 20 78 46 69 6c 65 73 69 7a 65 28 29 20 74 68 61   xFilesize() tha
6dc0: 74 20 69 73 20 6e 6f 74 20 73 74 72 69 63 74 6c  t is not strictl
6dd0: 79 20 72 65 71 75 69 72 65 64 29 2e 20 49 6e 20  y required). In 
6de0: 65 69 74 68 65 72 20 63 61 73 65 2c 0a 2a 2a 20  either case,.** 
6df0: 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
6e00: 28 29 20 6d 61 79 20 63 61 75 73 65 20 74 68 65  () may cause the
6e10: 20 66 69 6c 65 20 74 6f 20 62 65 63 6f 6d 65 20   file to become 
6e20: 73 6d 61 6c 6c 65 72 20 6f 72 20 6c 61 72 67 65  smaller or large
6e30: 72 2e 0a 2a 2a 0a 2a 2a 20 64 62 48 69 6e 74 53  r..**.** dbHintS
6e40: 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  ize.**.**   The 
6e50: 64 62 48 69 6e 74 53 69 7a 65 20 76 61 72 69 61  dbHintSize varia
6e60: 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6c  ble is used to l
6e70: 69 6d 69 74 20 74 68 65 20 6e 75 6d 62 65 72 20  imit the number 
6e80: 6f 66 20 63 61 6c 6c 73 20 6d 61 64 65 20 74 6f  of calls made to
6e90: 0a 2a 2a 20 20 20 74 68 65 20 56 46 53 20 78 46  .**   the VFS xF
6ea0: 69 6c 65 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c  ileControl(FCNTL
6eb0: 5f 53 49 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68  _SIZE_HINT) meth
6ec0: 6f 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 48  od. .**.**   dbH
6ed0: 69 6e 74 53 69 7a 65 20 69 73 20 73 65 74 20 74  intSize is set t
6ee0: 6f 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  o a copy of the 
6ef0: 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  dbSize variable 
6f00: 77 68 65 6e 20 61 0a 2a 2a 20 20 20 77 72 69 74  when a.**   writ
6f10: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
6f20: 20 6f 70 65 6e 65 64 20 28 61 74 20 74 68 65 20   opened (at the 
6f30: 73 61 6d 65 20 74 69 6d 65 20 61 73 20 64 62 46  same time as dbF
6f40: 69 6c 65 53 69 7a 65 20 61 6e 64 0a 2a 2a 20 20  ileSize and.**  
6f50: 20 64 62 4f 72 69 67 53 69 7a 65 29 2e 20 49 66   dbOrigSize). If
6f60: 20 74 68 65 20 78 46 69 6c 65 43 6f 6e 74 72 6f   the xFileContro
6f70: 6c 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  l(FCNTL_SIZE_HIN
6f80: 54 29 20 6d 65 74 68 6f 64 20 69 73 20 63 61 6c  T) method is cal
6f90: 6c 65 64 2c 0a 2a 2a 20 20 20 64 62 48 69 6e 74  led,.**   dbHint
6fa0: 53 69 7a 65 20 69 73 20 69 6e 63 72 65 61 73 65  Size is increase
6fb0: 64 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  d to the number 
6fc0: 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 63 6f  of pages that co
6fd0: 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 0a  rrespond to the.
6fe0: 2a 2a 20 20 20 73 69 7a 65 2d 68 69 6e 74 20 70  **   size-hint p
6ff0: 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d 65 74  assed to the met
7000: 68 6f 64 20 63 61 6c 6c 2e 20 53 65 65 20 70 61  hod call. See pa
7010: 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
7020: 73 74 28 29 20 66 6f 72 20 0a 2a 2a 20 20 20 64  st() for .**   d
7030: 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 65 72  etails..**.** er
7040: 72 43 6f 64 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  rCode.**.**   Th
7050: 65 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20  e Pager.errCode 
7060: 76 61 72 69 61 62 6c 65 20 69 73 20 6f 6e 6c 79  variable is only
7070: 20 65 76 65 72 20 75 73 65 64 20 69 6e 20 50 41   ever used in PA
7080: 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e  GER_ERROR state.
7090: 20 49 74 0a 2a 2a 20 20 20 69 73 20 73 65 74 20   It.**   is set 
70a0: 74 6f 20 7a 65 72 6f 20 69 6e 20 61 6c 6c 20 6f  to zero in all o
70b0: 74 68 65 72 20 73 74 61 74 65 73 2e 20 49 6e 20  ther states. In 
70c0: 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74  PAGER_ERROR stat
70d0: 65 2c 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  e, Pager.errCode
70e0: 20 0a 2a 2a 20 20 20 69 73 20 61 6c 77 61 79 73   .**   is always
70f0: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 46   set to SQLITE_F
7100: 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  ULL, SQLITE_IOER
7110: 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20  R or one of the 
7120: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58  SQLITE_IOERR_XXX
7130: 20 0a 2a 2a 20 20 20 73 75 62 2d 63 6f 64 65 73   .**   sub-codes
7140: 2e 0a 2a 2a 0a 2a 2a 20 73 79 6e 63 46 6c 61 67  ..**.** syncFlag
7150: 73 2c 20 77 61 6c 53 79 6e 63 46 6c 61 67 73 0a  s, walSyncFlags.
7160: 2a 2a 0a 2a 2a 20 20 20 73 79 6e 63 46 6c 61 67  **.**   syncFlag
7170: 73 20 69 73 20 65 69 74 68 65 72 20 53 51 4c 49  s is either SQLI
7180: 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 28  TE_SYNC_NORMAL (
7190: 30 78 30 32 29 20 6f 72 20 53 51 4c 49 54 45 5f  0x02) or SQLITE_
71a0: 53 59 4e 43 5f 46 55 4c 4c 20 28 30 78 30 33 29  SYNC_FULL (0x03)
71b0: 2e 0a 2a 2a 20 20 20 73 79 6e 63 46 6c 61 67 73  ..**   syncFlags
71c0: 20 69 73 20 75 73 65 64 20 66 6f 72 20 72 6f 6c   is used for rol
71d0: 6c 62 61 63 6b 20 6d 6f 64 65 2e 20 20 77 61 6c  lback mode.  wal
71e0: 53 79 6e 63 46 6c 61 67 73 20 69 73 20 75 73 65  SyncFlags is use
71f0: 64 20 66 6f 72 20 57 41 4c 20 6d 6f 64 65 0a 2a  d for WAL mode.*
7200: 2a 20 20 20 61 6e 64 20 63 6f 6e 74 61 69 6e 73  *   and contains
7210: 20 74 68 65 20 66 6c 61 67 73 20 75 73 65 64 20   the flags used 
7220: 74 6f 20 73 79 6e 63 20 74 68 65 20 63 68 65 63  to sync the chec
7230: 6b 70 6f 69 6e 74 20 6f 70 65 72 61 74 69 6f 6e  kpoint operation
7240: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 6c 6f  s in the.**   lo
7250: 77 65 72 20 74 77 6f 20 62 69 74 73 2c 20 61 6e  wer two bits, an
7260: 64 20 73 79 6e 63 20 66 6c 61 67 73 20 75 73 65  d sync flags use
7270: 64 20 66 6f 72 20 74 72 61 6e 73 61 63 74 69 6f  d for transactio
7280: 6e 20 63 6f 6d 6d 69 74 73 20 69 6e 20 74 68 65  n commits in the
7290: 20 57 41 4c 0a 2a 2a 20 20 20 66 69 6c 65 20 69   WAL.**   file i
72a0: 6e 20 62 69 74 73 20 30 78 30 34 20 61 6e 64 20  n bits 0x04 and 
72b0: 30 78 30 38 2e 20 20 49 6e 20 6f 74 68 65 72 20  0x08.  In other 
72c0: 77 6f 72 64 73 2c 20 74 6f 20 67 65 74 20 74 68  words, to get th
72d0: 65 20 63 6f 72 72 65 63 74 20 73 79 6e 63 20 66  e correct sync f
72e0: 6c 61 67 73 0a 2a 2a 20 20 20 66 6f 72 20 63 68  lags.**   for ch
72f0: 65 63 6b 70 6f 69 6e 74 20 6f 70 65 72 61 74 69  eckpoint operati
7300: 6f 6e 73 2c 20 75 73 65 20 28 77 61 6c 53 79 6e  ons, use (walSyn
7310: 63 46 6c 61 67 73 26 30 78 30 33 29 20 61 6e 64  cFlags&0x03) and
7320: 20 74 6f 20 67 65 74 20 74 68 65 20 63 6f 72 72   to get the corr
7330: 65 63 74 0a 2a 2a 20 20 20 73 79 6e 63 20 66 6c  ect.**   sync fl
7340: 61 67 73 20 66 6f 72 20 74 72 61 6e 73 61 63 74  ags for transact
7350: 69 6f 6e 20 63 6f 6d 6d 69 74 2c 20 75 73 65 20  ion commit, use 
7360: 28 28 77 61 6c 53 79 6e 63 46 6c 61 67 73 3e 3e  ((walSyncFlags>>
7370: 32 29 26 30 78 30 33 29 2e 20 20 4e 6f 74 65 0a  2)&0x03).  Note.
7380: 2a 2a 20 20 20 74 68 61 74 20 77 69 74 68 20 73  **   that with s
7390: 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41  ynchronous=NORMA
73a0: 4c 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2c 20 74  L in WAL mode, t
73b0: 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69  ransaction commi
73c0: 74 20 69 73 20 6e 6f 74 20 73 79 6e 63 65 64 0a  t is not synced.
73d0: 2a 2a 20 20 20 6d 65 61 6e 69 6e 67 20 74 68 61  **   meaning tha
73e0: 74 20 74 68 65 20 30 78 30 34 20 61 6e 64 20 30  t the 0x04 and 0
73f0: 78 30 38 20 62 69 74 73 20 61 72 65 20 62 6f 74  x08 bits are bot
7400: 68 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 72 75 63  h zero..*/.struc
7410: 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69  t Pager {.  sqli
7420: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
7430: 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75          /* OS fu
7440: 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66  nctions to use f
7450: 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78  or IO */.  u8 ex
7460: 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20  clusiveMode;    
7470: 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61         /* Boolea
7480: 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69  n. True if locki
7490: 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49  ng_mode==EXCLUSI
74a0: 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  VE */.  u8 journ
74b0: 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  alMode;         
74c0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
74d0: 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  e PAGER_JOURNALM
74e0: 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a  ODE_* values */.
74f0: 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b    u8 useJournal;
7500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7510: 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20   Use a rollback 
7520: 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20  journal on this 
7530: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53  file */.  u8 noS
7540: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
7550: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
7560: 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
7570: 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38   if true */.  u8
7580: 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20   fullSync;      
7590: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
75a0: 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74  extra syncs of t
75b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  he journal for r
75c0: 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75  obustness */.  u
75d0: 38 20 65 78 74 72 61 53 79 6e 63 3b 20 20 20 20  8 extraSync;    
75e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 79             /* sy
75f0: 6e 63 20 64 69 72 65 63 74 6f 72 79 20 61 66 74  nc directory aft
7600: 65 72 20 6a 6f 75 72 6e 61 6c 20 64 65 6c 65 74  er journal delet
7610: 65 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 46 6c  e */.  u8 syncFl
7620: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
7630: 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41     /* SYNC_NORMA
7640: 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 6f  L or SYNC_FULL o
7650: 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 75 38  therwise */.  u8
7660: 20 77 61 6c 53 79 6e 63 46 6c 61 67 73 3b 20 20   walSyncFlags;  
7670: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 65            /* See
7680: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 61 62 6f   description abo
7690: 76 65 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46  ve */.  u8 tempF
76a0: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
76b0: 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
76c0: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
76d0: 6f 72 20 69 6d 6d 75 74 61 62 6c 65 20 66 69 6c  or immutable fil
76e0: 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 4c 6f 63 6b  e */.  u8 noLock
76f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7700: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 63     /* Do not loc
7710: 6b 20 28 65 78 63 65 70 74 20 69 6e 20 57 41 4c  k (except in WAL
7720: 20 6d 6f 64 65 29 20 2a 2f 0a 20 20 75 38 20 72   mode) */.  u8 r
7730: 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20  eadOnly;        
7740: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7750: 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  for a read-only 
7760: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38  database */.  u8
7770: 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20   memDb;         
7780: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
7790: 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c  e to inhibit all
77a0: 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20   file I/O */..  
77b0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
77c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a 2a  ***********.  **
7800: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
7810: 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68  lock contains th
7820: 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72  ose class member
7830: 73 20 74 68 61 74 20 63 68 61 6e 67 65 20 64 75  s that change du
7840: 72 69 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69 6e  ring.  ** routin
7850: 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 43 6c  e operation.  Cl
7860: 61 73 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20  ass members not 
7870: 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72  in this block ar
7880: 65 20 65 69 74 68 65 72 20 66 69 78 65 64 0a 20  e either fixed. 
7890: 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67   ** when the pag
78a0: 65 72 20 69 73 20 66 69 72 73 74 20 63 72 65 61  er is first crea
78b0: 74 65 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79  ted or else only
78c0: 20 63 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65   change when the
78d0: 72 65 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67  re is a.  ** sig
78e0: 6e 69 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68  nificant mode ch
78f0: 61 6e 67 65 20 28 73 75 63 68 20 61 73 20 63 68  ange (such as ch
7900: 61 6e 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f  anging the page_
7910: 73 69 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  size, locking_mo
7920: 64 65 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20  de,.  ** or the 
7930: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20  journal_mode).  
7940: 46 72 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65  From another vie
7950: 77 2c 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d  w, these class m
7960: 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 0a  embers describe.
7970: 20 20 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22    ** the "state"
7980: 20 6f 66 20 74 68 65 20 70 61 67 65 72 2c 20 77   of the pager, w
7990: 68 69 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73  hile other class
79a0: 20 6d 65 6d 62 65 72 73 20 64 65 73 63 72 69 62   members describ
79b0: 65 20 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66  e the.  ** "conf
79c0: 69 67 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68  iguration" of th
79d0: 65 20 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20  e pager..  */.  
79e0: 75 38 20 65 53 74 61 74 65 3b 20 20 20 20 20 20  u8 eState;      
79f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
7a00: 61 67 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e  ager state (OPEN
7a10: 2c 20 52 45 41 44 45 52 2c 20 57 52 49 54 45 52  , READER, WRITER
7a20: 5f 4c 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20  _LOCKED..) */.  
7a30: 75 38 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20  u8 eLock;       
7a40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
7a50: 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64  urrent lock held
7a60: 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   on database fil
7a70: 65 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65  e */.  u8 change
7a80: 43 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20  CountDone;      
7a90: 20 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20     /* Set after 
7aa0: 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65  incrementing the
7ab0: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
7ac0: 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65  */.  u8 setMaste
7ad0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
7ae0: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d   /* True if a m-
7af0: 6a 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20  j name has been 
7b00: 77 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20  written to jrnl 
7b10: 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69  */.  u8 doNotSpi
7b20: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
7b30: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c   /* Do not spill
7b40: 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20   the cache when 
7b50: 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38  non-zero */.  u8
7b60: 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20   subjInMemory;  
7b70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
7b80: 65 20 74 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f  e to use in-memo
7b90: 72 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20  ry sub-journals 
7ba0: 2a 2f 0a 20 20 75 38 20 62 55 73 65 46 65 74 63  */.  u8 bUseFetc
7bb0: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
7bc0: 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20   /* True to use 
7bd0: 78 46 65 74 63 68 28 29 20 2a 2f 0a 20 20 75 38  xFetch() */.  u8
7be0: 20 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f   hasHeldSharedLo
7bf0: 63 6b 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ck;       /* Tru
7c00: 65 20 69 66 20 61 20 73 68 61 72 65 64 20 6c 6f  e if a shared lo
7c10: 63 6b 20 68 61 73 20 65 76 65 72 20 62 65 65 6e  ck has ever been
7c20: 20 68 65 6c 64 20 2a 2f 0a 20 20 50 67 6e 6f 20   held */.  Pgno 
7c30: 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  dbSize;         
7c40: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
7c50: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
7c60: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50   database */.  P
7c70: 67 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20  gno dbOrigSize; 
7c80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62             /* db
7c90: 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20  Size before the 
7ca0: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
7cb0: 69 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  ion */.  Pgno db
7cc0: 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20  FileSize;       
7cd0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7ce0: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
7cf0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
7d00: 20 20 50 67 6e 6f 20 64 62 48 69 6e 74 53 69 7a    Pgno dbHintSiz
7d10: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
7d20: 20 56 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f   Value passed to
7d30: 20 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54   FCNTL_SIZE_HINT
7d40: 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 65   call */.  int e
7d50: 72 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20  rrCode;         
7d60: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
7d70: 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f   several kinds o
7d80: 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e  f errors */.  in
7d90: 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  t nRec;         
7da0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
7db0: 65 73 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69  es journalled si
7dc0: 6e 63 65 20 6c 61 73 74 20 6a 2d 68 65 61 64 65  nce last j-heade
7dd0: 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75  r written */.  u
7de0: 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20  32 cksumInit;   
7df0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75             /* Qu
7e00: 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65  asi-random value
7e10: 20 61 64 64 65 64 20 74 6f 20 65 76 65 72 79 20   added to every 
7e20: 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33  checksum */.  u3
7e30: 32 20 6e 53 75 62 52 65 63 3b 20 20 20 20 20 20  2 nSubRec;      
7e40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7e50: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 77  ber of records w
7e60: 72 69 74 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f  ritten to sub-jo
7e70: 75 72 6e 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65  urnal */.  Bitve
7e80: 63 20 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20  c *pInJournal;  
7e90: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69         /* One bi
7ea0: 74 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  t for each page 
7eb0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
7ec0: 66 69 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  file */.  sqlite
7ed0: 33 5f 66 69 6c 65 20 2a 66 64 3b 20 20 20 20 20  3_file *fd;     
7ee0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
7ef0: 73 63 72 69 70 74 6f 72 20 66 6f 72 20 64 61 74  scriptor for dat
7f00: 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74  abase */.  sqlit
7f10: 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20  e3_file *jfd;   
7f20: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
7f30: 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 6d 61  escriptor for ma
7f40: 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  in journal */.  
7f50: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a  sqlite3_file *sj
7f60: 66 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46  fd;         /* F
7f70: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
7f80: 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a  or sub-journal *
7f90: 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f  /.  i64 journalO
7fa0: 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
7fb0: 2f 2a 20 43 75 72 72 65 6e 74 20 77 72 69 74 65  /* Current write
7fc0: 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a   offset in the j
7fd0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
7fe0: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b   i64 journalHdr;
7ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8000: 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70  Byte offset to p
8010: 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20  revious journal 
8020: 68 65 61 64 65 72 20 2a 2f 0a 20 20 73 71 6c 69  header */.  sqli
8030: 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63  te3_backup *pBac
8040: 6b 75 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74  kup;    /* Point
8050: 65 72 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e  er to list of on
8060: 67 6f 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f  going backup pro
8070: 63 65 73 73 65 73 20 2a 2f 0a 20 20 50 61 67 65  cesses */.  Page
8080: 72 53 61 76 65 70 6f 69 6e 74 20 2a 61 53 61 76  rSavepoint *aSav
8090: 65 70 6f 69 6e 74 3b 20 2f 2a 20 41 72 72 61 79  epoint; /* Array
80a0: 20 6f 66 20 61 63 74 69 76 65 20 73 61 76 65 70   of active savep
80b0: 6f 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  oints */.  int n
80c0: 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20  Savepoint;      
80d0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
80e0: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
80f0: 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a  aSavepoint[] */.
8100: 20 20 75 33 32 20 69 44 61 74 61 56 65 72 73 69    u32 iDataVersi
8110: 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  on;           /*
8120: 20 43 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65   Changes wheneve
8130: 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65  r database conte
8140: 6e 74 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20  nt changes */.  
8150: 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b  char dbFileVers[
8160: 31 36 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43  16];        /* C
8170: 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20  hanges whenever 
8180: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68  database file ch
8190: 61 6e 67 65 73 20 2a 2f 0a 0a 20 20 69 6e 74 20  anges */..  int 
81a0: 6e 4d 6d 61 70 4f 75 74 3b 20 20 20 20 20 20 20  nMmapOut;       
81b0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
81c0: 72 20 6f 66 20 6d 6d 61 70 20 70 61 67 65 73 20  r of mmap pages 
81d0: 63 75 72 72 65 6e 74 6c 79 20 6f 75 74 73 74 61  currently outsta
81e0: 6e 64 69 6e 67 20 2a 2f 0a 20 20 73 71 6c 69 74  nding */.  sqlit
81f0: 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 3b  e3_int64 szMmap;
8200: 20 20 20 20 20 20 20 2f 2a 20 44 65 73 69 72 65         /* Desire
8210: 64 20 6d 61 78 69 6d 75 6d 20 6d 6d 61 70 20 73  d maximum mmap s
8220: 69 7a 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ize */.  PgHdr *
8230: 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 20 20  pMmapFreelist;  
8240: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
8250: 66 72 65 65 20 6d 6d 61 70 20 70 61 67 65 20 68  free mmap page h
8260: 65 61 64 65 72 73 20 28 70 44 69 72 74 79 29 20  eaders (pDirty) 
8270: 2a 2f 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 6e 64  */.  /*.  ** End
8280: 20 6f 66 20 74 68 65 20 72 6f 75 74 69 6e 65 6c   of the routinel
8290: 79 2d 63 68 61 6e 67 69 6e 67 20 63 6c 61 73 73  y-changing class
82a0: 20 6d 65 6d 62 65 72 73 0a 20 20 2a 2a 2a 2a 2a   members.  *****
82b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82f0: 2a 2a 2a 2a 2a 2a 2f 0a 0a 20 20 75 31 36 20 6e  ******/..  u16 n
8300: 45 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20  Extra;          
8310: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
8320: 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f  is many bytes to
8330: 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   each in-memory 
8340: 70 61 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52  page */.  i16 nR
8350: 65 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20  eserve;         
8360: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
8370: 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20  of unused bytes 
8380: 61 74 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70  at end of each p
8390: 61 67 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73  age */.  u32 vfs
83a0: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
83b0: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f       /* Flags fo
83c0: 72 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f  r sqlite3_vfs.xO
83d0: 70 65 6e 28 29 20 2a 2f 0a 20 20 75 33 32 20 73  pen() */.  u32 s
83e0: 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20  ectorSize;      
83f0: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65         /* Assume
8400: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75  d sector size du
8410: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  ring rollback */
8420: 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b  .  int pageSize;
8430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8440: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
8450: 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20  s in a page */. 
8460: 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20   Pgno mxPgno;   
8470: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8480: 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20  Maximum allowed 
8490: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
84a0: 62 61 73 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  base */.  i64 jo
84b0: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20  urnalSizeLimit; 
84c0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69        /* Size li
84d0: 6d 69 74 20 66 6f 72 20 70 65 72 73 69 73 74 65  mit for persiste
84e0: 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  nt journal files
84f0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c   */.  char *zFil
8500: 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
8510: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
8520: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
8530: 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e  /.  char *zJourn
8540: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
8550: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a  /* Name of the j
8560: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
8570: 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64   int (*xBusyHand
8580: 6c 65 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20  ler)(void*); /* 
8590: 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c  Function to call
85a0: 20 77 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20   when busy */.  
85b0: 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c  void *pBusyHandl
85c0: 65 72 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43  erArg;      /* C
85d0: 6f 6e 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20  ontext argument 
85e0: 66 6f 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72  for xBusyHandler
85f0: 20 2a 2f 0a 20 20 69 6e 74 20 61 53 74 61 74 5b   */.  int aStat[
8600: 34 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  4];             
8610: 20 20 2f 2a 20 54 6f 74 61 6c 20 63 61 63 68 65    /* Total cache
8620: 20 68 69 74 73 2c 20 6d 69 73 73 65 73 2c 20 77   hits, misses, w
8630: 72 69 74 65 73 2c 20 73 70 69 6c 6c 73 20 2a 2f  rites, spills */
8640: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
8650: 45 53 54 0a 20 20 69 6e 74 20 6e 52 65 61 64 3b  EST.  int nRead;
8660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8670: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 70 61    /* Database pa
8680: 67 65 73 20 72 65 61 64 20 2a 2f 0a 23 65 6e 64  ges read */.#end
8690: 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69  if.  void (*xRei
86a0: 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a 29 3b  niter)(DbPage*);
86b0: 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f   /* Call this ro
86c0: 75 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61  utine when reloa
86d0: 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20 20  ding pages */.  
86e0: 69 6e 74 20 28 2a 78 47 65 74 29 28 50 61 67 65  int (*xGet)(Page
86f0: 72 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65 2a 2a  r*,Pgno,DbPage**
8700: 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e  ,int); /* Routin
8710: 65 20 74 6f 20 66 65 74 63 68 20 61 20 70 61 74  e to fetch a pat
8720: 63 68 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ch */.#ifdef SQL
8730: 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
8740: 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28  void *(*xCodec)(
8750: 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f  void*,void*,Pgno
8760: 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e  ,int); /* Routin
8770: 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e  e for en/decodin
8780: 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64  g data */.  void
8790: 20 28 2a 78 43 6f 64 65 63 53 69 7a 65 43 68 6e   (*xCodecSizeChn
87a0: 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e 74  g)(void*,int,int
87b0: 29 3b 20 2f 2a 20 4e 6f 74 69 66 79 20 6f 66 20  ); /* Notify of 
87c0: 70 61 67 65 20 73 69 7a 65 20 63 68 61 6e 67 65  page size change
87d0: 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43  s */.  void (*xC
87e0: 6f 64 65 63 46 72 65 65 29 28 76 6f 69 64 2a 29  odecFree)(void*)
87f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
8800: 20 44 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20   Destructor for 
8810: 74 68 65 20 63 6f 64 65 63 20 2a 2f 0a 20 20 76  the codec */.  v
8820: 6f 69 64 20 2a 70 43 6f 64 65 63 3b 20 20 20 20  oid *pCodec;    
8830: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
8840: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
8850: 78 43 6f 64 65 63 2e 2e 2e 20 6d 65 74 68 6f 64  xCodec... method
8860: 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68  s */.#endif.  ch
8870: 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b 20 20  ar *pTmpSpace;  
8880: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
8890: 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79 74 65  er.pageSize byte
88a0: 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20 74  s of space for t
88b0: 6d 70 20 75 73 65 20 2a 2f 0a 20 20 50 43 61 63  mp use */.  PCac
88c0: 68 65 20 2a 70 50 43 61 63 68 65 3b 20 20 20 20  he *pPCache;    
88d0: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
88e0: 65 72 20 74 6f 20 70 61 67 65 20 63 61 63 68 65  er to page cache
88f0: 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 69 66 6e 64   object */.#ifnd
8900: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
8910: 41 4c 0a 20 20 57 61 6c 20 2a 70 57 61 6c 3b 20  AL.  Wal *pWal; 
8920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8930: 20 2f 2a 20 57 72 69 74 65 2d 61 68 65 61 64 20   /* Write-ahead 
8940: 6c 6f 67 20 75 73 65 64 20 62 79 20 22 6a 6f 75  log used by "jou
8950: 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 22 20 2a  rnal_mode=wal" *
8960: 2f 0a 20 20 63 68 61 72 20 2a 7a 57 61 6c 3b 20  /.  char *zWal; 
8970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8980: 2f 2a 20 46 69 6c 65 20 6e 61 6d 65 20 66 6f 72  /* File name for
8990: 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67   write-ahead log
89a0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
89b0: 2a 0a 2a 2a 20 49 6e 64 65 78 65 73 20 66 6f 72  *.** Indexes for
89c0: 20 75 73 65 20 77 69 74 68 20 50 61 67 65 72 2e   use with Pager.
89d0: 61 53 74 61 74 5b 5d 2e 20 54 68 65 20 50 61 67  aStat[]. The Pag
89e0: 65 72 2e 61 53 74 61 74 5b 5d 20 61 72 72 61 79  er.aStat[] array
89f0: 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65   contains.** the
8a00: 20 76 61 6c 75 65 73 20 61 63 63 65 73 73 65 64   values accessed
8a10: 20 62 79 20 70 61 73 73 69 6e 67 20 53 51 4c 49   by passing SQLI
8a20: 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48  TE_DBSTATUS_CACH
8a30: 45 5f 48 49 54 2c 20 43 41 43 48 45 5f 4d 49 53  E_HIT, CACHE_MIS
8a40: 53 20 0a 2a 2a 20 6f 72 20 43 41 43 48 45 5f 57  S .** or CACHE_W
8a50: 52 49 54 45 20 74 6f 20 73 71 6c 69 74 65 33 5f  RITE to sqlite3_
8a60: 64 62 5f 73 74 61 74 75 73 28 29 2e 0a 2a 2f 0a  db_status()..*/.
8a70: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 54  #define PAGER_ST
8a80: 41 54 5f 48 49 54 20 20 20 30 0a 23 64 65 66 69  AT_HIT   0.#defi
8a90: 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f 4d 49  ne PAGER_STAT_MI
8aa0: 53 53 20 20 31 0a 23 64 65 66 69 6e 65 20 50 41  SS  1.#define PA
8ab0: 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45 20 32  GER_STAT_WRITE 2
8ac0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53  .#define PAGER_S
8ad0: 54 41 54 5f 53 50 49 4c 4c 20 33 0a 0a 2f 2a 0a  TAT_SPILL 3../*.
8ae0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
8af0: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
8b00: 73 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20  s hold counters 
8b10: 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
8b20: 69 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c  ing purposes onl
8b30: 79 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62  y.  These variab
8b40: 6c 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74  les do not exist
8b50: 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73   in.** a non-tes
8b60: 74 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65  ting build.  The
8b70: 73 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  se variables are
8b80: 20 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65   not thread-safe
8b90: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
8ba0: 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
8bb0: 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62  te3_pager_readdb
8bc0: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f  _count = 0;    /
8bd0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c  * Number of full
8be0: 20 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d   pages read from
8bf0: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
8c00: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62  e3_pager_writedb
8c10: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a  _count = 0;   /*
8c20: 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20   Number of full 
8c30: 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f  pages written to
8c40: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
8c50: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f  e3_pager_writej_
8c60: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
8c70: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
8c80: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72   written to jour
8c90: 6e 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  nal */.# define 
8ca0: 50 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76  PAGER_INCR(v)  v
8cb0: 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ++.#else.# defin
8cc0: 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a  e PAGER_INCR(v).
8cd0: 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20  #endif..../*.** 
8ce0: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65  Journal files be
8cf0: 67 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c  gin with the fol
8d00: 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72  lowing magic str
8d10: 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a  ing.  The data.*
8d20: 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66  * was obtained f
8d30: 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e  rom /dev/random.
8d40: 20 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c    It is used onl
8d50: 79 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68  y as a sanity ch
8d60: 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65  eck..**.** Since
8d70: 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20   version 2.8.0, 
8d80: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  the journal form
8d90: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69  at contains addi
8da0: 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a  tional sanity.**
8db0: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
8dc0: 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70  ation.  If the p
8dd0: 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65  ower fails while
8de0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
8df0: 62 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e  being.** written
8e00: 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61  , semi-random ga
8e10: 72 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74  rbage data might
8e20: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a   appear in the j
8e30: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61  ournal.** file a
8e40: 66 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65  fter power is re
8e50: 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61  stored.  If an a
8e60: 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d  ttempt is then m
8e70: 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74  ade.** to roll t
8e80: 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c  he journal back,
8e90: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
8ea0: 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64  uld be corrupted
8eb0: 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61  .  The additiona
8ec0: 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63  l.** sanity chec
8ed0: 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20  king data is an 
8ee0: 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f  attempt to disco
8ef0: 76 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20  ver the garbage 
8f00: 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  in the.** journa
8f10: 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e  l and ignore it.
8f20: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74  .**.** The sanit
8f30: 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72  y checking infor
8f40: 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e  mation for the n
8f50: 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  ew journal forma
8f60: 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66  t consists.** of
8f70: 20 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73   a 32-bit checks
8f80: 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  um on each page 
8f90: 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68  of data.  The ch
8fa0: 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f  ecksum covers bo
8fb0: 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e  th.** the page n
8fc0: 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50  umber and the pP
8fd0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
8fe0: 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72  ytes of data for
8ff0: 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68   the page..** Th
9000: 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74  is cksum is init
9010: 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d  ialized to a 32-
9020: 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65  bit random value
9030: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e   that appears in
9040: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
9050: 66 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72  file right after
9060: 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68   the header.  Th
9070: 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  e random initial
9080: 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e  izer is importan
9090: 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61  t,.** because ga
90a0: 72 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20  rbage data that 
90b0: 61 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65  appears at the e
90c0: 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  nd of a journal 
90d0: 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74  is likely.** dat
90e0: 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20  a that was once 
90f0: 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74  in other files t
9100: 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65  hat have now bee
9110: 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74  n deleted.  If t
9120: 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61  he.** garbage da
9130: 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20  ta came from an 
9140: 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c  obsolete journal
9150: 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b   file, the check
9160: 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65  sums might.** be
9170: 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62   correct.  But b
9180: 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  y initializing t
9190: 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72  he checksum to r
91a0: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63  andom value whic
91b0: 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e  h.** is differen
91c0: 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72  t for every jour
91d0: 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65  nal, we minimize
91e0: 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73   that risk..*/.s
91f0: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
9200: 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e  gned char aJourn
9210: 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20  alMagic[] = {.  
9220: 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35  0xd9, 0xd5, 0x05
9230: 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78  , 0xf9, 0x20, 0x
9240: 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a  a1, 0x63, 0xd7,.
9250: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69  };../*.** The si
9260: 7a 65 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63  ze of the of eac
9270: 68 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e  h page record in
9280: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
9290: 67 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20  given by.** the 
92a0: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e  following macro.
92b0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52  .*/.#define JOUR
92c0: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
92d0: 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67  )  ((pPager->pag
92e0: 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a  eSize) + 8)../*.
92f0: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** The journal h
9300: 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74  eader size for t
9310: 68 69 73 20 70 61 67 65 72 2e 20 54 68 69 73 20  his pager. This 
9320: 69 73 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73  is usually the s
9330: 61 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20  ame .** size as 
9340: 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65  a single disk se
9350: 63 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73  ctor. See also s
9360: 65 74 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a  etSectorSize()..
9370: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
9380: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
9390: 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ) (pPager->secto
93a0: 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  rSize)../*.** Th
93b0: 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73  e macro MEMDB is
93c0: 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20   true if we are 
93d0: 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20  dealing with an 
93e0: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
93f0: 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69  se..** We do thi
9400: 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20  s as a macro so 
9410: 74 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49  that if the SQLI
9420: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
9430: 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a   macro is set,.*
9440: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d  * the value of M
9450: 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63  EMDB will be a c
9460: 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20  onstant and the 
9470: 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70  compiler will op
9480: 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f  timize.** out co
9490: 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65  de that would ne
94a0: 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a  ver execute..*/.
94b0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
94c0: 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65  IT_MEMORYDB.# de
94d0: 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c  fine MEMDB 0.#el
94e0: 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44  se.# define MEMD
94f0: 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a  B pPager->memDb.
9500: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
9510: 65 20 6d 61 63 72 6f 20 55 53 45 46 45 54 43 48  e macro USEFETCH
9520: 20 69 73 20 74 72 75 65 20 69 66 20 77 65 20 61   is true if we a
9530: 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 75 73  re allowed to us
9540: 65 20 74 68 65 20 78 46 65 74 63 68 20 61 6e 64  e the xFetch and
9550: 20 78 55 6e 66 65 74 63 68 0a 2a 2a 20 69 6e 74   xUnfetch.** int
9560: 65 72 66 61 63 65 73 20 74 6f 20 61 63 63 65 73  erfaces to acces
9570: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 75  s the database u
9580: 73 69 6e 67 20 6d 65 6d 6f 72 79 2d 6d 61 70 70  sing memory-mapp
9590: 65 64 20 49 2f 4f 2e 0a 2a 2f 0a 23 69 66 20 53  ed I/O..*/.#if S
95a0: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
95b0: 49 5a 45 3e 30 0a 23 20 64 65 66 69 6e 65 20 55  IZE>0.# define U
95c0: 53 45 46 45 54 43 48 28 78 29 20 28 28 78 29 2d  SEFETCH(x) ((x)-
95d0: 3e 62 55 73 65 46 65 74 63 68 29 0a 23 65 6c 73  >bUseFetch).#els
95e0: 65 0a 23 20 64 65 66 69 6e 65 20 55 53 45 46 45  e.# define USEFE
95f0: 54 43 48 28 78 29 20 30 0a 23 65 6e 64 69 66 0a  TCH(x) 0.#endif.
9600: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  ./*.** The maxim
9610: 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75  um legal page nu
9620: 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20  mber is (2^31 - 
9630: 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  1)..*/.#define P
9640: 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31  AGER_MAX_PGNO 21
9650: 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20  47483647../*.** 
9660: 54 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  The argument to 
9670: 74 68 69 73 20 6d 61 63 72 6f 20 69 73 20 61 20  this macro is a 
9680: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
9690: 28 74 79 70 65 20 73 71 6c 69 74 65 33 5f 66 69  (type sqlite3_fi
96a0: 6c 65 2a 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  le*)..** Return 
96b0: 30 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 6f  0 if it is not o
96c0: 70 65 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f  pen, or non-zero
96d0: 20 28 62 75 74 20 6e 6f 74 20 31 29 20 69 66 20   (but not 1) if 
96e0: 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  it is..**.** Thi
96f0: 73 20 69 73 20 73 6f 20 74 68 61 74 20 65 78 70  s is so that exp
9700: 72 65 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20  ressions can be 
9710: 77 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a  written as:.**.*
9720: 2a 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70  *   if( isOpen(p
9730: 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 20 2e  Pager->jfd) ){ .
9740: 2e 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61 64  ...**.** instead
9750: 20 6f 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20   of.**.**   if( 
9760: 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65  pPager->jfd->pMe
9770: 74 68 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a  thods ){ ....*/.
9780: 23 64 65 66 69 6e 65 20 69 73 4f 70 65 6e 28 70  #define isOpen(p
9790: 46 64 29 20 28 28 70 46 64 29 2d 3e 70 4d 65 74  Fd) ((pFd)->pMet
97a0: 68 6f 64 73 21 3d 30 29 0a 0a 23 69 66 64 65 66  hods!=0)..#ifdef
97b0: 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f   SQLITE_DIRECT_O
97c0: 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 2f 2a 0a  VERFLOW_READ./*.
97d0: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
97e0: 66 20 70 61 67 65 20 70 67 6e 6f 20 63 61 6e 20  f page pgno can 
97f0: 62 65 20 72 65 61 64 20 64 69 72 65 63 74 6c 79  be read directly
9800: 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
9810: 73 65 20 66 69 6c 65 0a 2a 2a 20 62 79 20 74 68  se file.** by th
9820: 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72 2e 20  e b-tree layer. 
9830: 54 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  This is the case
9840: 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74   if:.**.**   * t
9850: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
9860: 20 69 73 20 6f 70 65 6e 2c 0a 2a 2a 20 20 20 2a   is open,.**   *
9870: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 64 69   there are no di
9880: 72 74 79 20 70 61 67 65 73 20 69 6e 20 74 68 65  rty pages in the
9890: 20 63 61 63 68 65 2c 20 61 6e 64 0a 2a 2a 20 20   cache, and.**  
98a0: 20 2a 20 74 68 65 20 64 65 73 69 72 65 64 20 70   * the desired p
98b0: 61 67 65 20 69 73 20 6e 6f 74 20 63 75 72 72 65  age is not curre
98c0: 6e 74 6c 79 20 69 6e 20 74 68 65 20 77 61 6c 20  ntly in the wal 
98d0: 66 69 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  file..*/.int sql
98e0: 69 74 65 33 50 61 67 65 72 44 69 72 65 63 74 52  ite3PagerDirectR
98f0: 65 61 64 4f 6b 28 50 61 67 65 72 20 2a 70 50 61  eadOk(Pager *pPa
9900: 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
9910: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66  .  if( pPager->f
9920: 64 2d 3e 70 4d 65 74 68 6f 64 73 3d 3d 30 20 29  d->pMethods==0 )
9930: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
9940: 20 73 71 6c 69 74 65 33 50 43 61 63 68 65 49 73   sqlite3PCacheIs
9950: 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50  Dirty(pPager->pP
9960: 43 61 63 68 65 29 20 29 20 72 65 74 75 72 6e 20  Cache) ) return 
9970: 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
9980: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 69 66 28  E_OMIT_WAL.  if(
9990: 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 29 7b   pPager->pWal ){
99a0: 0a 20 20 20 20 75 33 32 20 69 52 65 61 64 20 3d  .    u32 iRead =
99b0: 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   0;.    int rc;.
99c0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
99d0: 57 61 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61  WalFindFrame(pPa
99e0: 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c  ger->pWal, pgno,
99f0: 20 26 69 52 65 61 64 29 3b 0a 20 20 20 20 72 65   &iRead);.    re
9a00: 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45  turn (rc==SQLITE
9a10: 5f 4f 4b 20 26 26 20 69 52 65 61 64 3d 3d 30 29  _OK && iRead==0)
9a20: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
9a30: 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
9a40: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
9a50: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 23 20 64 65 66  E_OMIT_WAL.# def
9a60: 69 6e 65 20 70 61 67 65 72 55 73 65 57 61 6c 28  ine pagerUseWal(
9a70: 78 29 20 28 28 78 29 2d 3e 70 57 61 6c 21 3d 30  x) ((x)->pWal!=0
9a80: 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ).#else.# define
9a90: 20 70 61 67 65 72 55 73 65 57 61 6c 28 78 29 20   pagerUseWal(x) 
9aa0: 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  0.# define pager
9ab0: 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 78 29 20 30  RollbackWal(x) 0
9ac0: 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 57  .# define pagerW
9ad0: 61 6c 46 72 61 6d 65 73 28 76 2c 77 2c 78 2c 79  alFrames(v,w,x,y
9ae0: 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67  ) 0.# define pag
9af0: 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65  erOpenWalIfPrese
9b00: 6e 74 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  nt(z) SQLITE_OK.
9b10: 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 42 65  # define pagerBe
9b20: 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69  ginReadTransacti
9b30: 6f 6e 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  on(z) SQLITE_OK.
9b40: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
9b50: 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 55 73  NDEBUG ./*.** Us
9b60: 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73  age:.**.**   ass
9b70: 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
9b80: 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
9b90: 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  );.**.** This fu
9ba0: 6e 63 74 69 6f 6e 20 72 75 6e 73 20 6d 61 6e 79  nction runs many
9bb0: 20 61 73 73 65 72 74 73 20 74 6f 20 74 72 79 20   asserts to try 
9bc0: 74 6f 20 66 69 6e 64 20 69 6e 63 6f 6e 73 69 73  to find inconsis
9bd0: 74 65 6e 63 69 65 73 20 69 6e 0a 2a 2a 20 74 68  tencies in.** th
9be0: 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65  e internal state
9bf0: 20 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f 62   of the Pager ob
9c00: 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ject..*/.static 
9c10: 69 6e 74 20 61 73 73 65 72 74 5f 70 61 67 65 72  int assert_pager
9c20: 5f 73 74 61 74 65 28 50 61 67 65 72 20 2a 70 29  _state(Pager *p)
9c30: 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
9c40: 72 20 3d 20 70 3b 0a 0a 20 20 2f 2a 20 53 74 61  r = p;..  /* Sta
9c50: 74 65 20 6d 75 73 74 20 62 65 20 76 61 6c 69 64  te must be valid
9c60: 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
9c70: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
9c80: 4f 50 45 4e 0a 20 20 20 20 20 20 20 7c 7c 20 70  OPEN.       || p
9c90: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
9ca0: 52 45 41 44 45 52 0a 20 20 20 20 20 20 20 7c 7c  READER.       ||
9cb0: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
9cc0: 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a  R_WRITER_LOCKED.
9cd0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74         || p->eSt
9ce0: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
9cf0: 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20  R_CACHEMOD.     
9d00: 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d    || p->eState==
9d10: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
9d20: 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e  OD.       || p->
9d30: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
9d40: 49 54 45 52 5f 46 49 4e 49 53 48 45 44 0a 20 20  ITER_FINISHED.  
9d50: 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74       || p->eStat
9d60: 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 0a 20  e==PAGER_ERROR. 
9d70: 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 67 61 72 64   );..  /* Regard
9d80: 6c 65 73 73 20 6f 66 20 74 68 65 20 63 75 72 72  less of the curr
9d90: 65 6e 74 20 73 74 61 74 65 2c 20 61 20 74 65 6d  ent state, a tem
9da0: 70 2d 66 69 6c 65 20 63 6f 6e 6e 65 63 74 69 6f  p-file connectio
9db0: 6e 20 61 6c 77 61 79 73 20 62 65 68 61 76 65 73  n always behaves
9dc0: 0a 20 20 2a 2a 20 61 73 20 69 66 20 69 74 20 68  .  ** as if it h
9dd0: 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  as an exclusive 
9de0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
9df0: 62 61 73 65 20 66 69 6c 65 2e 20 49 74 20 6e 65  base file. It ne
9e00: 76 65 72 20 75 70 64 61 74 65 73 0a 20 20 2a 2a  ver updates.  **
9e10: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
9e20: 74 65 72 20 66 69 65 6c 64 2c 20 73 6f 20 74 68  ter field, so th
9e30: 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  e changeCountDon
9e40: 65 20 66 6c 61 67 20 69 73 20 61 6c 77 61 79 73  e flag is always
9e50: 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   set..  */.  ass
9e60: 65 72 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65  ert( p->tempFile
9e70: 3d 3d 30 20 7c 7c 20 70 2d 3e 65 4c 6f 63 6b 3d  ==0 || p->eLock=
9e80: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
9e90: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
9ea0: 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70  tempFile==0 || p
9eb0: 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
9ec0: 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20 20 2f 2a 20  ntDone );..  /* 
9ed0: 49 66 20 74 68 65 20 75 73 65 4a 6f 75 72 6e 61  If the useJourna
9ee0: 6c 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 2c  l flag is clear,
9ef0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64   the journal-mod
9f00: 65 20 6d 75 73 74 20 62 65 20 22 4f 46 46 22 2e  e must be "OFF".
9f10: 20 0a 20 20 2a 2a 20 41 6e 64 20 69 66 20 74 68   .  ** And if th
9f20: 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 69  e journal-mode i
9f30: 73 20 22 4f 46 46 22 2c 20 74 68 65 20 6a 6f 75  s "OFF", the jou
9f40: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 6e  rnal file must n
9f50: 6f 74 20 62 65 20 6f 70 65 6e 2e 0a 20 20 2a 2f  ot be open..  */
9f60: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f  .  assert( p->jo
9f70: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
9f80: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
9f90: 20 7c 7c 20 70 2d 3e 75 73 65 4a 6f 75 72 6e 61   || p->useJourna
9fa0: 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
9fb0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
9fc0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
9fd0: 5f 4f 46 46 20 7c 7c 20 21 69 73 4f 70 65 6e 28  _OFF || !isOpen(
9fe0: 70 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a  p->jfd) );..  /*
9ff0: 20 43 68 65 63 6b 20 74 68 61 74 20 4d 45 4d 44   Check that MEMD
a000: 42 20 69 6d 70 6c 69 65 73 20 6e 6f 53 79 6e 63  B implies noSync
a010: 2e 20 41 6e 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f  . And an in-memo
a020: 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 53 69 6e 63  ry journal. Sinc
a030: 65 20 0a 20 20 2a 2a 20 74 68 69 73 20 6d 65 61  e .  ** this mea
a040: 6e 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  ns an in-memory 
a050: 70 61 67 65 72 20 70 65 72 66 6f 72 6d 73 20 6e  pager performs n
a060: 6f 20 49 4f 20 61 74 20 61 6c 6c 2c 20 69 74 20  o IO at all, it 
a070: 63 61 6e 6e 6f 74 20 65 6e 63 6f 75 6e 74 65 72  cannot encounter
a080: 20 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 53 51   .  ** either SQ
a090: 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 53 51  LITE_IOERR or SQ
a0a0: 4c 49 54 45 5f 46 55 4c 4c 20 64 75 72 69 6e 67  LITE_FULL during
a0b0: 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 77 68 69   rollback or whi
a0c0: 6c 65 20 66 69 6e 61 6c 69 7a 69 6e 67 20 0a 20  le finalizing . 
a0d0: 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   ** a journal fi
a0e0: 6c 65 2e 20 28 61 6c 74 68 6f 75 67 68 20 74 68  le. (although th
a0f0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72  e in-memory jour
a100: 6e 61 6c 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  nal implementati
a110: 6f 6e 20 6d 61 79 20 0a 20 20 2a 2a 20 72 65 74  on may .  ** ret
a120: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
a130: 5f 4e 4f 4d 45 4d 20 77 68 69 6c 65 20 74 68 65  _NOMEM while the
a140: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
a150: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 29 2e   being written).
a160: 20 49 74 20 0a 20 20 2a 2a 20 69 73 20 74 68 65   It .  ** is the
a170: 72 65 66 6f 72 65 20 6e 6f 74 20 70 6f 73 73 69  refore not possi
a180: 62 6c 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65  ble for an in-me
a190: 6d 6f 72 79 20 70 61 67 65 72 20 74 6f 20 65 6e  mory pager to en
a1a0: 74 65 72 20 74 68 65 20 45 52 52 4f 52 20 0a 20  ter the ERROR . 
a1b0: 20 2a 2a 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a   ** state..  */.
a1c0: 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
a1d0: 20 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70     assert( !isOp
a1e0: 65 6e 28 70 2d 3e 66 64 29 20 29 3b 0a 20 20 20  en(p->fd) );.   
a1f0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 6f 53 79   assert( p->noSy
a200: 6e 63 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  nc );.    assert
a210: 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ( p->journalMode
a220: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
a230: 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20  ODE_OFF .       
a240: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
a250: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
a260: 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20  ALMODE_MEMORY . 
a270: 20 20 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74     );.    assert
a280: 28 20 70 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ( p->eState!=PAG
a290: 45 52 5f 45 52 52 4f 52 20 26 26 20 70 2d 3e 65  ER_ERROR && p->e
a2a0: 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45  State!=PAGER_OPE
a2b0: 4e 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  N );.    assert(
a2c0: 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 29 3d   pagerUseWal(p)=
a2d0: 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  =0 );.  }..  /* 
a2e0: 49 66 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  If changeCountDo
a2f0: 6e 65 20 69 73 20 73 65 74 2c 20 61 20 52 45 53  ne is set, a RES
a300: 45 52 56 45 44 20 6c 6f 63 6b 20 6f 72 20 67 72  ERVED lock or gr
a310: 65 61 74 65 72 20 6d 75 73 74 20 62 65 20 68 65  eater must be he
a320: 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 66  ld.  ** on the f
a330: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ile..  */.  asse
a340: 72 74 28 20 70 50 61 67 65 72 2d 3e 63 68 61 6e  rt( pPager->chan
a350: 67 65 43 6f 75 6e 74 44 6f 6e 65 3d 3d 30 20 7c  geCountDone==0 |
a360: 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e  | pPager->eLock>
a370: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29  =RESERVED_LOCK )
a380: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  ;.  assert( p->e
a390: 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f  Lock!=PENDING_LO
a3a0: 43 4b 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28  CK );..  switch(
a3b0: 20 70 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20   p->eState ){.  
a3c0: 20 20 63 61 73 65 20 50 41 47 45 52 5f 4f 50 45    case PAGER_OPE
a3d0: 4e 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  N:.      assert(
a3e0: 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 20   !MEMDB );.     
a3f0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a400: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
a410: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
a420: 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63  ert( sqlite3Pcac
a430: 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
a440: 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 7c  r->pPCache)==0 |
a450: 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
a460: 6c 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  le );.      brea
a470: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
a480: 45 52 5f 52 45 41 44 45 52 3a 0a 20 20 20 20 20  ER_READER:.     
a490: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a4a0: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
a4b0: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
a4c0: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55  ert( p->eLock!=U
a4d0: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20  NKNOWN_LOCK );. 
a4e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
a4f0: 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f  eLock>=SHARED_LO
a500: 43 4b 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  CK );.      brea
a510: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
a520: 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
a530: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
a540: 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57  p->eLock!=UNKNOW
a550: 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  N_LOCK );.      
a560: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a570: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
a580: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OK );.      if( 
a590: 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
a5a0: 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ger) ){.        
a5b0: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
a5c0: 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  >=RESERVED_LOCK 
a5d0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
a5e0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a5f0: 3e 64 62 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d  >dbSize==pPager-
a600: 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 3b 0a 20  >dbOrigSize );. 
a610: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a620: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d  ger->dbOrigSize=
a630: 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  =pPager->dbFileS
a640: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ize );.      ass
a650: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f  ert( pPager->dbO
a660: 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d  rigSize==pPager-
a670: 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20  >dbHintSize );. 
a680: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a690: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d  ger->setMaster==
a6a0: 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
a6b0: 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  ;..    case PAGE
a6c0: 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
a6d0: 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  D:.      assert(
a6e0: 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f   p->eLock!=UNKNO
a6f0: 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  WN_LOCK );.     
a700: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a710: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
a720: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28  _OK );.      if(
a730: 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
a740: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  ager) ){.       
a750: 20 2f 2a 20 49 74 20 69 73 20 70 6f 73 73 69 62   /* It is possib
a760: 6c 65 20 74 68 61 74 20 69 66 20 6a 6f 75 72 6e  le that if journ
a770: 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20 68 65 72 65  al_mode=wal here
a780: 20 74 68 61 74 20 6e 65 69 74 68 65 72 20 74 68   that neither th
a790: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75  e.        ** jou
a7a0: 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 72 20 74 68  rnal file nor th
a7b0: 65 20 57 41 4c 20 66 69 6c 65 20 61 72 65 20 6f  e WAL file are o
a7c0: 70 65 6e 2e 20 54 68 69 73 20 68 61 70 70 65 6e  pen. This happen
a7d0: 73 20 64 75 72 69 6e 67 0a 20 20 20 20 20 20 20  s during.       
a7e0: 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 74   ** a rollback t
a7f0: 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20  ransaction that 
a800: 73 77 69 74 63 68 65 73 20 66 72 6f 6d 20 6a 6f  switches from jo
a810: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66 66 0a 20  urnal_mode=off. 
a820: 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 6a 6f 75         ** to jou
a830: 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 2e 0a 20  rnal_mode=wal.. 
a840: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
a850: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
a860: 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck>=RESERVED_LOC
a870: 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  K );.        ass
a880: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a  ert( isOpen(p->j
a890: 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  fd) .           
a8a0: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
a8b0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
a8c0: 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20  ALMODE_OFF .    
a8d0: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
a8e0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
a8f0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
a900: 4c 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  L .        );.  
a910: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
a920: 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  rt( pPager->dbOr
a930: 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e  igSize==pPager->
a940: 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a 20 20  dbFileSize );.  
a950: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a960: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d  er->dbOrigSize==
a970: 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69  pPager->dbHintSi
a980: 7a 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ze );.      brea
a990: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
a9a0: 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 3a  ER_WRITER_DBMOD:
a9b0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a9c0: 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
a9d0: 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  VE_LOCK );.     
a9e0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a9f0: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
aa00: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
aa10: 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
aa20: 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
aa30: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
aa40: 6f 63 6b 3e 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock>=EXCLUSIVE_L
aa50: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  OCK );.      ass
aa60: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a  ert( isOpen(p->j
aa70: 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  fd) .           
aa80: 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  || p->journalMod
aa90: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
aaa0: 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20  MODE_OFF .      
aab0: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
aac0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
aad0: 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20  URNALMODE_WAL . 
aae0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 73 71            || (sq
aaf0: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
ab00: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 2d 3e  racteristics(p->
ab10: 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  fd)&SQLITE_IOCAP
ab20: 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43 29 0a 20  _BATCH_ATOMIC). 
ab30: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73       );.      as
ab40: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
ab50: 4f 72 69 67 53 69 7a 65 3c 3d 70 50 61 67 65 72  OrigSize<=pPager
ab60: 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a  ->dbHintSize );.
ab70: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
ab80: 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52 49    case PAGER_WRI
ab90: 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 20 20  TER_FINISHED:.  
aba0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
abb0: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
abc0: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  LOCK );.      as
abd0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
abe0: 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
abf0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
ac00: 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
ac10: 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20  Pager) );.      
ac20: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
ac30: 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20  ->jfd) .        
ac40: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
ac50: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
ac60: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
ac70: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f          || p->jo
ac80: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
ac90: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
aca0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
acb0: 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65  (sqlite3OsDevice
acc0: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
acd0: 70 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f  p->fd)&SQLITE_IO
ace0: 43 41 50 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43  CAP_BATCH_ATOMIC
acf0: 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  ).      );.     
ad00: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
ad10: 65 20 50 41 47 45 52 5f 45 52 52 4f 52 3a 0a 20  e PAGER_ERROR:. 
ad20: 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 6d 75       /* There mu
ad30: 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f  st be at least o
ad40: 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  ne outstanding r
ad50: 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
ad60: 70 61 67 65 72 20 69 66 0a 20 20 20 20 20 20 2a  pager if.      *
ad70: 2a 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65  * in ERROR state
ad80: 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20  . Otherwise the 
ad90: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 68 61 76  pager should hav
ada0: 65 20 61 6c 72 65 61 64 79 20 64 72 6f 70 70 65  e already droppe
adb0: 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20  d.      ** back 
adc0: 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e 0a 20  to OPEN state.. 
add0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
ade0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
adf0: 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b  rCode!=SQLITE_OK
ae00: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
ae10: 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  ( sqlite3PcacheR
ae20: 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
ae30: 70 50 43 61 63 68 65 29 3e 30 20 7c 7c 20 70 50  pPCache)>0 || pP
ae40: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
ae50: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
ae60: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   }..  return 1;.
ae70: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64  }.#endif /* ifnd
ae80: 65 66 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69  ef NDEBUG */..#i
ae90: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
aea0: 47 20 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  G ./*.** Return 
aeb0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 68  a pointer to a h
aec0: 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 73 74  uman readable st
aed0: 72 69 6e 67 20 69 6e 20 61 20 73 74 61 74 69 63  ring in a static
aee0: 20 62 75 66 66 65 72 0a 2a 2a 20 63 6f 6e 74 61   buffer.** conta
aef0: 69 6e 69 6e 67 20 74 68 65 20 73 74 61 74 65 20  ining the state 
af00: 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  of the Pager obj
af10: 65 63 74 20 70 61 73 73 65 64 20 61 73 20 61 6e  ect passed as an
af20: 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 0a   argument. This.
af30: 2a 2a 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74  ** is intended t
af40: 6f 20 62 65 20 75 73 65 64 20 77 69 74 68 69 6e  o be used within
af50: 20 64 65 62 75 67 67 65 72 73 2e 20 46 6f 72 20   debuggers. For 
af60: 65 78 61 6d 70 6c 65 2c 20 61 73 20 61 6e 20 61  example, as an a
af70: 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 74 6f  lternative.** to
af80: 20 22 70 72 69 6e 74 20 2a 70 50 61 67 65 72 22   "print *pPager"
af90: 20 69 6e 20 67 64 62 3a 0a 2a 2a 0a 2a 2a 20 28   in gdb:.**.** (
afa0: 67 64 62 29 20 70 72 69 6e 74 66 20 22 25 73 22  gdb) printf "%s"
afb0: 2c 20 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74  , print_pager_st
afc0: 61 74 65 28 70 50 61 67 65 72 29 0a 2a 2a 0a 2a  ate(pPager).**.*
afd0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68  * This routine h
afe0: 61 73 20 65 78 74 65 72 6e 61 6c 20 6c 69 6e 6b  as external link
aff0: 61 67 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  age in order to 
b000: 73 75 70 70 72 65 73 73 20 63 6f 6d 70 69 6c 65  suppress compile
b010: 72 20 77 61 72 6e 69 6e 67 73 0a 2a 2a 20 61 62  r warnings.** ab
b020: 6f 75 74 20 61 6e 20 75 6e 75 73 65 64 20 66 75  out an unused fu
b030: 6e 63 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 65  nction.  It is e
b040: 6e 63 6c 6f 73 65 64 20 77 69 74 68 69 6e 20 53  nclosed within S
b050: 51 4c 49 54 45 5f 44 45 42 55 47 20 61 6e 64 20  QLITE_DEBUG and 
b060: 73 6f 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 61  so does.** not a
b070: 70 70 65 61 72 20 69 6e 20 6e 6f 72 6d 61 6c 20  ppear in normal 
b080: 62 75 69 6c 64 73 2e 0a 2a 2f 0a 63 68 61 72 20  builds..*/.char 
b090: 2a 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74 61  *print_pager_sta
b0a0: 74 65 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20  te(Pager *p){.  
b0b0: 73 74 61 74 69 63 20 63 68 61 72 20 7a 52 65 74  static char zRet
b0c0: 5b 31 30 32 34 5d 3b 0a 0a 20 20 73 71 6c 69 74  [1024];..  sqlit
b0d0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 32 34  e3_snprintf(1024
b0e0: 2c 20 7a 52 65 74 2c 0a 20 20 20 20 20 20 22 46  , zRet,.      "F
b0f0: 69 6c 65 6e 61 6d 65 3a 20 20 20 20 20 20 25 73  ilename:      %s
b100: 5c 6e 22 0a 20 20 20 20 20 20 22 53 74 61 74 65  \n".      "State
b110: 3a 20 20 20 20 20 20 20 20 20 25 73 20 65 72 72  :         %s err
b120: 43 6f 64 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20  Code=%d\n".     
b130: 20 22 4c 6f 63 6b 3a 20 20 20 20 20 20 20 20 20   "Lock:         
b140: 20 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f   %s\n".      "Lo
b150: 63 6b 69 6e 67 20 6d 6f 64 65 3a 20 20 6c 6f 63  cking mode:  loc
b160: 6b 69 6e 67 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a  king_mode=%s\n".
b170: 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 20 6d        "Journal m
b180: 6f 64 65 3a 20 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  ode:  journal_mo
b190: 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22  de=%s\n".      "
b1a0: 42 61 63 6b 69 6e 67 20 73 74 6f 72 65 3a 20 74  Backing store: t
b1b0: 65 6d 70 46 69 6c 65 3d 25 64 20 6d 65 6d 44 62  empFile=%d memDb
b1c0: 3d 25 64 20 75 73 65 4a 6f 75 72 6e 61 6c 3d 25  =%d useJournal=%
b1d0: 64 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f 75 72  d\n".      "Jour
b1e0: 6e 61 6c 3a 20 20 20 20 20 20 20 6a 6f 75 72 6e  nal:       journ
b1f0: 61 6c 4f 66 66 3d 25 6c 6c 64 20 6a 6f 75 72 6e  alOff=%lld journ
b200: 61 6c 48 64 72 3d 25 6c 6c 64 5c 6e 22 0a 20 20  alHdr=%lld\n".  
b210: 20 20 20 20 22 53 69 7a 65 3a 20 20 20 20 20 20      "Size:      
b220: 20 20 20 20 64 62 73 69 7a 65 3d 25 64 20 64 62      dbsize=%d db
b230: 4f 72 69 67 53 69 7a 65 3d 25 64 20 64 62 46 69  OrigSize=%d dbFi
b240: 6c 65 53 69 7a 65 3d 25 64 5c 6e 22 0a 20 20 20  leSize=%d\n".   
b250: 20 20 20 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d     , p->zFilenam
b260: 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 53 74  e.      , p->eSt
b270: 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
b280: 20 20 20 20 20 20 20 20 20 20 20 3f 20 22 4f 50             ? "OP
b290: 45 4e 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  EN" :.        p-
b2a0: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
b2b0: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 3f  EADER          ?
b2c0: 20 22 52 45 41 44 45 52 22 20 3a 0a 20 20 20 20   "READER" :.    
b2d0: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50      p->eState==P
b2e0: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
b2f0: 45 44 20 20 20 3f 20 22 57 52 49 54 45 52 5f 4c  ED   ? "WRITER_L
b300: 4f 43 4b 45 44 22 20 3a 0a 20 20 20 20 20 20 20  OCKED" :.       
b310: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
b320: 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
b330: 44 20 3f 20 22 57 52 49 54 45 52 5f 43 41 43 48  D ? "WRITER_CACH
b340: 45 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20 20 20  EMOD" :.        
b350: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
b360: 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20  _WRITER_DBMOD   
b370: 20 3f 20 22 57 52 49 54 45 52 5f 44 42 4d 4f 44   ? "WRITER_DBMOD
b380: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
b390: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
b3a0: 54 45 52 5f 46 49 4e 49 53 48 45 44 20 3f 20 22  TER_FINISHED ? "
b3b0: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 22  WRITER_FINISHED"
b3c0: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
b3d0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f  tate==PAGER_ERRO
b3e0: 52 20 20 20 20 20 20 20 20 20 20 20 3f 20 22 45  R           ? "E
b3f0: 52 52 4f 52 22 20 3a 20 22 3f 65 72 72 6f 72 3f  RROR" : "?error?
b400: 22 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70  ".      , (int)p
b410: 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20  ->errCode.      
b420: 2c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c  , p->eLock==NO_L
b430: 4f 43 4b 20 20 20 20 20 20 20 20 20 3f 20 22 4e  OCK         ? "N
b440: 4f 5f 4c 4f 43 4b 22 20 3a 0a 20 20 20 20 20 20  O_LOCK" :.      
b450: 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45    p->eLock==RESE
b460: 52 56 45 44 5f 4c 4f 43 4b 20 20 20 3f 20 22 52  RVED_LOCK   ? "R
b470: 45 53 45 52 56 45 44 22 20 3a 0a 20 20 20 20 20  ESERVED" :.     
b480: 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43     p->eLock==EXC
b490: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 3f 20 22  LUSIVE_LOCK  ? "
b4a0: 45 58 43 4c 55 53 49 56 45 22 20 3a 0a 20 20 20  EXCLUSIVE" :.   
b4b0: 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 53       p->eLock==S
b4c0: 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 3f  HARED_LOCK     ?
b4d0: 20 22 53 48 41 52 45 44 22 20 3a 0a 20 20 20 20   "SHARED" :.    
b4e0: 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e      p->eLock==UN
b4f0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 3f 20  KNOWN_LOCK    ? 
b500: 22 55 4e 4b 4e 4f 57 4e 22 20 3a 20 22 3f 65 72  "UNKNOWN" : "?er
b510: 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 70 2d  ror?".      , p-
b520: 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3f  >exclusiveMode ?
b530: 20 22 65 78 63 6c 75 73 69 76 65 22 20 3a 20 22   "exclusive" : "
b540: 6e 6f 72 6d 61 6c 22 0a 20 20 20 20 20 20 2c 20  normal".      , 
b550: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
b560: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
b570: 45 5f 4d 45 4d 4f 52 59 20 20 20 3f 20 22 6d 65  E_MEMORY   ? "me
b580: 6d 6f 72 79 22 20 3a 0a 20 20 20 20 20 20 20 20  mory" :.        
b590: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
b5a0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
b5b0: 45 5f 4f 46 46 20 20 20 20 20 20 3f 20 22 6f 66  E_OFF      ? "of
b5c0: 66 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  f" :.        p->
b5d0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
b5e0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
b5f0: 45 4c 45 54 45 20 20 20 3f 20 22 64 65 6c 65 74  ELETE   ? "delet
b600: 65 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  e" :.        p->
b610: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
b620: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
b630: 45 52 53 49 53 54 20 20 3f 20 22 70 65 72 73 69  ERSIST  ? "persi
b640: 73 74 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  st" :.        p-
b650: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
b660: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
b670: 54 52 55 4e 43 41 54 45 20 3f 20 22 74 72 75 6e  TRUNCATE ? "trun
b680: 63 61 74 65 22 20 3a 0a 20 20 20 20 20 20 20 20  cate" :.        
b690: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
b6a0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
b6b0: 45 5f 57 41 4c 20 20 20 20 20 20 3f 20 22 77 61  E_WAL      ? "wa
b6c0: 6c 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20  l" : "?error?". 
b6d0: 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 74       , (int)p->t
b6e0: 65 6d 70 46 69 6c 65 2c 20 28 69 6e 74 29 70 2d  empFile, (int)p-
b6f0: 3e 6d 65 6d 44 62 2c 20 28 69 6e 74 29 70 2d 3e  >memDb, (int)p->
b700: 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  useJournal.     
b710: 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66   , p->journalOff
b720: 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a  , p->journalHdr.
b730: 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e        , (int)p->
b740: 64 62 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e  dbSize, (int)p->
b750: 64 62 4f 72 69 67 53 69 7a 65 2c 20 28 69 6e 74  dbOrigSize, (int
b760: 29 70 2d 3e 64 62 46 69 6c 65 53 69 7a 65 0a 20  )p->dbFileSize. 
b770: 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 7a 52   );..  return zR
b780: 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  et;.}.#endif../*
b790: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
b7a0: 63 65 73 20 74 6f 20 74 68 65 20 76 61 72 69 6f  ces to the vario
b7b0: 75 73 20 70 61 67 65 20 67 65 74 74 65 72 73 20  us page getters 
b7c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
b7d0: 74 50 61 67 65 4e 6f 72 6d 61 6c 28 50 61 67 65  tPageNormal(Page
b7e0: 72 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65 2a 2a  r*,Pgno,DbPage**
b7f0: 2c 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e  ,int);.static in
b800: 74 20 67 65 74 50 61 67 65 45 72 72 6f 72 28 50  t getPageError(P
b810: 61 67 65 72 2a 2c 50 67 6e 6f 2c 44 62 50 61 67  ager*,Pgno,DbPag
b820: 65 2a 2a 2c 69 6e 74 29 3b 0a 23 69 66 20 53 51  e**,int);.#if SQ
b830: 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
b840: 5a 45 3e 30 0a 73 74 61 74 69 63 20 69 6e 74 20  ZE>0.static int 
b850: 67 65 74 50 61 67 65 4d 4d 61 70 28 50 61 67 65  getPageMMap(Page
b860: 72 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65 2a 2a  r*,Pgno,DbPage**
b870: 2c 69 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f  ,int);.#endif../
b880: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 50 61 67  *.** Set the Pag
b890: 65 72 2e 78 47 65 74 20 6d 65 74 68 6f 64 20 66  er.xGet method f
b8a0: 6f 72 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  or the appropria
b8b0: 74 65 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20  te routine used 
b8c0: 74 6f 20 66 65 74 63 68 0a 2a 2a 20 63 6f 6e 74  to fetch.** cont
b8d0: 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ent from the pag
b8e0: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
b8f0: 69 64 20 73 65 74 47 65 74 74 65 72 4d 65 74 68  id setGetterMeth
b900: 6f 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  od(Pager *pPager
b910: 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
b920: 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
b930: 70 50 61 67 65 72 2d 3e 78 47 65 74 20 3d 20 67  pPager->xGet = g
b940: 65 74 50 61 67 65 45 72 72 6f 72 3b 0a 23 69 66  etPageError;.#if
b950: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
b960: 5f 53 49 5a 45 3e 30 0a 20 20 7d 65 6c 73 65 20  _SIZE>0.  }else 
b970: 69 66 28 20 55 53 45 46 45 54 43 48 28 70 50 61  if( USEFETCH(pPa
b980: 67 65 72 29 0a 23 69 66 64 65 66 20 53 51 4c 49  ger).#ifdef SQLI
b990: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20  TE_HAS_CODEC.   
b9a0: 26 26 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  && pPager->xCode
b9b0: 63 3d 3d 30 0a 23 65 6e 64 69 66 0a 20 20 29 7b  c==0.#endif.  ){
b9c0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 47 65  .    pPager->xGe
b9d0: 74 20 3d 20 67 65 74 50 61 67 65 4d 4d 61 70 3b  t = getPageMMap;
b9e0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
b9f0: 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
ba00: 30 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  0 */.  }else{.  
ba10: 20 20 70 50 61 67 65 72 2d 3e 78 47 65 74 20 3d    pPager->xGet =
ba20: 20 67 65 74 50 61 67 65 4e 6f 72 6d 61 6c 3b 0a   getPageNormal;.
ba30: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
ba40: 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 69  urn true if it i
ba50: 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77  s necessary to w
ba60: 72 69 74 65 20 70 61 67 65 20 2a 70 50 67 20 69  rite page *pPg i
ba70: 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  nto the sub-jour
ba80: 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e  nal..** A page n
ba90: 65 65 64 73 20 74 6f 20 62 65 20 77 72 69 74 74  eeds to be writt
baa0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d  en into the sub-
bab0: 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68 65 72 65  journal if there
bac0: 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f   exists one.** o
bad0: 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76 65  r more open save
bae0: 70 6f 69 6e 74 73 20 66 6f 72 20 77 68 69 63 68  points for which
baf0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  :.**.**   * The 
bb00: 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c  page-number is l
bb10: 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
bb20: 6c 20 74 6f 20 50 61 67 65 72 53 61 76 65 70 6f  l to PagerSavepo
bb30: 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a  int.nOrig, and.*
bb40: 2a 20 20 20 2a 20 54 68 65 20 62 69 74 20 63 6f  *   * The bit co
bb50: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
bb60: 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69  he page-number i
bb70: 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20  s not set in.** 
bb80: 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
bb90: 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e  nt.pInSavepoint.
bba0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
bbb0: 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
bbc0: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
bbd0: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
bbe0: 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 61  Pg->pPager;.  Pa
bbf0: 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 3b  gerSavepoint *p;
bc00: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70  .  Pgno pgno = p
bc10: 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 69 6e 74 20  Pg->pgno;.  int 
bc20: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
bc30: 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
bc40: 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20  nt; i++){.    p 
bc50: 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65  = &pPager->aSave
bc60: 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66  point[i];.    if
bc70: 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f  ( p->nOrig>=pgno
bc80: 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 42 69   && 0==sqlite3Bi
bc90: 74 76 65 63 54 65 73 74 4e 6f 74 4e 75 6c 6c 28  tvecTestNotNull(
bca0: 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c  p->pInSavepoint,
bcb0: 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20   pgno) ){.      
bcc0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
bcd0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
bce0: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
bcf0: 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74  _DEBUG./*.** Ret
bd00: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
bd10: 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20  page is already 
bd20: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
bd30: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
bd40: 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c  nt pageInJournal
bd50: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
bd60: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 72  PgHdr *pPg){.  r
bd70: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 69 74  eturn sqlite3Bit
bd80: 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e  vecTest(pPager->
bd90: 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d  pInJournal, pPg-
bda0: 3e 70 67 6e 6f 29 3b 0a 7d 0a 23 65 6e 64 69 66  >pgno);.}.#endif
bdb0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33  ../*.** Read a 3
bdc0: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66 72  2-bit integer fr
bdd0: 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c  om the given fil
bde0: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53  e descriptor.  S
bdf0: 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65 72  tore the integer
be00: 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61 64  .** that is read
be10: 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75   in *pRes.  Retu
be20: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
be30: 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65  everything worke
be40: 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f  d, or an.** erro
be50: 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68  r code is someth
be60: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
be70: 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73  **.** All values
be80: 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64   are stored on d
be90: 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61  isk as big-endia
bea0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
beb0: 20 72 65 61 64 33 32 62 69 74 73 28 73 71 6c 69   read32bits(sqli
bec0: 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36  te3_file *fd, i6
bed0: 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a 70  4 offset, u32 *p
bee0: 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  Res){.  unsigned
bef0: 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69   char ac[4];.  i
bf00: 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  nt rc = sqlite3O
bf10: 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73 69  sRead(fd, ac, si
bf20: 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65 74  zeof(ac), offset
bf30: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
bf40: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70  ITE_OK ){.    *p
bf50: 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Res = sqlite3Get
bf60: 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20  4byte(ac);.  }. 
bf70: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
bf80: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d  *.** Write a 32-
bf90: 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f  bit integer into
bfa0: 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72   a string buffer
bfb0: 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20 62   in big-endian b
bfc0: 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64  yte order..*/.#d
bfd0: 65 66 69 6e 65 20 70 75 74 33 32 62 69 74 73 28  efine put32bits(
bfe0: 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75 74  A,B)  sqlite3Put
bff0: 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29 0a  4byte((u8*)A,B).
c000: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20  ../*.** Write a 
c010: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69  32-bit integer i
c020: 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69  nto the given fi
c030: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
c040: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
c050: 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  .** on success o
c060: 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
c070: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  is something goe
c080: 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  s wrong..*/.stat
c090: 69 63 20 69 6e 74 20 77 72 69 74 65 33 32 62 69  ic int write32bi
c0a0: 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ts(sqlite3_file 
c0b0: 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c  *fd, i64 offset,
c0c0: 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68 61   u32 val){.  cha
c0d0: 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32  r ac[4];.  put32
c0e0: 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20  bits(ac, val);. 
c0f0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f   return sqlite3O
c100: 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34  sWrite(fd, ac, 4
c110: 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a  , offset);.}../*
c120: 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64  .** Unlock the d
c130: 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
c140: 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69  level eLock, whi
c150: 63 68 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ch must be eithe
c160: 72 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72 20  r NO_LOCK.** or 
c170: 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 20 52 65 67  SHARED_LOCK. Reg
c180: 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
c190: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 63 61  er or not the ca
c1a0: 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a  ll to xUnlock().
c1b0: 2a 2a 20 73 75 63 63 65 65 64 73 2c 20 73 65 74  ** succeeds, set
c1c0: 20 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b   the Pager.eLock
c1d0: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6d 61 74   variable to mat
c1e0: 63 68 20 74 68 65 20 28 61 74 74 65 6d 70 74 65  ch the (attempte
c1f0: 64 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a 0a  d) new lock..**.
c200: 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50 61  ** Except, if Pa
c210: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
c220: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
c230: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
c240: 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64  ion is.** called
c250: 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20  , do not modify 
c260: 69 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d  it. See the comm
c270: 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23 64  ent above the #d
c280: 65 66 69 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e 4b  efine of .** UNK
c290: 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e  NOWN_LOCK for an
c2a0: 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20   explanation of 
c2b0: 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  this..*/.static 
c2c0: 69 6e 74 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44  int pagerUnlockD
c2d0: 62 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  b(Pager *pPager,
c2e0: 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69   int eLock){.  i
c2f0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
c300: 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70  K;..  assert( !p
c310: 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
c320: 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Mode || pPager->
c330: 65 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b 20 29 3b 0a  eLock==eLock );.
c340: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
c350: 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  =NO_LOCK || eLoc
c360: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
c370: 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63  ;.  assert( eLoc
c380: 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 61  k!=NO_LOCK || pa
c390: 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
c3a0: 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73  )==0 );.  if( is
c3b0: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
c3c0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
c3d0: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 65  pPager->eLock>=e
c3e0: 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 72 63 20 3d  Lock );.    rc =
c3f0: 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20   pPager->noLock 
c400: 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71  ? SQLITE_OK : sq
c410: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50  lite3OsUnlock(pP
c420: 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29  ager->fd, eLock)
c430: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
c440: 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e  ->eLock!=UNKNOWN
c450: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70  _LOCK ){.      p
c460: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28  Pager->eLock = (
c470: 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d 0a  u8)eLock;.    }.
c480: 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 55 4e      IOTRACE(("UN
c490: 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70  LOCK %p %d\n", p
c4a0: 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20  Pager, eLock)). 
c4b0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
c4c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
c4d0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
c4e0: 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20  to level eLock, 
c4f0: 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 65 69  which must be ei
c500: 74 68 65 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ther SHARED_LOCK
c510: 2c 0a 2a 2a 20 52 45 53 45 52 56 45 44 5f 4c 4f  ,.** RESERVED_LO
c520: 43 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f  CK or EXCLUSIVE_
c530: 4c 4f 43 4b 2e 20 49 66 20 74 68 65 20 63 61 6c  LOCK. If the cal
c540: 6c 65 72 20 69 73 20 73 75 63 63 65 73 73 66 75  ler is successfu
c550: 6c 2c 20 73 65 74 20 74 68 65 0a 2a 2a 20 50 61  l, set the.** Pa
c560: 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62  ger.eLock variab
c570: 6c 65 20 74 6f 20 74 68 65 20 6e 65 77 20 6c 6f  le to the new lo
c580: 63 6b 69 6e 67 20 73 74 61 74 65 2e 20 0a 2a 2a  cking state. .**
c590: 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50  .** Except, if P
c5a0: 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65  ager.eLock is se
c5b0: 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
c5c0: 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  K when this func
c5d0: 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 63 61 6c 6c  tion is .** call
c5e0: 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66  ed, do not modif
c5f0: 79 20 69 74 20 75 6e 6c 65 73 73 20 74 68 65 20  y it unless the 
c600: 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74  new locking stat
c610: 65 20 69 73 20 45 58 43 4c 55 53 49 56 45 5f 4c  e is EXCLUSIVE_L
c620: 4f 43 4b 2e 20 0a 2a 2a 20 53 65 65 20 74 68 65  OCK. .** See the
c630: 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74   comment above t
c640: 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20 55 4e  he #define of UN
c650: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61  KNOWN_LOCK for a
c660: 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 0a 2a  n explanation .*
c670: 2a 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74  * of this..*/.st
c680: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4c 6f  atic int pagerLo
c690: 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61 67  ckDb(Pager *pPag
c6a0: 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a  er, int eLock){.
c6b0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
c6c0: 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
c6d0: 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c   eLock==SHARED_L
c6e0: 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 52 45  OCK || eLock==RE
c6f0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65  SERVED_LOCK || e
c700: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
c710: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 50  LOCK );.  if( pP
c720: 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 65 4c 6f 63  ager->eLock<eLoc
c730: 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f  k || pPager->eLo
c740: 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck==UNKNOWN_LOCK
c750: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61   ){.    rc = pPa
c760: 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20 53 51  ger->noLock ? SQ
c770: 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74 65  LITE_OK : sqlite
c780: 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  3OsLock(pPager->
c790: 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20  fd, eLock);.    
c7a0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
c7b0: 4b 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 4c  K && (pPager->eL
c7c0: 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock!=UNKNOWN_LOC
c7d0: 4b 7c 7c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  K||eLock==EXCLUS
c7e0: 49 56 45 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20  IVE_LOCK) ){.   
c7f0: 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b     pPager->eLock
c800: 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20   = (u8)eLock;.  
c810: 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f      IOTRACE(("LO
c820: 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  CK %p %d\n", pPa
c830: 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20 20  ger, eLock)).   
c840: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
c850: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
c860: 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72  s function deter
c870: 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20 6f 72  mines whether or
c880: 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d   not the atomic-
c890: 77 72 69 74 65 20 6f 72 0a 2a 2a 20 61 74 6f 6d  write or.** atom
c8a0: 69 63 2d 62 61 74 63 68 2d 77 72 69 74 65 20 6f  ic-batch-write o
c8b0: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 63 61 6e  ptimizations can
c8c0: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 74 68   be used with th
c8d0: 69 73 20 70 61 67 65 72 2e 20 54 68 65 0a 2a 2a  is pager. The.**
c8e0: 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70   atomic-write op
c8f0: 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62  timization can b
c900: 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a  e used if:.**.**
c910: 20 20 28 61 29 20 74 68 65 20 76 61 6c 75 65 20    (a) the value 
c920: 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65  returned by OsDe
c930: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
c940: 69 63 73 28 29 20 69 6e 64 69 63 61 74 65 73 20  ics() indicates 
c950: 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64  that.**      a d
c960: 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 61 79  atabase page may
c970: 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d   be written atom
c980: 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20  ically, and.**  
c990: 28 62 29 20 74 68 65 20 76 61 6c 75 65 20 72 65  (b) the value re
c9a0: 74 75 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74  turned by OsSect
c9b0: 6f 72 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73  orSize() is less
c9c0: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a   than or equal.*
c9d0: 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 70 61  *      to the pa
c9e0: 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49  ge size..**.** I
c9f0: 66 20 69 74 20 63 61 6e 20 62 65 20 75 73 65 64  f it can be used
ca00: 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
ca10: 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65   returned is the
ca20: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
ca30: 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 77 68  rnal .** file wh
ca40: 65 6e 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 72  en it contains r
ca50: 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f 72  ollback data for
ca60: 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67   exactly one pag
ca70: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 74 6f  e..**.** The ato
ca80: 6d 69 63 2d 62 61 74 63 68 2d 77 72 69 74 65 20  mic-batch-write 
ca90: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e  optimization can
caa0: 20 62 65 20 75 73 65 64 20 69 66 20 4f 73 44 65   be used if OsDe
cab0: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
cac0: 69 63 73 28 29 0a 2a 2a 20 72 65 74 75 72 6e 73  ics().** returns
cad0: 20 61 20 76 61 6c 75 65 20 77 69 74 68 20 74 68   a value with th
cae0: 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 42  e SQLITE_IOCAP_B
caf0: 41 54 43 48 5f 41 54 4f 4d 49 43 20 62 69 74 20  ATCH_ATOMIC bit 
cb00: 73 65 74 2e 20 2d 31 20 69 73 0a 2a 2a 20 72 65  set. -1 is.** re
cb10: 74 75 72 6e 65 64 20 69 6e 20 74 68 69 73 20 63  turned in this c
cb20: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65  ase..**.** If ne
cb30: 69 74 68 65 72 20 6f 70 74 69 6d 69 7a 61 74 69  ither optimizati
cb40: 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 2c 20  on can be used, 
cb50: 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  0 is returned..*
cb60: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 72 6e  /.static int jrn
cb70: 6c 42 75 66 66 65 72 53 69 7a 65 28 50 61 67 65  lBufferSize(Page
cb80: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73  r *pPager){.  as
cb90: 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
cba0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
cbb0: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
cbc0: 43 5f 57 52 49 54 45 29 20 5c 0a 20 7c 7c 20 64  C_WRITE) \. || d
cbd0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
cbe0: 41 42 4c 45 5f 42 41 54 43 48 5f 41 54 4f 4d 49  ABLE_BATCH_ATOMI
cbf0: 43 5f 57 52 49 54 45 29 0a 20 20 69 6e 74 20 64  C_WRITE).  int d
cc00: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
cc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cc20: 44 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  Device character
cc30: 69 73 74 69 63 73 20 2a 2f 0a 0a 20 20 61 73 73  istics */..  ass
cc40: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
cc50: 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 64 63 20  er->fd) );.  dc 
cc60: 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  = sqlite3OsDevic
cc70: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
cc80: 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 23 65  (pPager->fd);.#e
cc90: 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  lse.  UNUSED_PAR
cca0: 41 4d 45 54 45 52 28 70 50 61 67 65 72 29 3b 0a  AMETER(pPager);.
ccb0: 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
ccc0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 42 41 54  QLITE_ENABLE_BAT
ccd0: 43 48 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  CH_ATOMIC_WRITE.
cce0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
ccf0: 53 69 7a 65 3e 30 20 26 26 20 28 64 63 26 53 51  Size>0 && (dc&SQ
cd00: 4c 49 54 45 5f 49 4f 43 41 50 5f 42 41 54 43 48  LITE_IOCAP_BATCH
cd10: 5f 41 54 4f 4d 49 43 29 20 29 7b 0a 20 20 20 20  _ATOMIC) ){.    
cd20: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 23  return -1;.  }.#
cd30: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
cd40: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
cd50: 49 43 5f 57 52 49 54 45 0a 20 20 7b 0a 20 20 20  IC_WRITE.  {.   
cd60: 20 69 6e 74 20 6e 53 65 63 74 6f 72 20 3d 20 70   int nSector = p
cd70: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
cd80: 65 3b 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67  e;.    int szPag
cd90: 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  e = pPager->page
cda0: 53 69 7a 65 3b 0a 0a 20 20 20 20 61 73 73 65 72  Size;..    asser
cdb0: 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  t(SQLITE_IOCAP_A
cdc0: 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e  TOMIC512==(512>>
cdd0: 38 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  8));.    assert(
cde0: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
cdf0: 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e  MIC64K==(65536>>
ce00: 38 29 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  8));.    if( 0==
ce10: 28 64 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41  (dc&(SQLITE_IOCA
ce20: 50 5f 41 54 4f 4d 49 43 7c 28 73 7a 50 61 67 65  P_ATOMIC|(szPage
ce30: 3e 3e 38 29 29 20 7c 7c 20 6e 53 65 63 74 6f 72  >>8)) || nSector
ce40: 3e 73 7a 50 61 67 65 29 20 29 7b 0a 20 20 20 20  >szPage) ){.    
ce50: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
ce60: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
ce70: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
ce80: 50 61 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c  Pager) + JOURNAL
ce90: 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  _PG_SZ(pPager);.
cea0: 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
ceb0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20   0;.}../*.** If 
cec0: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
ced0: 45 53 20 69 73 20 64 65 66 69 6e 65 64 20 74 68  ES is defined th
cee0: 65 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20 73 61  en we do some sa
cef0: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a  nity checking.**
cf00: 20 6f 6e 20 74 68 65 20 63 61 63 68 65 20 75 73   on the cache us
cf10: 69 6e 67 20 61 20 68 61 73 68 20 66 75 6e 63 74  ing a hash funct
cf20: 69 6f 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73  ion.  This is us
cf30: 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a  ed for testing.*
cf40: 2a 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  * and debugging 
cf50: 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  only..*/.#ifdef 
cf60: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
cf70: 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  ES./*.** Return 
cf80: 61 20 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66  a 32-bit hash of
cf90: 20 74 68 65 20 70 61 67 65 20 64 61 74 61 20 66   the page data f
cfa0: 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61  or pPage..*/.sta
cfb0: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 64 61  tic u32 pager_da
cfc0: 74 61 68 61 73 68 28 69 6e 74 20 6e 42 79 74 65  tahash(int nByte
cfd0: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
cfe0: 2a 70 44 61 74 61 29 7b 0a 20 20 75 33 32 20 68  *pData){.  u32 h
cff0: 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ash = 0;.  int i
d000: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
d010: 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Byte; i++){.    
d020: 68 61 73 68 20 3d 20 28 68 61 73 68 2a 31 30 33  hash = (hash*103
d030: 39 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20  9) + pData[i];. 
d040: 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68   }.  return hash
d050: 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70  ;.}.static u32 p
d060: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 50 67  ager_pagehash(Pg
d070: 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 72  Hdr *pPage){.  r
d080: 65 74 75 72 6e 20 70 61 67 65 72 5f 64 61 74 61  eturn pager_data
d090: 68 61 73 68 28 70 50 61 67 65 2d 3e 70 50 61 67  hash(pPage->pPag
d0a0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75  er->pageSize, (u
d0b0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70  nsigned char *)p
d0c0: 50 61 67 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a  Page->pData);.}.
d0d0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
d0e0: 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 50  r_set_pagehash(P
d0f0: 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20  gHdr *pPage){.  
d100: 70 50 61 67 65 2d 3e 70 61 67 65 48 61 73 68 20  pPage->pageHash 
d110: 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
d120: 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pPage);.}../*.*
d130: 2a 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45  * The CHECK_PAGE
d140: 20 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50   macro takes a P
d150: 67 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75  gHdr* as an argu
d160: 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f  ment. If SQLITE_
d170: 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69  CHECK_PAGES.** i
d180: 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e  s defined, and N
d190: 44 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66  DEBUG is not def
d1a0: 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28  ined, an assert(
d1b0: 29 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63  ) statement chec
d1c0: 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70  ks.** that the p
d1d0: 61 67 65 20 69 73 20 65 69 74 68 65 72 20 64 69  age is either di
d1e0: 72 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74  rty or still mat
d1f0: 63 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61  ches the calcula
d200: 74 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a  ted page-hash..*
d210: 2f 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f  /.#define CHECK_
d220: 50 41 47 45 28 78 29 20 63 68 65 63 6b 50 61 67  PAGE(x) checkPag
d230: 65 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64  e(x).static void
d240: 20 63 68 65 63 6b 50 61 67 65 28 50 67 48 64 72   checkPage(PgHdr
d250: 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
d260: 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
d270: 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28  Pager;.  assert(
d280: 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
d290: 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a  =PAGER_ERROR );.
d2a0: 20 20 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e    assert( (pPg->
d2b0: 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54  flags&PGHDR_DIRT
d2c0: 59 29 20 7c 7c 20 70 50 67 2d 3e 70 61 67 65 48  Y) || pPg->pageH
d2d0: 61 73 68 3d 3d 70 61 67 65 72 5f 70 61 67 65 68  ash==pager_pageh
d2e0: 61 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23  ash(pPg) );.}..#
d2f0: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 70 61 67  else.#define pag
d300: 65 72 5f 64 61 74 61 68 61 73 68 28 58 2c 59 29  er_datahash(X,Y)
d310: 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65    0.#define page
d320: 72 5f 70 61 67 65 68 61 73 68 28 58 29 20 20 30  r_pagehash(X)  0
d330: 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 73  .#define pager_s
d340: 65 74 5f 70 61 67 65 68 61 73 68 28 58 29 0a 23  et_pagehash(X).#
d350: 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47  define CHECK_PAG
d360: 45 28 78 29 0a 23 65 6e 64 69 66 20 20 2f 2a 20  E(x).#endif  /* 
d370: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
d380: 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65  ES */../*.** Whe
d390: 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  n this is called
d3a0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
d3b0: 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67  e for pager pPag
d3c0: 65 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e  er must be open.
d3d0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
d3e0: 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65  n attempts to re
d3f0: 61 64 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  ad a master jour
d400: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 66 72  nal file name fr
d410: 6f 6d 20 74 68 65 20 0a 2a 2a 20 65 6e 64 20 6f  om the .** end o
d420: 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64 2c 20  f the file and, 
d430: 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 63  if successful, c
d440: 6f 70 69 65 73 20 69 74 20 69 6e 74 6f 20 6d 65  opies it into me
d450: 6d 6f 72 79 20 73 75 70 70 6c 69 65 64 20 0a 2a  mory supplied .*
d460: 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  * by the caller.
d470: 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62   See comments ab
d480: 6f 76 65 20 77 72 69 74 65 4d 61 73 74 65 72 4a  ove writeMasterJ
d490: 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20 74 68 65  ournal() for the
d4a0: 20 66 6f 72 6d 61 74 0a 2a 2a 20 75 73 65 64 20   format.** used 
d4b0: 74 6f 20 73 74 6f 72 65 20 61 20 6d 61 73 74 65  to store a maste
d4c0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
d4d0: 61 6d 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ame at the end o
d4e0: 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  f a journal file
d4f0: 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20  ..**.** zMaster 
d500: 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20  must point to a 
d510: 62 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61  buffer of at lea
d520: 73 74 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73  st nMaster bytes
d530: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a   allocated by.**
d540: 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 69   the caller. Thi
d550: 73 20 73 68 6f 75 6c 64 20 62 65 20 73 71 6c 69  s should be sqli
d560: 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61  te3_vfs.mxPathna
d570: 6d 65 2b 31 20 28 74 6f 20 65 6e 73 75 72 65 20  me+1 (to ensure 
d580: 74 68 65 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75  there is.** enou
d590: 67 68 20 73 70 61 63 65 20 74 6f 20 77 72 69 74  gh space to writ
d5a0: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
d5b0: 72 6e 61 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74  rnal name). If t
d5c0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
d5d0: 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65  l.** name in the
d5e0: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67   journal is long
d5f0: 65 72 20 74 68 61 6e 20 6e 4d 61 73 74 65 72 20  er than nMaster 
d600: 62 79 74 65 73 20 28 69 6e 63 6c 75 64 69 6e 67  bytes (including
d610: 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e   a.** nul-termin
d620: 61 74 6f 72 29 2c 20 74 68 65 6e 20 74 68 69 73  ator), then this
d630: 20 69 73 20 68 61 6e 64 6c 65 64 20 61 73 20 69   is handled as i
d640: 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  f no master jour
d650: 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65  nal name.** were
d660: 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20   present in the 
d670: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49  journal..**.** I
d680: 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
d690: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  al file name is 
d6a0: 70 72 65 73 65 6e 74 20 61 74 20 74 68 65 20 65  present at the e
d6b0: 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  nd of the journa
d6c0: 6c 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20  l.** file, then 
d6d0: 69 74 20 69 73 20 63 6f 70 69 65 64 20 69 6e 74  it is copied int
d6e0: 6f 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69  o the buffer poi
d6f0: 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74  nted to by zMast
d700: 65 72 2e 20 41 0a 2a 2a 20 6e 75 6c 2d 74 65 72  er. A.** nul-ter
d710: 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 69 73 20  minator byte is 
d720: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
d730: 62 75 66 66 65 72 20 66 6f 6c 6c 6f 77 69 6e 67  buffer following
d740: 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a   the master.** j
d750: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
d760: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73  ..**.** If it is
d770: 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74   determined that
d780: 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
d790: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  al file name is 
d7a0: 70 72 65 73 65 6e 74 20 0a 2a 2a 20 7a 4d 61 73  present .** zMas
d7b0: 74 65 72 5b 30 5d 20 69 73 20 73 65 74 20 74 6f  ter[0] is set to
d7c0: 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b   0 and SQLITE_OK
d7d0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
d7e0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
d7f0: 75 72 73 20 77 68 69 6c 65 20 72 65 61 64 69 6e  urs while readin
d800: 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  g from the journ
d810: 61 6c 20 66 69 6c 65 2c 20 61 6e 20 53 51 4c 69  al file, an SQLi
d820: 74 65 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  te.** error code
d830: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
d840: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
d850: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71  MasterJournal(sq
d860: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e  lite3_file *pJrn
d870: 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  l, char *zMaster
d880: 2c 20 75 33 32 20 6e 4d 61 73 74 65 72 29 7b 0a  , u32 nMaster){.
d890: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
d8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d8b0: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
d8c0: 20 75 33 32 20 6c 65 6e 3b 20 20 20 20 20 20 20   u32 len;       
d8d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
d8e0: 65 6e 67 74 68 20 69 6e 20 62 79 74 65 73 20 6f  ength in bytes o
d8f0: 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
d900: 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 36 34 20 73   name */.  i64 s
d910: 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  zJ;             
d920: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73        /* Total s
d930: 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20  ize in bytes of 
d940: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 70 4a 72  journal file pJr
d950: 6e 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75  nl */.  u32 cksu
d960: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
d970: 20 20 20 2f 2a 20 4d 4a 20 63 68 65 63 6b 73 75     /* MJ checksu
d980: 6d 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  m value read fro
d990: 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  m journal */.  u
d9a0: 33 32 20 75 3b 20 20 20 20 20 20 20 20 20 20 20  32 u;           
d9b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73            /* Uns
d9c0: 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74  igned loop count
d9d0: 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  er */.  unsigned
d9e0: 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b   char aMagic[8];
d9f0: 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74     /* A buffer t
da00: 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63  o hold the magic
da10: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 7a 4d 61   header */.  zMa
da20: 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a  ster[0] = '\0';.
da30: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
da40: 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  !=(rc = sqlite3O
da50: 73 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c  sFileSize(pJrnl,
da60: 20 26 73 7a 4a 29 29 0a 20 20 20 7c 7c 20 73 7a   &szJ)).   || sz
da70: 4a 3c 31 36 0a 20 20 20 7c 7c 20 53 51 4c 49 54  J<16.   || SQLIT
da80: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
da90: 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a  32bits(pJrnl, sz
daa0: 4a 2d 31 36 2c 20 26 6c 65 6e 29 29 0a 20 20 20  J-16, &len)).   
dab0: 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72 20  || len>=nMaster 
dac0: 0a 20 20 20 7c 7c 20 6c 65 6e 3e 73 7a 4a 2d 31  .   || len>szJ-1
dad0: 36 0a 20 20 20 7c 7c 20 6c 65 6e 3d 3d 30 20 0a  6.   || len==0 .
dae0: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
daf0: 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
db00: 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c  s(pJrnl, szJ-12,
db10: 20 26 63 6b 73 75 6d 29 29 0a 20 20 20 7c 7c 20   &cksum)).   || 
db20: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
db30: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
db40: 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c  Jrnl, aMagic, 8,
db50: 20 73 7a 4a 2d 38 29 29 0a 20 20 20 7c 7c 20 6d   szJ-8)).   || m
db60: 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
db70: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 0a  ournalMagic, 8).
db80: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
db90: 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
dba0: 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73  Read(pJrnl, zMas
dbb0: 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36  ter, len, szJ-16
dbc0: 2d 6c 65 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20  -len)).  ){.    
dbd0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
dbe0: 20 20 2f 2a 20 53 65 65 20 69 66 20 74 68 65 20    /* See if the 
dbf0: 63 68 65 63 6b 73 75 6d 20 6d 61 74 63 68 65 73  checksum matches
dc00: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
dc10: 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f  nal name */.  fo
dc20: 72 28 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b  r(u=0; u<len; u+
dc30: 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d  +){.    cksum -=
dc40: 20 7a 4d 61 73 74 65 72 5b 75 5d 3b 0a 20 20 7d   zMaster[u];.  }
dc50: 0a 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a  .  if( cksum ){.
dc60: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68      /* If the ch
dc70: 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61  ecksum doesn't a
dc80: 64 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20  dd up, then one 
dc90: 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64  or more of the d
dca0: 69 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20  isk sectors.    
dcb0: 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ** containing th
dcc0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
dcd0: 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72   filename is cor
dce0: 72 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61  rupted. This mea
dcf0: 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69  ns.    ** defini
dd00: 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20  tely roll back, 
dd10: 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53  so just return S
dd20: 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70  QLITE_OK and rep
dd30: 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20  ort a (nul).    
dd40: 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  ** master-journa
dd50: 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20  l filename..    
dd60: 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a  */.    len = 0;.
dd70: 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65    }.  zMaster[le
dd80: 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 0a 20  n] = '\0';.   . 
dd90: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
dda0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  K;.}../*.** Retu
ddb0: 72 6e 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66  rn the offset of
ddc0: 20 74 68 65 20 73 65 63 74 6f 72 20 62 6f 75 6e   the sector boun
ddd0: 64 61 72 79 20 61 74 20 6f 72 20 69 6d 6d 65 64  dary at or immed
dde0: 69 61 74 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c 6f  iately .** follo
ddf0: 77 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 69  wing the value i
de00: 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  n pPager->journa
de10: 6c 4f 66 66 2c 20 61 73 73 75 6d 69 6e 67 20 61  lOff, assuming a
de20: 20 73 65 63 74 6f 72 20 0a 2a 2a 20 73 69 7a 65   sector .** size
de30: 20 6f 66 20 70 50 61 67 65 72 2d 3e 73 65 63 74   of pPager->sect
de40: 6f 72 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a  orSize bytes..**
de50: 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65  .** i.e for a se
de60: 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32  ctor size of 512
de70: 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 61 67 65 72 2e  :.**.**   Pager.
de80: 6a 6f 75 72 6e 61 6c 4f 66 66 20 20 20 20 20 20  journalOff      
de90: 20 20 20 20 52 65 74 75 72 6e 20 76 61 6c 75 65      Return value
dea0: 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .**   ----------
deb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
ded0: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
dee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a               0.*
def0: 2a 20 20 20 35 31 32 20 20 20 20 20 20 20 20 20  *   512         
df00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31                51
df10: 32 0a 2a 2a 20 20 20 31 30 30 20 20 20 20 20 20  2.**   100      
df20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df30: 20 35 31 32 0a 2a 2a 20 20 20 32 30 30 30 20 20   512.**   2000  
df40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df50: 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a      2048.** .*/.
df60: 73 74 61 74 69 63 20 69 36 34 20 6a 6f 75 72 6e  static i64 journ
df70: 61 6c 48 64 72 4f 66 66 73 65 74 28 50 61 67 65  alHdrOffset(Page
df80: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36  r *pPager){.  i6
df90: 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  4 offset = 0;.  
dfa0: 69 36 34 20 63 20 3d 20 70 50 61 67 65 72 2d 3e  i64 c = pPager->
dfb0: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66  journalOff;.  if
dfc0: 28 20 63 20 29 7b 0a 20 20 20 20 6f 66 66 73 65  ( c ){.    offse
dfd0: 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e  t = ((c-1)/JOURN
dfe0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
dff0: 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c  ) + 1) * JOURNAL
e000: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
e010: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f  .  }.  assert( o
e020: 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44  ffset%JOURNAL_HD
e030: 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 30 20  R_SZ(pPager)==0 
e040: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66  );.  assert( off
e050: 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65  set>=c );.  asse
e060: 72 74 28 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a  rt( (offset-c)<J
e070: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
e080: 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72  ager) );.  retur
e090: 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a  n offset;.}../*.
e0a0: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
e0b0: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
e0c0: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
e0d0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ion is called..*
e0e0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
e0f0: 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  on is a no-op if
e100: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
e110: 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 77  e has not been w
e120: 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 77 69 74  ritten to.** wit
e130: 68 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  hin the current 
e140: 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 2e 65  transaction (i.e
e150: 2e 20 69 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e  . if Pager.journ
e160: 61 6c 4f 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a  alOff==0)..**.**
e170: 20 49 66 20 64 6f 54 72 75 6e 63 61 74 65 20 69   If doTruncate i
e180: 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74 68  s non-zero or th
e190: 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53  e Pager.journalS
e1a0: 69 7a 65 4c 69 6d 69 74 20 76 61 72 69 61 62 6c  izeLimit variabl
e1b0: 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30  e is.** set to 0
e1c0: 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20  , then truncate 
e1d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
e1e0: 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69   to zero bytes i
e1f0: 6e 20 73 69 7a 65 2e 20 4f 74 68 65 72 77 69 73  n size. Otherwis
e200: 65 2c 0a 2a 2a 20 7a 65 72 6f 20 74 68 65 20 32  e,.** zero the 2
e210: 38 2d 62 79 74 65 20 68 65 61 64 65 72 20 61 74  8-byte header at
e220: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
e230: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
e240: 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 20  In either case, 
e250: 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 72  .** if the pager
e260: 20 69 73 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79   is not in no-sy
e270: 6e 63 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68  nc mode, sync th
e280: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
e290: 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 61  mmediately .** a
e2a0: 66 74 65 72 20 77 72 69 74 69 6e 67 20 6f 72 20  fter writing or 
e2b0: 74 72 75 6e 63 61 74 69 6e 67 20 69 74 2e 0a 2a  truncating it..*
e2c0: 2a 0a 2a 2a 20 49 66 20 50 61 67 65 72 2e 6a 6f  *.** If Pager.jo
e2d0: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 69  urnalSizeLimit i
e2e0: 73 20 73 65 74 20 74 6f 20 61 20 70 6f 73 69 74  s set to a posit
e2f0: 69 76 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  ive, non-zero va
e300: 6c 75 65 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c 6c  lue, and.** foll
e310: 6f 77 69 6e 67 20 74 68 65 20 74 72 75 6e 63 61  owing the trunca
e320: 74 69 6f 6e 20 6f 72 20 7a 65 72 6f 69 6e 67 20  tion or zeroing 
e330: 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 20  described above 
e340: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
e350: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
e360: 20 69 6e 20 62 79 74 65 73 20 69 73 20 6c 61 72   in bytes is lar
e370: 67 65 72 20 74 68 61 6e 20 74 68 69 73 20 76 61  ger than this va
e380: 6c 75 65 2c 20 74 68 65 6e 20 74 72 75 6e 63 61  lue, then trunca
e390: 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  te the.** journa
e3a0: 6c 20 66 69 6c 65 20 74 6f 20 50 61 67 65 72 2e  l file to Pager.
e3b0: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
e3c0: 20 62 79 74 65 73 2e 20 54 68 65 20 6a 6f 75 72   bytes. The jour
e3d0: 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a  nal file does.**
e3e0: 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
e3f0: 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67  synced following
e400: 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e   this operation.
e410: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20  .**.** If an IO 
e420: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 62  error occurs, ab
e430: 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67  andon processing
e440: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
e450: 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  IO error code..*
e460: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  * Otherwise, ret
e470: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  urn SQLITE_OK..*
e480: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 7a 65 72  /.static int zer
e490: 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65  oJournalHdr(Page
e4a0: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 64  r *pPager, int d
e4b0: 6f 54 72 75 6e 63 61 74 65 29 7b 0a 20 20 69 6e  oTruncate){.  in
e4c0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
e4d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4f0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
e500: 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  /.  assert( isOp
e510: 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
e520: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73 71  );.  assert( !sq
e530: 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 49 73 49 6e  lite3JournalIsIn
e540: 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 6a  Memory(pPager->j
e550: 66 64 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61  fd) );.  if( pPa
e560: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
e570: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 36 34  ){.    const i64
e580: 20 69 4c 69 6d 69 74 20 3d 20 70 50 61 67 65 72   iLimit = pPager
e590: 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  ->journalSizeLim
e5a0: 69 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20  it;    /* Local 
e5b0: 63 61 63 68 65 20 6f 66 20 6a 73 6c 20 2a 2f 0a  cache of jsl */.
e5c0: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a  .    IOTRACE(("J
e5d0: 5a 45 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20 70  ZEROHDR %p\n", p
e5e0: 50 61 67 65 72 29 29 0a 20 20 20 20 69 66 28 20  Pager)).    if( 
e5f0: 64 6f 54 72 75 6e 63 61 74 65 20 7c 7c 20 69 4c  doTruncate || iL
e600: 69 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  imit==0 ){.     
e610: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
e620: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
e630: 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  jfd, 0);.    }el
e640: 73 65 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63  se{.      static
e650: 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 65 72 6f   const char zero
e660: 48 64 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a 20  Hdr[28] = {0};. 
e670: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
e680: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
e690: 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20 73  >jfd, zeroHdr, s
e6a0: 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c 20  izeof(zeroHdr), 
e6b0: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  0);.    }.    if
e6c0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
e6d0: 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  && !pPager->noSy
e6e0: 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  nc ){.      rc =
e6f0: 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
e700: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49  Pager->jfd, SQLI
e710: 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59  TE_SYNC_DATAONLY
e720: 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61  |pPager->syncFla
e730: 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  gs);.    }..    
e740: 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
e750: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
e760: 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 62 75   is committed bu
e770: 74 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  t the write lock
e780: 20 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c   .    ** is stil
e790: 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69  l held on the fi
e7a0: 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  le. If there is 
e7b0: 61 20 73 69 7a 65 20 6c 69 6d 69 74 20 63 6f 6e  a size limit con
e7c0: 66 69 67 75 72 65 64 20 66 6f 72 20 0a 20 20 20  figured for .   
e7d0: 20 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74 65   ** the persiste
e7e0: 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  nt journal and t
e7f0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
e800: 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 75 6d  currently consum
e810: 65 73 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20 73  es more.    ** s
e820: 70 61 63 65 20 74 68 61 6e 20 74 68 61 74 20 6c  pace than that l
e830: 69 6d 69 74 20 61 6c 6c 6f 77 73 20 66 6f 72 2c  imit allows for,
e840: 20 74 72 75 6e 63 61 74 65 20 69 74 20 6e 6f 77   truncate it now
e850: 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  . There is no ne
e860: 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 73 79 6e  ed.    ** to syn
e870: 63 20 74 68 65 20 66 69 6c 65 20 66 6f 6c 6c 6f  c the file follo
e880: 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74  wing this operat
e890: 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
e8a0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
e8b0: 4b 20 26 26 20 69 4c 69 6d 69 74 3e 30 20 29 7b  K && iLimit>0 ){
e8c0: 0a 20 20 20 20 20 20 69 36 34 20 73 7a 3b 0a 20  .      i64 sz;. 
e8d0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
e8e0: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
e8f0: 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a 20  er->jfd, &sz);. 
e900: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
e910: 49 54 45 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c 69  ITE_OK && sz>iLi
e920: 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  mit ){.        r
e930: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
e940: 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  ncate(pPager->jf
e950: 64 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20  d, iLimit);.    
e960: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
e970: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
e980: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
e990: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
e9a0: 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  n when this rout
e9b0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41  ine is called. A
e9c0: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64   journal.** head
e9d0: 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  er (JOURNAL_HDR_
e9e0: 53 5a 20 62 79 74 65 73 29 20 69 73 20 77 72 69  SZ bytes) is wri
e9f0: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
ea00: 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68  urnal file at th
ea10: 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63  e.** current loc
ea20: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ation..**.** The
ea30: 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20   format for the 
ea40: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
ea50: 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  s as follows:.**
ea60: 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69   - 8 bytes: Magi
ea70: 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f  c identifying jo
ea80: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a  urnal format..**
ea90: 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62   - 4 bytes: Numb
eaa0: 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e  er of records in
eab0: 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20   journal, or -1 
eac0: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20  no-sync mode is 
ead0: 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  on..** - 4 bytes
eae0: 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20  : Random number 
eaf0: 75 73 65 64 20 66 6f 72 20 70 61 67 65 20 68 61  used for page ha
eb00: 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  sh..** - 4 bytes
eb10: 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61  : Initial databa
eb20: 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a  se page count..*
eb30: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63  * - 4 bytes: Sec
eb40: 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62 79  tor size used by
eb50: 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
eb60: 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75  t wrote this jou
eb70: 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  rnal..** - 4 byt
eb80: 65 73 3a 20 44 61 74 61 62 61 73 65 20 70 61 67  es: Database pag
eb90: 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20 46  e size..** .** F
eba0: 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55 52  ollowed by (JOUR
ebb0: 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29  NAL_HDR_SZ - 28)
ebc0: 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64   bytes of unused
ebd0: 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69   space..*/.stati
ebe0: 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e  c int writeJourn
ebf0: 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61  alHdr(Pager *pPa
ec00: 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
ec10: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
ec20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
ec30: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
ec40: 63 68 61 72 20 2a 7a 48 65 61 64 65 72 20 3d 20  char *zHeader = 
ec50: 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
ec60: 65 3b 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79  e;  /* Temporary
ec70: 20 73 70 61 63 65 20 75 73 65 64 20 74 6f 20 62   space used to b
ec80: 75 69 6c 64 20 68 65 61 64 65 72 20 2a 2f 0a 20  uild header */. 
ec90: 20 75 33 32 20 6e 48 65 61 64 65 72 20 3d 20 28   u32 nHeader = (
eca0: 75 33 32 29 70 50 61 67 65 72 2d 3e 70 61 67 65  u32)pPager->page
ecb0: 53 69 7a 65 3b 2f 2a 20 53 69 7a 65 20 6f 66 20  Size;/* Size of 
ecc0: 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74  buffer pointed t
ecd0: 6f 20 62 79 20 7a 48 65 61 64 65 72 20 2a 2f 0a  o by zHeader */.
ece0: 20 20 75 33 32 20 6e 57 72 69 74 65 3b 20 20 20    u32 nWrite;   
ecf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed00: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
ed10: 66 20 68 65 61 64 65 72 20 73 65 63 74 6f 72 20  f header sector 
ed20: 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74  written */.  int
ed30: 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
ed40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed50: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
ed60: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69   */..  assert( i
ed70: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
ed80: 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f  d) );      /* Jo
ed90: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
eda0: 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 69  be open. */..  i
edb0: 66 28 20 6e 48 65 61 64 65 72 3e 4a 4f 55 52 4e  f( nHeader>JOURN
edc0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
edd0: 29 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72  ) ){.    nHeader
ede0: 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   = JOURNAL_HDR_S
edf0: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  Z(pPager);.  }..
ee00: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
ee10: 65 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  e active savepoi
ee20: 6e 74 73 20 61 6e 64 20 61 6e 79 20 6f 66 20 74  nts and any of t
ee30: 68 65 6d 20 77 65 72 65 20 63 72 65 61 74 65 64  hem were created
ee40: 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65   .  ** since the
ee50: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 6a 6f 75   most recent jou
ee60: 72 6e 61 6c 20 68 65 61 64 65 72 20 77 61 73 20  rnal header was 
ee70: 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20  written, update 
ee80: 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 53  the .  ** PagerS
ee90: 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
eea0: 73 65 74 20 66 69 65 6c 64 73 20 6e 6f 77 2e 0a  set fields now..
eeb0: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b    */.  for(ii=0;
eec0: 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76   ii<pPager->nSav
eed0: 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20  epoint; ii++){. 
eee0: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61     if( pPager->a
eef0: 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48  Savepoint[ii].iH
ef00: 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a 20  drOffset==0 ){. 
ef10: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61       pPager->aSa
ef20: 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72  vepoint[ii].iHdr
ef30: 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d  Offset = pPager-
ef40: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20  >journalOff;.   
ef50: 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72   }.  }..  pPager
ef60: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70  ->journalHdr = p
ef70: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
ef80: 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66  f = journalHdrOf
ef90: 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 0a 20  fset(pPager);.. 
efa0: 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69 74 65 20   /* .  ** Write 
efb0: 74 68 65 20 6e 52 65 63 20 46 69 65 6c 64 20 2d  the nRec Field -
efc0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
efd0: 61 67 65 20 72 65 63 6f 72 64 73 20 74 68 61 74  age records that
efe0: 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a 20 20 2a   follow this.  *
eff0: 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  * journal header
f000: 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72 6f  . Normally, zero
f010: 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74   is written to t
f020: 68 69 73 20 76 61 6c 75 65 20 61 74 20 74 68 69  his value at thi
f030: 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20 41 66 74  s time..  ** Aft
f040: 65 72 20 74 68 65 20 72 65 63 6f 72 64 73 20 61  er the records a
f050: 72 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  re added to the 
f060: 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 74 68 65  journal (and the
f070: 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 65 64 2c   journal synced,
f080: 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20 66 75 6c   .  ** if in ful
f090: 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c 20 74 68  l-sync mode), th
f0a0: 65 20 7a 65 72 6f 20 69 73 20 6f 76 65 72 77 72  e zero is overwr
f0b0: 69 74 74 65 6e 20 77 69 74 68 20 74 68 65 20 74  itten with the t
f0c0: 72 75 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  rue number.  ** 
f0d0: 6f 66 20 72 65 63 6f 72 64 73 20 28 73 65 65 20  of records (see 
f0e0: 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 29 2e 0a  syncJournal())..
f0f0: 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66 61 73 74    **.  ** A fast
f100: 65 72 20 61 6c 74 65 72 6e 61 74 69 76 65 20 69  er alternative i
f110: 73 20 74 6f 20 77 72 69 74 65 20 30 78 46 46 46  s to write 0xFFF
f120: 46 46 46 46 46 20 74 6f 20 74 68 65 20 6e 52 65  FFFFF to the nRe
f130: 63 20 66 69 65 6c 64 2e 20 57 68 65 6e 0a 20 20  c field. When.  
f140: 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20 6a  ** reading the j
f150: 6f 75 72 6e 61 6c 20 74 68 69 73 20 76 61 6c 75  ournal this valu
f160: 65 20 74 65 6c 6c 73 20 53 51 4c 69 74 65 20 74  e tells SQLite t
f170: 6f 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  o assume that th
f180: 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f 66 20 74  e.  ** rest of t
f190: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
f1a0: 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69 64 20 70  contains valid p
f1b0: 61 67 65 20 72 65 63 6f 72 64 73 2e 20 54 68 69  age records. Thi
f1c0: 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20 2a  s assumption.  *
f1d0: 2a 20 69 73 20 64 61 6e 67 65 72 6f 75 73 2c 20  * is dangerous, 
f1e0: 61 73 20 69 66 20 61 20 66 61 69 6c 75 72 65 20  as if a failure 
f1f0: 6f 63 63 75 72 72 65 64 20 77 68 69 6c 73 74 20  occurred whilst 
f200: 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a  writing to the j
f210: 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65  ournal.  ** file
f220: 20 69 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20   it may contain 
f230: 73 6f 6d 65 20 67 61 72 62 61 67 65 20 64 61 74  some garbage dat
f240: 61 2e 20 54 68 65 72 65 20 61 72 65 20 74 77 6f  a. There are two
f250: 20 73 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a 20   scenarios.  ** 
f260: 77 68 65 72 65 20 74 68 69 73 20 72 69 73 6b 20  where this risk 
f270: 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a 0a  can be ignored:.
f280: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68    **.  **   * Wh
f290: 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73 20  en the pager is 
f2a0: 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e  in no-sync mode.
f2b0: 20 43 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e 20   Corruption can 
f2c0: 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20 20  follow a.  **   
f2d0: 20 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20    power failure 
f2e0: 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e 79  in this case any
f2f0: 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  way..  **.  **  
f300: 20 2a 20 57 68 65 6e 20 74 68 65 20 53 51 4c 49   * When the SQLI
f310: 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
f320: 50 45 4e 44 20 66 6c 61 67 20 69 73 20 73 65 74  PEND flag is set
f330: 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74 65 65  . This guarantee
f340: 73 0a 20 20 2a 2a 20 20 20 20 20 74 68 61 74 20  s.  **     that 
f350: 67 61 72 62 61 67 65 20 64 61 74 61 20 69 73 20  garbage data is 
f360: 6e 65 76 65 72 20 61 70 70 65 6e 64 65 64 20 74  never appended t
f370: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
f380: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  le..  */.  asser
f390: 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
f3a0: 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  ->fd) || pPager-
f3b0: 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 69 66 28  >noSync );.  if(
f3c0: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
f3d0: 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72  || (pPager->jour
f3e0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
f3f0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
f400: 59 29 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65  Y).   || (sqlite
f410: 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
f420: 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
f430: 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41  >fd)&SQLITE_IOCA
f440: 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 0a  P_SAFE_APPEND) .
f450: 20 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28    ){.    memcpy(
f460: 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61  zHeader, aJourna
f470: 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
f480: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a  JournalMagic));.
f490: 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a      put32bits(&z
f4a0: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
f4b0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30  ournalMagic)], 0
f4c0: 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 7d 65  xffffffff);.  }e
f4d0: 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  lse{.    memset(
f4e0: 7a 48 65 61 64 65 72 2c 20 30 2c 20 73 69 7a 65  zHeader, 0, size
f4f0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
f500: 29 2b 34 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  )+4);.  }..  /* 
f510: 54 68 65 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b  The random check
f520: 2d 68 61 73 68 20 69 6e 69 74 69 61 6c 69 7a 65  -hash initialize
f530: 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f  r */ .  sqlite3_
f540: 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  randomness(sizeo
f550: 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  f(pPager->cksumI
f560: 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63  nit), &pPager->c
f570: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74  ksumInit);.  put
f580: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
f590: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
f5a0: 61 67 69 63 29 2b 34 5d 2c 20 70 50 61 67 65 72  agic)+4], pPager
f5b0: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20  ->cksumInit);.  
f5c0: 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64  /* The initial d
f5d0: 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a  atabase size */.
f5e0: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
f5f0: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
f600: 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70  rnalMagic)+8], p
f610: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
f620: 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73 73  e);.  /* The ass
f630: 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65  umed sector size
f640: 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73   for this proces
f650: 73 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  s */.  put32bits
f660: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
f670: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
f680: 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65 63  12], pPager->sec
f690: 74 6f 72 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20  torSize);..  /* 
f6a0: 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 2a 2f  The page size */
f6b0: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
f6c0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
f6d0: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c  urnalMagic)+16],
f6e0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
f6f0: 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61  e);..  /* Initia
f700: 6c 69 7a 69 6e 67 20 74 68 65 20 74 61 69 6c 20  lizing the tail 
f710: 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 69 73  of the buffer is
f720: 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e 20   not necessary. 
f730: 20 45 76 65 72 79 74 68 69 6e 67 0a 20 20 2a 2a   Everything.  **
f740: 20 77 6f 72 6b 73 20 66 69 6e 64 20 69 66 20 74   works find if t
f750: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d  he following mem
f760: 73 65 74 28 29 20 69 73 20 6f 6d 69 74 74 65 64  set() is omitted
f770: 2e 20 20 42 75 74 20 69 6e 69 74 69 61 6c 69 7a  .  But initializ
f780: 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d  ing.  ** the mem
f790: 6f 72 79 20 70 72 65 76 65 6e 74 73 20 76 61 6c  ory prevents val
f7a0: 67 72 69 6e 64 20 66 72 6f 6d 20 63 6f 6d 70 6c  grind from compl
f7b0: 61 69 6e 69 6e 67 2c 20 73 6f 20 77 65 20 61 72  aining, so we ar
f7c0: 65 20 77 69 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a  e willing to.  *
f7d0: 2a 20 74 61 6b 65 20 74 68 65 20 70 65 72 66 6f  * take the perfo
f7e0: 72 6d 61 6e 63 65 20 68 69 74 2e 0a 20 20 2a 2f  rmance hit..  */
f7f0: 0a 20 20 6d 65 6d 73 65 74 28 26 7a 48 65 61 64  .  memset(&zHead
f800: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
f810: 61 6c 4d 61 67 69 63 29 2b 32 30 5d 2c 20 30 2c  alMagic)+20], 0,
f820: 0a 20 20 20 20 20 20 20 20 20 6e 48 65 61 64 65  .         nHeade
f830: 72 2d 28 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  r-(sizeof(aJourn
f840: 61 6c 4d 61 67 69 63 29 2b 32 30 29 29 3b 0a 0a  alMagic)+20));..
f850: 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20    /* In theory, 
f860: 69 74 20 69 73 20 6f 6e 6c 79 20 6e 65 63 65 73  it is only neces
f870: 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 74 68  sary to write th
f880: 65 20 32 38 20 62 79 74 65 73 20 74 68 61 74 20  e 28 bytes that 
f890: 74 68 65 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  the .  ** journa
f8a0: 6c 20 68 65 61 64 65 72 20 63 6f 6e 73 75 6d 65  l header consume
f8b0: 73 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s to the journal
f8c0: 20 66 69 6c 65 20 68 65 72 65 2e 20 54 68 65 6e   file here. Then
f8d0: 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 0a   increment the .
f8e0: 20 20 2a 2a 20 50 61 67 65 72 2e 6a 6f 75 72 6e    ** Pager.journ
f8f0: 61 6c 4f 66 66 20 76 61 72 69 61 62 6c 65 20 62  alOff variable b
f900: 79 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  y JOURNAL_HDR_SZ
f910: 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78   so that the nex
f920: 74 20 0a 20 20 2a 2a 20 72 65 63 6f 72 64 20 69  t .  ** record i
f930: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
f940: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 63 74 6f   following secto
f950: 72 20 28 6c 65 61 76 69 6e 67 20 61 20 67 61 70  r (leaving a gap
f960: 20 69 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 2a   in the file.  *
f970: 2a 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69  * that will be i
f980: 6d 70 6c 69 63 69 74 6c 79 20 66 69 6c 6c 65 64  mplicitly filled
f990: 20 69 6e 20 62 79 20 74 68 65 20 4f 53 29 2e 0a   in by the OS)..
f9a0: 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f 77 65 76 65    **.  ** Howeve
f9b0: 72 20 69 74 20 68 61 73 20 62 65 65 6e 20 64 69  r it has been di
f9c0: 73 63 6f 76 65 72 65 64 20 74 68 61 74 20 6f 6e  scovered that on
f9d0: 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 74 68   some systems th
f9e0: 69 73 20 70 61 74 74 65 72 6e 20 63 61 6e 20 0a  is pattern can .
f9f0: 20 20 2a 2a 20 62 65 20 73 69 67 6e 69 66 69 63    ** be signific
fa00: 61 6e 74 6c 79 20 73 6c 6f 77 65 72 20 74 68 61  antly slower tha
fa10: 6e 20 63 6f 6e 74 69 67 75 6f 75 73 6c 79 20 77  n contiguously w
fa20: 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74  riting data to t
fa30: 68 65 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 65 76  he file,.  ** ev
fa40: 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73  en if that means
fa50: 20 65 78 70 6c 69 63 69 74 6c 79 20 77 72 69 74   explicitly writ
fa60: 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65 20  ing data to the 
fa70: 62 6c 6f 63 6b 20 6f 66 20 0a 20 20 2a 2a 20 28  block of .  ** (
fa80: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d  JOURNAL_HDR_SZ -
fa90: 20 32 38 29 20 62 79 74 65 73 20 74 68 61 74 20   28) bytes that 
faa0: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64  will not be used
fab0: 2e 20 53 6f 20 74 68 61 74 20 69 73 20 77 68 61  . So that is wha
fac0: 74 0a 20 20 2a 2a 20 69 73 20 64 6f 6e 65 2e 20  t.  ** is done. 
fad0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c  .  **.  ** The l
fae0: 6f 6f 70 20 69 73 20 72 65 71 75 69 72 65 64 20  oop is required 
faf0: 68 65 72 65 20 69 6e 20 63 61 73 65 20 74 68 65  here in case the
fb00: 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20   sector-size is 
fb10: 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
fb20: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 70  .  ** database p
fb30: 61 67 65 20 73 69 7a 65 2e 20 53 69 6e 63 65 20  age size. Since 
fb40: 74 68 65 20 7a 48 65 61 64 65 72 20 62 75 66 66  the zHeader buff
fb50: 65 72 20 69 73 20 6f 6e 6c 79 20 50 61 67 65 72  er is only Pager
fb60: 2e 70 61 67 65 53 69 7a 65 0a 20 20 2a 2a 20 62  .pageSize.  ** b
fb70: 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 6d 6f  ytes in size, mo
fb80: 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 61 6c 6c  re than one call
fb90: 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 57 72 69   to sqlite3OsWri
fba0: 74 65 28 29 20 6d 61 79 20 62 65 20 72 65 71 75  te() may be requ
fbb0: 69 72 65 64 0a 20 20 2a 2a 20 74 6f 20 70 6f 70  ired.  ** to pop
fbc0: 75 6c 61 74 65 20 74 68 65 20 65 6e 74 69 72 65  ulate the entire
fbd0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
fbe0: 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20  sector..  */ .  
fbf0: 66 6f 72 28 6e 57 72 69 74 65 3d 30 3b 20 72 63  for(nWrite=0; rc
fc00: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72  ==SQLITE_OK&&nWr
fc10: 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ite<JOURNAL_HDR_
fc20: 53 5a 28 70 50 61 67 65 72 29 3b 20 6e 57 72 69  SZ(pPager); nWri
fc30: 74 65 2b 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20  te+=nHeader){.  
fc40: 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52    IOTRACE(("JHDR
fc50: 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20   %p %lld %d\n", 
fc60: 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
fc70: 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61  journalHdr, nHea
fc80: 64 65 72 29 29 0a 20 20 20 20 72 63 20 3d 20 73  der)).    rc = s
fc90: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
fca0: 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64  ager->jfd, zHead
fcb0: 65 72 2c 20 6e 48 65 61 64 65 72 2c 20 70 50 61  er, nHeader, pPa
fcc0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
fcd0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
fce0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
fcf0: 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   <= pPager->jour
fd00: 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20 70 50  nalOff );.    pP
fd10: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
fd20: 20 2b 3d 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d   += nHeader;.  }
fd30: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
fd40: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
fd50: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
fd60: 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20   open when this 
fd70: 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75  is called. A jou
fd80: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65  rnal header file
fd90: 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52  .** (JOURNAL_HDR
fda0: 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 72 65  _SZ bytes) is re
fdb0: 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72  ad from the curr
fdc0: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20  ent location in 
fdd0: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  the journal.** f
fde0: 69 6c 65 2e 20 54 68 65 20 63 75 72 72 65 6e 74  ile. The current
fdf0: 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65   location in the
fe00: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
fe10: 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20 70 50 61   given by.** pPa
fe20: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2e  ger->journalOff.
fe30: 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62   See comments ab
fe40: 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20 77 72 69  ove function wri
fe50: 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 66  teJournalHdr() f
fe60: 6f 72 0a 2a 2a 20 61 20 64 65 73 63 72 69 70 74  or.** a descript
fe70: 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ion of the journ
fe80: 61 6c 20 68 65 61 64 65 72 20 66 6f 72 6d 61 74  al header format
fe90: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68  ..**.** If the h
fea0: 65 61 64 65 72 20 69 73 20 72 65 61 64 20 73 75  eader is read su
feb0: 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a 70 4e 52  ccessfully, *pNR
fec0: 65 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ec is set to the
fed0: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61   number of.** pa
fee0: 67 65 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f  ge records follo
fef0: 77 69 6e 67 20 74 68 69 73 20 68 65 61 64 65 72  wing this header
ff00: 20 61 6e 64 20 2a 70 44 62 53 69 7a 65 20 69 73   and *pDbSize is
ff10: 20 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65   set to the size
ff20: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
ff30: 61 73 65 20 62 65 66 6f 72 65 20 74 68 65 20 74  ase before the t
ff40: 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e  ransaction began
ff50: 2c 20 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f  , in pages. Also
ff60: 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  , pPager->cksumI
ff70: 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  nit.** is set to
ff80: 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20   the value read 
ff90: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
ffa0: 20 68 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f   header. SQLITE_
ffb0: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  OK is returned.*
ffc0: 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  * in this case..
ffd0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  **.** If the jou
ffe0: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65  rnal header file
fff0: 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 63   appears to be c
10000 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45  orrupted, SQLITE
10010 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75  _DONE is.** retu
10020 72 6e 65 64 20 61 6e 64 20 2a 70 4e 52 65 63 20  rned and *pNRec 
10030 61 6e 64 20 2a 50 44 62 53 69 7a 65 20 61 72 65  and *PDbSize are
10040 20 75 6e 64 65 66 69 6e 65 64 2e 20 20 49 66 20   undefined.  If 
10050 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62  JOURNAL_HDR_SZ b
10060 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62  ytes.** cannot b
10070 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
10080 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20  journal file an 
10090 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
100a0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
100b0 63 20 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61  c int readJourna
100c0 6c 48 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70  lHdr(.  Pager *p
100d0 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
100e0 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62       /* Pager ob
100f0 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ject */.  int is
10100 48 6f 74 2c 0a 20 20 69 36 34 20 6a 6f 75 72 6e  Hot,.  i64 journ
10110 61 6c 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20  alSize,         
10120 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
10130 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20  he open journal 
10140 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  file in bytes */
10150 0a 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 20  .  u32 *pNRec,  
10160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10170 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 72 65  /* OUT: Value re
10180 61 64 20 66 72 6f 6d 20 74 68 65 20 6e 52 65 63  ad from the nRec
10190 20 66 69 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20   field */.  u32 
101a0 2a 70 44 62 53 69 7a 65 20 20 20 20 20 20 20 20  *pDbSize        
101b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
101c0 20 56 61 6c 75 65 20 6f 66 20 6f 72 69 67 69 6e   Value of origin
101d0 61 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  al database size
101e0 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69   field */.){.  i
101f0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
10200 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
10210 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
10220 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d  unsigned char aM
10230 61 67 69 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20  agic[8];     /* 
10240 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64  A buffer to hold
10250 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65   the magic heade
10260 72 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f  r */.  i64 iHdrO
10270 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
10280 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
10290 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
102a0 62 65 69 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 20  being read */.. 
102b0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
102c0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20  pPager->jfd) ); 
102d0 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20       /* Journal 
102e0 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
102f0 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76 61  n. */..  /* Adva
10300 6e 63 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  nce Pager.journa
10310 6c 4f 66 66 20 74 6f 20 74 68 65 20 73 74 61 72  lOff to the star
10320 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20 73 65  t of the next se
10330 63 74 6f 72 2e 20 49 66 20 74 68 65 0a 20 20 2a  ctor. If the.  *
10340 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  * journal file i
10350 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20  s too small for 
10360 74 68 65 72 65 20 74 6f 20 62 65 20 61 20 68 65  there to be a he
10370 61 64 65 72 20 73 74 6f 72 65 64 20 61 74 20 74  ader stored at t
10380 68 69 73 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c 20  his.  ** point, 
10390 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
103a0 4e 45 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65  NE..  */.  pPage
103b0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
103c0 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
103d0 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
103e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
103f0 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  ff+JOURNAL_HDR_S
10400 5a 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72  Z(pPager) > jour
10410 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  nalSize ){.    r
10420 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
10430 45 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66 66  E;.  }.  iHdrOff
10440 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
10450 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 52 65 61  alOff;..  /* Rea
10460 64 20 69 6e 20 74 68 65 20 66 69 72 73 74 20 38  d in the first 8
10470 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f   bytes of the jo
10480 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 49 66  urnal header. If
10490 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74   they do not mat
104a0 63 68 0a 20 20 2a 2a 20 74 68 65 20 20 6d 61 67  ch.  ** the  mag
104b0 69 63 20 73 74 72 69 6e 67 20 66 6f 75 6e 64 20  ic string found 
104c0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
104d0 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61  each journal hea
104e0 64 65 72 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a  der, return.  **
104f0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66   SQLITE_DONE. If
10500 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
10510 75 72 73 2c 20 72 65 74 75 72 6e 20 61 6e 20 65  urs, return an e
10520 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72  rror code. Other
10530 77 69 73 65 2c 0a 20 20 2a 2a 20 70 72 6f 63 65  wise,.  ** proce
10540 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  ed..  */.  if( i
10550 73 48 6f 74 20 7c 7c 20 69 48 64 72 4f 66 66 21  sHot || iHdrOff!
10560 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
10570 48 64 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  Hdr ){.    rc = 
10580 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
10590 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69  ager->jfd, aMagi
105a0 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63  c, sizeof(aMagic
105b0 29 2c 20 69 48 64 72 4f 66 66 29 3b 0a 20 20 20  ), iHdrOff);.   
105c0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
105d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
105e0 7d 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70  }.    if( memcmp
105f0 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61  (aMagic, aJourna
10600 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
10610 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20  Magic))!=0 ){.  
10620 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10630 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  E_DONE;.    }.  
10640 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  }..  /* Read the
10650 20 66 69 72 73 74 20 74 68 72 65 65 20 33 32 2d   first three 32-
10660 62 69 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68  bit fields of th
10670 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
10680 3a 20 54 68 65 20 6e 52 65 63 0a 20 20 2a 2a 20  : The nRec.  ** 
10690 66 69 65 6c 64 2c 20 74 68 65 20 63 68 65 63 6b  field, the check
106a0 73 75 6d 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20  sum-initializer 
106b0 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
106c0 20 73 69 7a 65 20 61 74 20 74 68 65 20 73 74 61   size at the sta
106d0 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74  rt.  ** of the t
106e0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 52 65 74 75  ransaction. Retu
106f0 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
10700 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
10710 73 20 77 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20  s wrong..  */.  
10720 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
10730 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
10740 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
10750 72 4f 66 66 2b 38 2c 20 70 4e 52 65 63 29 29 0a  rOff+8, pNRec)).
10760 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
10770 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
10780 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
10790 48 64 72 4f 66 66 2b 31 32 2c 20 26 70 50 61 67  HdrOff+12, &pPag
107a0 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 29 0a  er->cksumInit)).
107b0 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
107c0 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
107d0 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
107e0 48 64 72 4f 66 66 2b 31 36 2c 20 70 44 62 53 69  HdrOff+16, pDbSi
107f0 7a 65 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  ze)).  ){.    re
10800 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
10810 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
10820 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20  nalOff==0 ){.   
10830 20 75 33 32 20 69 50 61 67 65 53 69 7a 65 3b 20   u32 iPageSize; 
10840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10850 20 50 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64   Page-size field
10860 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   of journal head
10870 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 69 53  er */.    u32 iS
10880 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20  ectorSize;      
10890 20 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72         /* Sector
108a0 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a  -size field of j
108b0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f  ournal header */
108c0 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  ..    /* Read th
108d0 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20  e page-size and 
108e0 73 65 63 74 6f 72 2d 73 69 7a 65 20 6a 6f 75 72  sector-size jour
108f0 6e 61 6c 20 68 65 61 64 65 72 20 66 69 65 6c 64  nal header field
10900 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 53 51  s. */.    if( SQ
10910 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
10920 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
10930 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32  ->jfd, iHdrOff+2
10940 30 2c 20 26 69 53 65 63 74 6f 72 53 69 7a 65 29  0, &iSectorSize)
10950 29 0a 20 20 20 20 20 7c 7c 20 53 51 4c 49 54 45  ).     || SQLITE
10960 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
10970 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
10980 64 2c 20 69 48 64 72 4f 66 66 2b 32 34 2c 20 26  d, iHdrOff+24, &
10990 69 50 61 67 65 53 69 7a 65 29 29 0a 20 20 20 20  iPageSize)).    
109a0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
109b0 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
109c0 2a 20 56 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  * Versions of SQ
109d0 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 20 33 2e  Lite prior to 3.
109e0 35 2e 38 20 73 65 74 20 74 68 65 20 70 61 67 65  5.8 set the page
109f0 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74  -size field of t
10a00 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61  he.    ** journa
10a10 6c 20 68 65 61 64 65 72 20 74 6f 20 7a 65 72 6f  l header to zero
10a20 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
10a30 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20  assume that the 
10a40 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20  Pager.pageSize. 
10a50 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 69     ** variable i
10a60 73 20 61 6c 72 65 61 64 79 20 73 65 74 20 74 6f  s already set to
10a70 20 74 68 65 20 63 6f 72 72 65 63 74 20 70 61 67   the correct pag
10a80 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20  e size..    */. 
10a90 20 20 20 69 66 28 20 69 50 61 67 65 53 69 7a 65     if( iPageSize
10aa0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 50 61  ==0 ){.      iPa
10ab0 67 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  geSize = pPager-
10ac0 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d  >pageSize;.    }
10ad0 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74  ..    /* Check t
10ae0 68 61 74 20 74 68 65 20 76 61 6c 75 65 73 20 72  hat the values r
10af0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ead from the pag
10b00 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f  e-size and secto
10b10 72 2d 73 69 7a 65 20 66 69 65 6c 64 73 0a 20 20  r-size fields.  
10b20 20 20 2a 2a 20 61 72 65 20 77 69 74 68 69 6e 20    ** are within 
10b30 72 61 6e 67 65 2e 20 54 6f 20 62 65 20 27 69 6e  range. To be 'in
10b40 20 72 61 6e 67 65 27 2c 20 62 6f 74 68 20 76 61   range', both va
10b50 6c 75 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20  lues need to be 
10b60 61 20 70 6f 77 65 72 0a 20 20 20 20 2a 2a 20 6f  a power.    ** o
10b70 66 20 74 77 6f 20 67 72 65 61 74 65 72 20 74 68  f two greater th
10b80 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 35  an or equal to 5
10b90 31 32 20 6f 72 20 33 32 2c 20 61 6e 64 20 6e 6f  12 or 32, and no
10ba0 74 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  t greater than t
10bb0 68 65 69 72 20 0a 20 20 20 20 2a 2a 20 72 65 73  heir .    ** res
10bc0 70 65 63 74 69 76 65 20 63 6f 6d 70 69 6c 65 20  pective compile 
10bd0 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6c 69 6d  time maximum lim
10be0 69 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  its..    */.    
10bf0 69 66 28 20 69 50 61 67 65 53 69 7a 65 3c 35 31  if( iPageSize<51
10c00 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
10c10 20 20 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a     || iSectorSiz
10c20 65 3c 33 32 0a 20 20 20 20 20 7c 7c 20 69 50 61  e<32.     || iPa
10c30 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  geSize>SQLITE_MA
10c40 58 5f 50 41 47 45 5f 53 49 5a 45 20 7c 7c 20 69  X_PAGE_SIZE || i
10c50 53 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53  SectorSize>MAX_S
10c60 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20 20 20 20  ECTOR_SIZE.     
10c70 7c 7c 20 28 28 69 50 61 67 65 53 69 7a 65 2d 31  || ((iPageSize-1
10c80 29 26 69 50 61 67 65 53 69 7a 65 29 21 3d 30 20  )&iPageSize)!=0 
10c90 20 20 7c 7c 20 28 28 69 53 65 63 74 6f 72 53 69    || ((iSectorSi
10ca0 7a 65 2d 31 29 26 69 53 65 63 74 6f 72 53 69 7a  ze-1)&iSectorSiz
10cb0 65 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20  e)!=0 .    ){.  
10cc0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65 69      /* If the ei
10cd0 74 68 65 72 20 74 68 65 20 70 61 67 65 2d 73 69  ther the page-si
10ce0 7a 65 20 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a  ze or sector-siz
10cf0 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
10d00 2d 68 65 61 64 65 72 20 69 73 20 0a 20 20 20 20  -header is .    
10d10 20 20 2a 2a 20 69 6e 76 61 6c 69 64 2c 20 74 68    ** invalid, th
10d20 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  en the process t
10d30 68 61 74 20 77 72 6f 74 65 20 74 68 65 20 6a 6f  hat wrote the jo
10d40 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6d 75 73  urnal-header mus
10d50 74 20 68 61 76 65 20 0a 20 20 20 20 20 20 2a 2a  t have .      **
10d60 20 63 72 61 73 68 65 64 20 62 65 66 6f 72 65 20   crashed before 
10d70 74 68 65 20 68 65 61 64 65 72 20 77 61 73 20 73  the header was s
10d80 79 6e 63 65 64 2e 20 49 6e 20 74 68 69 73 20 63  ynced. In this c
10d90 61 73 65 20 73 74 6f 70 20 72 65 61 64 69 6e 67  ase stop reading
10da0 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a   .      ** the j
10db0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65  ournal file here
10dc0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
10dd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
10de0 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ONE;.    }..    
10df0 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 70 61  /* Update the pa
10e00 67 65 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68  ge-size to match
10e10 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20   the value read 
10e20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
10e30 2e 20 0a 20 20 20 20 2a 2a 20 55 73 65 20 61 20  . .    ** Use a 
10e40 74 65 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f  testcase() macro
10e50 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
10e60 61 74 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72  at malloc failur
10e70 65 20 77 69 74 68 69 6e 20 0a 20 20 20 20 2a 2a  e within .    **
10e80 20 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a   PagerSetPagesiz
10e90 65 28 29 20 69 73 20 74 65 73 74 65 64 2e 0a 20  e() is tested.. 
10ea0 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
10eb0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
10ec0 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26  gesize(pPager, &
10ed0 69 50 61 67 65 53 69 7a 65 2c 20 2d 31 29 3b 0a  iPageSize, -1);.
10ee0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
10ef0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a  !=SQLITE_OK );..
10f00 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
10f10 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72  e assumed sector
10f20 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74  -size to match t
10f30 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 62 79  he value used by
10f40 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f   .    ** the pro
10f50 63 65 73 73 20 74 68 61 74 20 63 72 65 61 74 65  cess that create
10f60 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20  d this journal. 
10f70 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  If this journal 
10f80 77 61 73 0a 20 20 20 20 2a 2a 20 63 72 65 61 74  was.    ** creat
10f90 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20  ed by a process 
10fa0 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69 73 20  other than this 
10fb0 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72  one, then this r
10fc0 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 69 73  outine.    ** is
10fd0 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72   being called fr
10fe0 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f  om within pager_
10ff0 70 6c 61 79 62 61 63 6b 28 29 2e 20 54 68 65 20  playback(). The 
11000 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20 20 20  local value.    
11010 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65 63 74  ** of Pager.sect
11020 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74 6f 72  orSize is restor
11030 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ed at the end of
11040 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20   that routine.. 
11050 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72     */.    pPager
11060 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 69  ->sectorSize = i
11070 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 7d 0a  SectorSize;.  }.
11080 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
11090 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c  alOff += JOURNAL
110a0 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
110b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
110c0 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ../*.** Write th
110d0 65 20 73 75 70 70 6c 69 65 64 20 6d 61 73 74 65  e supplied maste
110e0 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69  r journal name i
110f0 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
11100 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 0a 2a  file for pager.*
11110 2a 20 70 50 61 67 65 72 20 61 74 20 74 68 65 20  * pPager at the 
11120 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
11130 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  . The master jou
11140 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62  rnal name must b
11150 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68  e the last.** th
11160 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f 20 61  ing written to a
11170 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
11180 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
11190 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65  n full-sync mode
111a0 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  , the.** journal
111b0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
111c0 20 69 73 20 61 64 76 61 6e 63 65 64 20 74 6f 20   is advanced to 
111d0 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20  the next sector 
111e0 62 6f 75 6e 64 61 72 79 20 62 65 66 6f 72 65 0a  boundary before.
111f0 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69 73 20 77  ** anything is w
11200 72 69 74 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d  ritten. The form
11210 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2b  at is:.**.**   +
11220 20 34 20 62 79 74 65 73 3a 20 50 41 47 45 52 5f   4 bytes: PAGER_
11230 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20 20 2b 20  MJ_PGNO..**   + 
11240 4e 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20  N bytes: Master 
11250 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
11260 20 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a 20 20 20   in utf-8..**   
11270 2b 20 34 20 62 79 74 65 73 3a 20 4e 20 28 6c 65  + 4 bytes: N (le
11280 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72 20 6a  ngth of master j
11290 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 20 62  ournal name in b
112a0 79 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d 74 65 72  ytes, no nul-ter
112b0 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20 20 20 2b  minator)..**   +
112c0 20 34 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72   4 bytes: Master
112d0 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68   journal name ch
112e0 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20 2b 20 38  ecksum..**   + 8
112f0 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c   bytes: aJournal
11300 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54  Magic[]..**.** T
11310 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
11320 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d 20  l page checksum 
11330 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  is the sum of th
11340 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d  e bytes in the m
11350 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  aster.** journal
11360 20 6e 61 6d 65 2c 20 77 68 65 72 65 20 65 61 63   name, where eac
11370 68 20 62 79 74 65 20 69 73 20 69 6e 74 65 72 70  h byte is interp
11380 72 65 74 65 64 20 61 73 20 61 20 73 69 67 6e 65  reted as a signe
11390 64 20 38 2d 62 69 74 20 69 6e 74 65 67 65 72 2e  d 8-bit integer.
113a0 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65  .**.** If zMaste
113b0 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e  r is a NULL poin
113c0 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f 72 20  ter (occurs for 
113d0 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  a single databas
113e0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20  e transaction), 
113f0 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 69 73  .** this call is
11400 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
11410 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d 61 73  tic int writeMas
11420 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  terJournal(Pager
11430 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20   *pPager, const 
11440 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
11450 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
11460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11470 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
11480 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74  e */.  int nMast
11490 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
114a0 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
114b0 68 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61 73  h of string zMas
114c0 74 65 72 20 2a 2f 0a 20 20 69 36 34 20 69 48 64  ter */.  i64 iHd
114d0 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  rOff;           
114e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
114f0 73 65 74 20 6f 66 20 68 65 61 64 65 72 20 69 6e  set of header in
11500 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
11510 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69 7a 65 3b  .  i64 jrnlSize;
11520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11530 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a      /* Size of j
11540 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 6e 20 64  ournal file on d
11550 69 73 6b 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73  isk */.  u32 cks
11560 75 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  um = 0;         
11570 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65            /* Che
11580 63 6b 73 75 6d 20 6f 66 20 73 74 72 69 6e 67 20  cksum of string 
11590 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a 20 20 61 73  zMaster */..  as
115a0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 65  sert( pPager->se
115b0 74 4d 61 73 74 65 72 3d 3d 30 20 29 3b 0a 20 20  tMaster==0 );.  
115c0 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
115d0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
115e0 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20  .  if( !zMaster 
115f0 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  .   || pPager->j
11600 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
11610 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
11620 4d 4f 52 59 20 0a 20 20 20 7c 7c 20 21 69 73 4f  MORY .   || !isO
11630 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
11640 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
11650 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
11660 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
11670 74 65 72 20 3d 20 31 3b 0a 20 20 61 73 73 65 72  ter = 1;.  asser
11680 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
11690 61 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d  alHdr <= pPager-
116a0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 0a  >journalOff );..
116b0 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 74    /* Calculate t
116c0 68 65 20 6c 65 6e 67 74 68 20 69 6e 20 62 79 74  he length in byt
116d0 65 73 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b  es and the check
116e0 73 75 6d 20 6f 66 20 7a 4d 61 73 74 65 72 20 2a  sum of zMaster *
116f0 2f 0a 20 20 66 6f 72 28 6e 4d 61 73 74 65 72 3d  /.  for(nMaster=
11700 30 3b 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74  0; zMaster[nMast
11710 65 72 5d 3b 20 6e 4d 61 73 74 65 72 2b 2b 29 7b  er]; nMaster++){
11720 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d  .    cksum += zM
11730 61 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 0a  aster[nMaster];.
11740 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20    }..  /* If in 
11750 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  full-sync mode, 
11760 61 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e  advance to the n
11770 65 78 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20  ext disk sector 
11780 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20  before writing. 
11790 20 2a 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a   ** the master j
117a0 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69  ournal name. Thi
117b0 73 20 69 73 20 69 6e 20 63 61 73 65 20 74 68 65  s is in case the
117c0 20 70 72 65 76 69 6f 75 73 20 70 61 67 65 20 77   previous page w
117d0 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74  ritten to.  ** t
117e0 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61  he journal has a
117f0 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63  lready been sync
11800 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
11810 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
11820 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
11830 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72  ournalOff = jour
11840 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61  nalHdrOffset(pPa
11850 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 48 64 72  ger);.  }.  iHdr
11860 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Off = pPager->jo
11870 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20  urnalOff;..  /* 
11880 57 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72  Write the master
11890 20 6a 6f 75 72 6e 61 6c 20 64 61 74 61 20 74 6f   journal data to
118a0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
118b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
118c0 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f  .  ** an error o
118d0 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 74 68  ccurs, return th
118e0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20  e error code to 
118f0 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a 2f  the caller..  */
11900 0a 20 20 69 66 28 20 28 30 20 21 3d 20 28 72 63  .  if( (0 != (rc
11910 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
11920 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
11930 4f 66 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47  Off, PAGER_MJ_PG
11940 4e 4f 28 70 50 61 67 65 72 29 29 29 29 0a 20 20  NO(pPager)))).  
11950 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20   || (0 != (rc = 
11960 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
11970 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73  Pager->jfd, zMas
11980 74 65 72 2c 20 6e 4d 61 73 74 65 72 2c 20 69 48  ter, nMaster, iH
11990 64 72 4f 66 66 2b 34 29 29 29 0a 20 20 20 7c 7c  drOff+4))).   ||
119a0 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69   (0 != (rc = wri
119b0 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
119c0 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b  >jfd, iHdrOff+4+
119d0 6e 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72  nMaster, nMaster
119e0 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20  ))).   || (0 != 
119f0 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74  (rc = write32bit
11a00 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
11a10 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72  HdrOff+4+nMaster
11a20 2b 34 2c 20 63 6b 73 75 6d 29 29 29 0a 20 20 20  +4, cksum))).   
11a30 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73  || (0 != (rc = s
11a40 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
11a50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72  ager->jfd, aJour
11a60 6e 61 6c 4d 61 67 69 63 2c 20 38 2c 0a 20 20 20  nalMagic, 8,.   
11a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 48                iH
11a90 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b  drOff+4+nMaster+
11aa0 38 29 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  8))).  ){.    re
11ab0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
11ac0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
11ad0 66 20 2b 3d 20 28 6e 4d 61 73 74 65 72 2b 32 30  f += (nMaster+20
11ae0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
11af0 70 61 67 65 72 20 69 73 20 69 6e 20 70 65 72 69  pager is in peri
11b00 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f  stent-journal mo
11b10 64 65 2c 20 74 68 65 6e 20 74 68 65 20 70 68 79  de, then the phy
11b20 73 69 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72  sical .  ** jour
11b30 6e 61 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78 74  nal-file may ext
11b40 65 6e 64 20 70 61 73 74 20 74 68 65 20 65 6e 64  end past the end
11b50 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a   of the master-j
11b60 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a  ournal name.  **
11b70 20 61 6e 64 20 38 20 62 79 74 65 73 20 6f 66 20   and 8 bytes of 
11b80 6d 61 67 69 63 20 64 61 74 61 20 6a 75 73 74 20  magic data just 
11b90 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66  written to the f
11ba0 69 6c 65 2e 20 54 68 69 73 20 69 73 20 0a 20 20  ile. This is .  
11bb0 2a 2a 20 64 61 6e 67 65 72 6f 75 73 20 62 65 63  ** dangerous bec
11bc0 61 75 73 65 20 74 68 65 20 63 6f 64 65 20 74 6f  ause the code to
11bd0 20 72 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d   rollback a hot-
11be0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a  journal file.  *
11bf0 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62  * will not be ab
11c00 6c 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6d  le to find the m
11c10 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61  aster-journal na
11c20 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  me to determine 
11c30 0a 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f 72  .  ** whether or
11c40 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c   not the journal
11c50 20 69 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20   is hot. .  **. 
11c60 20 2a 2a 20 45 61 73 69 65 73 74 20 74 68 69 6e   ** Easiest thin
11c70 67 20 74 6f 20 64 6f 20 69 6e 20 74 68 69 73 20  g to do in this 
11c80 73 63 65 6e 61 72 69 6f 20 69 73 20 74 6f 20 74  scenario is to t
11c90 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72  runcate the jour
11ca0 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74  nal .  ** file t
11cb0 6f 20 74 68 65 20 72 65 71 75 69 72 65 64 20 73  o the required s
11cc0 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28  ize..  */ .  if(
11cd0 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20   SQLITE_OK==(rc 
11ce0 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
11cf0 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
11d00 20 26 6a 72 6e 6c 53 69 7a 65 29 29 0a 20 20 20   &jrnlSize)).   
11d10 26 26 20 6a 72 6e 6c 53 69 7a 65 3e 70 50 61 67  && jrnlSize>pPag
11d20 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20  er->journalOff. 
11d30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
11d40 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
11d50 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
11d60 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b  er->journalOff);
11d70 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
11d80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61  ;.}../*.** Disca
11d90 72 64 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f  rd the entire co
11da0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 69 6e  ntents of the in
11db0 2d 6d 65 6d 6f 72 79 20 70 61 67 65 2d 63 61 63  -memory page-cac
11dc0 68 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  he..*/.static vo
11dd0 69 64 20 70 61 67 65 72 5f 72 65 73 65 74 28 50  id pager_reset(P
11de0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
11df0 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65   pPager->iDataVe
11e00 72 73 69 6f 6e 2b 2b 3b 0a 20 20 73 71 6c 69 74  rsion++;.  sqlit
11e10 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28  e3BackupRestart(
11e20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29  pPager->pBackup)
11e30 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
11e40 65 43 6c 65 61 72 28 70 50 61 67 65 72 2d 3e 70  eClear(pPager->p
11e50 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  PCache);.}../*.*
11e60 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 50 61  * Return the pPa
11e70 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f  ger->iDataVersio
11e80 6e 20 76 61 6c 75 65 0a 2a 2f 0a 75 33 32 20 73  n value.*/.u32 s
11e90 71 6c 69 74 65 33 50 61 67 65 72 44 61 74 61 56  qlite3PagerDataV
11ea0 65 72 73 69 6f 6e 28 50 61 67 65 72 20 2a 70 50  ersion(Pager *pP
11eb0 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
11ec0 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72  pPager->iDataVer
11ed0 73 69 6f 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  sion;.}../*.** F
11ee0 72 65 65 20 61 6c 6c 20 73 74 72 75 63 74 75 72  ree all structur
11ef0 65 73 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e  es in the Pager.
11f00 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72  aSavepoint[] arr
11f10 61 79 20 61 6e 64 20 73 65 74 20 62 6f 74 68 0a  ay and set both.
11f20 2a 2a 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f  ** Pager.aSavepo
11f30 69 6e 74 20 61 6e 64 20 50 61 67 65 72 2e 6e 53  int and Pager.nS
11f40 61 76 65 70 6f 69 6e 74 20 74 6f 20 7a 65 72 6f  avepoint to zero
11f50 2e 20 43 6c 6f 73 65 20 74 68 65 20 73 75 62 2d  . Close the sub-
11f60 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66 20 69 74  journal.** if it
11f70 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65   is open and the
11f80 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e   pager is not in
11f90 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e   exclusive mode.
11fa0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11fb0 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f  releaseAllSavepo
11fc0 69 6e 74 73 28 50 61 67 65 72 20 2a 70 50 61 67  ints(Pager *pPag
11fd0 65 72 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20  er){.  int ii;  
11fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11ff0 49 74 65 72 61 74 6f 72 20 66 6f 72 20 6c 6f 6f  Iterator for loo
12000 70 69 6e 67 20 74 68 72 6f 75 67 68 20 50 61 67  ping through Pag
12010 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 2a 2f  er.aSavepoint */
12020 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
12030 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
12040 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73  nt; ii++){.    s
12050 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
12060 72 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61 76  roy(pPager->aSav
12070 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61  epoint[ii].pInSa
12080 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20  vepoint);.  }.  
12090 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
120a0 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 73 71  lusiveMode || sq
120b0 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 49 73 49 6e  lite3JournalIsIn
120c0 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 73  Memory(pPager->s
120d0 6a 66 64 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  jfd) ){.    sqli
120e0 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
120f0 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 7d 0a 20 20  r->sjfd);.  }.  
12100 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61  sqlite3_free(pPa
12110 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 29  ger->aSavepoint)
12120 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76  ;.  pPager->aSav
12130 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50  epoint = 0;.  pP
12140 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
12150 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
12160 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a 7d 0a 0a  nSubRec = 0;.}..
12170 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 69  /*.** Set the bi
12180 74 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e  t number pgno in
12190 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f   the PagerSavepo
121a0 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  int.pInSavepoint
121b0 20 0a 2a 2a 20 62 69 74 76 65 63 73 20 6f 66 20   .** bitvecs of 
121c0 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  all open savepoi
121d0 6e 74 73 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  nts. Return SQLI
121e0 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73  TE_OK if success
121f0 66 75 6c 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45  ful.** or SQLITE
12200 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c  _NOMEM if a mall
12210 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  oc failure occur
12220 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
12230 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42   addToSavepointB
12240 69 74 76 65 63 73 28 50 61 67 65 72 20 2a 70 50  itvecs(Pager *pP
12250 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
12260 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20  {.  int ii;     
12270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12280 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
12290 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
122a0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 2f 2a 20  TE_OK;       /* 
122b0 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a  Result code */..
122c0 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
122d0 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
122e0 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 50 61  t; ii++){.    Pa
122f0 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 20  gerSavepoint *p 
12300 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65  = &pPager->aSave
12310 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20 20 20 69  point[ii];.    i
12320 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69  f( pgno<=p->nOri
12330 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20 7c 3d  g ){.      rc |=
12340 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
12350 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e  t(p->pInSavepoin
12360 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  t, pgno);.      
12370 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51  testcase( rc==SQ
12380 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
12390 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
123a0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d  SQLITE_OK || rc=
123b0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
123c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
123d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
123e0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
123f0 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65  s a no-op if the
12400 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78 63   pager is in exc
12410 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 20  lusive mode and 
12420 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65 20 45 52  not.** in the ER
12430 52 4f 52 20 73 74 61 74 65 2e 20 4f 74 68 65 72  ROR state. Other
12440 77 69 73 65 2c 20 69 74 20 73 77 69 74 63 68 65  wise, it switche
12450 73 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 50  s the pager to P
12460 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 73 74 61  AGER_OPEN.** sta
12470 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  te..**.** If the
12480 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e   pager is not in
12490 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73   exclusive-acces
124a0 73 20 6d 6f 64 65 2c 20 74 68 65 20 64 61 74 61  s mode, the data
124b0 62 61 73 65 20 66 69 6c 65 20 69 73 0a 2a 2a 20  base file is.** 
124c0 63 6f 6d 70 6c 65 74 65 6c 79 20 75 6e 6c 6f 63  completely unloc
124d0 6b 65 64 2e 20 49 66 20 74 68 65 20 66 69 6c 65  ked. If the file
124e0 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20 61 6e 64   is unlocked and
124f0 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
12500 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 68   does.** not exh
12510 69 62 69 74 20 74 68 65 20 55 4e 44 45 4c 45 54  ibit the UNDELET
12520 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 70  ABLE_WHEN_OPEN p
12530 72 6f 70 65 72 74 79 2c 20 74 68 65 20 6a 6f 75  roperty, the jou
12540 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20  rnal file is.** 
12550 63 6c 6f 73 65 64 20 28 69 66 20 69 74 20 69 73  closed (if it is
12560 20 6f 70 65 6e 29 2e 0a 2a 2a 0a 2a 2a 20 49 66   open)..**.** If
12570 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
12580 20 45 52 52 4f 52 20 73 74 61 74 65 20 77 68 65   ERROR state whe
12590 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
125a0 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 0a  is called, the .
125b0 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  ** contents of t
125c0 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 61  he pager cache a
125d0 72 65 20 64 69 73 63 61 72 64 65 64 20 62 65 66  re discarded bef
125e0 6f 72 65 20 73 77 69 74 63 68 69 6e 67 20 62 61  ore switching ba
125f0 63 6b 20 74 6f 20 0a 2a 2a 20 74 68 65 20 4f 50  ck to .** the OP
12600 45 4e 20 73 74 61 74 65 2e 20 52 65 67 61 72 64  EN state. Regard
12610 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20  less of whether 
12620 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
12630 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 0a 2a  exclusive-mode.*
12640 2a 20 6f 72 20 6e 6f 74 2c 20 61 6e 79 20 6a 6f  * or not, any jo
12650 75 72 6e 61 6c 20 66 69 6c 65 20 6c 65 66 74 20  urnal file left 
12660 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  in the file-syst
12670 65 6d 20 77 69 6c 6c 20 62 65 20 74 72 65 61 74  em will be treat
12680 65 64 0a 2a 2a 20 61 73 20 61 20 68 6f 74 2d 6a  ed.** as a hot-j
12690 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c 65  ournal and rolle
126a0 64 20 62 61 63 6b 20 74 68 65 20 6e 65 78 74 20  d back the next 
126b0 74 69 6d 65 20 61 20 72 65 61 64 2d 74 72 61 6e  time a read-tran
126c0 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 6f 70  saction.** is op
126d0 65 6e 65 64 20 28 62 79 20 74 68 69 73 20 6f 72  ened (by this or
126e0 20 62 79 20 61 6e 79 20 6f 74 68 65 72 20 63 6f   by any other co
126f0 6e 6e 65 63 74 69 6f 6e 29 2e 0a 2a 2f 0a 73 74  nnection)..*/.st
12700 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
12710 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  unlock(Pager *pP
12720 61 67 65 72 29 7b 0a 0a 20 20 61 73 73 65 72 74  ager){..  assert
12730 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
12740 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 0a  ==PAGER_READER .
12750 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
12760 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
12770 4f 50 45 4e 20 0a 20 20 20 20 20 20 20 7c 7c 20  OPEN .       || 
12780 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
12790 50 41 47 45 52 5f 45 52 52 4f 52 20 0a 20 20 29  PAGER_ERROR .  )
127a0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76  ;..  sqlite3Bitv
127b0 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
127c0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->pInJournal);. 
127d0 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
127e0 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61  nal = 0;.  relea
127f0 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28  seAllSavepoints(
12800 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28 20  pPager);..  if( 
12810 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
12820 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  er) ){.    asser
12830 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  t( !isOpen(pPage
12840 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 73  r->jfd) );.    s
12850 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64  qlite3WalEndRead
12860 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  Transaction(pPag
12870 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 70  er->pWal);.    p
12880 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
12890 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d 65  PAGER_OPEN;.  }e
128a0 6c 73 65 20 69 66 28 20 21 70 50 61 67 65 72 2d  lse if( !pPager-
128b0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
128c0 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20  {.    int rc;   
128d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128e0 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
128f0 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 70 61  e returned by pa
12900 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 2a 2f  gerUnlockDb() */
12910 0a 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 69  .    int iDc = i
12920 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
12930 29 3f 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  )?sqlite3OsDevic
12940 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
12950 28 70 50 61 67 65 72 2d 3e 66 64 29 3a 30 3b 0a  (pPager->fd):0;.
12960 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f  .    /* If the o
12970 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
12980 73 75 70 70 6f 72 74 20 64 65 6c 65 74 69 6f 6e  support deletion
12990 20 6f 66 20 6f 70 65 6e 20 66 69 6c 65 73 2c 20   of open files, 
129a0 74 68 65 6e 0a 20 20 20 20 2a 2a 20 63 6c 6f 73  then.    ** clos
129b0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
129c0 6c 65 20 77 68 65 6e 20 64 72 6f 70 70 69 6e 67  le when dropping
129d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f   the database lo
129e0 63 6b 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 20  ck.  Otherwise. 
129f0 20 20 20 2a 2a 20 61 6e 6f 74 68 65 72 20 63 6f     ** another co
12a00 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6a 6f  nnection with jo
12a10 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74  urnal_mode=delet
12a20 65 20 6d 69 67 68 74 20 64 65 6c 65 74 65 20 74  e might delete t
12a30 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6f  he file.    ** o
12a40 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 75 73  ut from under us
12a50 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
12a60 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
12a70 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 20  NALMODE_MEMORY  
12a80 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20   & 5)!=1 );.    
12a90 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
12aa0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20  OURNALMODE_OFF  
12ab0 20 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20      & 5)!=1 );. 
12ac0 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
12ad0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
12ae0 4c 20 20 20 20 20 20 26 20 35 29 21 3d 31 20 29  L      & 5)!=1 )
12af0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
12b00 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
12b10 5f 44 45 4c 45 54 45 20 20 20 26 20 35 29 21 3d  _DELETE   & 5)!=
12b20 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
12b30 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
12b40 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 26 20 35  ODE_TRUNCATE & 5
12b50 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  )==1 );.    asse
12b60 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
12b70 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 20  ALMODE_PERSIST  
12b80 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 69  & 5)==1 );.    i
12b90 66 28 20 30 3d 3d 28 69 44 63 20 26 20 53 51 4c  f( 0==(iDc & SQL
12ba0 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45  ITE_IOCAP_UNDELE
12bb0 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 29  TABLE_WHEN_OPEN)
12bc0 0a 20 20 20 20 20 7c 7c 20 31 21 3d 28 70 50 61  .     || 1!=(pPa
12bd0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
12be0 20 26 20 35 29 0a 20 20 20 20 29 7b 0a 20 20 20   & 5).    ){.   
12bf0 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
12c00 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
12c10 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
12c20 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
12c30 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
12c40 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 20 74 6f   and the call to
12c50 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   unlock the data
12c60 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65  base.    ** file
12c70 20 66 61 69 6c 73 2c 20 73 65 74 20 74 68 65 20   fails, set the 
12c80 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 74 6f 20  current lock to 
12c90 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65  UNKNOWN_LOCK. Se
12ca0 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 0a 20 20  e the comment.  
12cb0 20 20 2a 2a 20 61 62 6f 76 65 20 74 68 65 20 23    ** above the #
12cc0 64 65 66 69 6e 65 20 66 6f 72 20 55 4e 4b 4e 4f  define for UNKNO
12cd0 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65  WN_LOCK for an e
12ce0 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 77 68  xplanation of wh
12cf0 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 73  y this.    ** is
12d00 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20 20   necessary..    
12d10 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  */.    rc = page
12d20 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72  rUnlockDb(pPager
12d30 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
12d40 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
12d50 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74  K && pPager->eSt
12d60 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate==PAGER_ERROR
12d70 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
12d80 2d 3e 65 4c 6f 63 6b 20 3d 20 55 4e 4b 4e 4f 57  ->eLock = UNKNOW
12d90 4e 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20  N_LOCK;.    }.. 
12da0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
12db0 73 74 61 74 65 20 6d 61 79 20 62 65 20 63 68 61  state may be cha
12dc0 6e 67 65 64 20 66 72 6f 6d 20 50 41 47 45 52 5f  nged from PAGER_
12dd0 45 52 52 4f 52 20 74 6f 20 50 41 47 45 52 5f 4f  ERROR to PAGER_O
12de0 50 45 4e 20 68 65 72 65 0a 20 20 20 20 2a 2a 20  PEN here.    ** 
12df0 77 69 74 68 6f 75 74 20 63 6c 65 61 72 69 6e 67  without clearing
12e00 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 2e   the error code.
12e10 20 54 68 69 73 20 69 73 20 69 6e 74 65 6e 74 69   This is intenti
12e20 6f 6e 61 6c 20 2d 20 74 68 65 20 65 72 72 6f 72  onal - the error
12e30 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20 69 73 20  .    ** code is 
12e40 63 6c 65 61 72 65 64 20 61 6e 64 20 74 68 65 20  cleared and the 
12e50 63 61 63 68 65 20 72 65 73 65 74 20 69 6e 20 74  cache reset in t
12e60 68 65 20 62 6c 6f 63 6b 20 62 65 6c 6f 77 2e 0a  he block below..
12e70 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
12e80 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  t( pPager->errCo
12e90 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  de || pPager->eS
12ea0 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
12eb0 52 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  R );.    pPager-
12ec0 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
12ed0 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
12ee0 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
12ef0 5f 4f 50 45 4e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _OPEN;.  }..  /*
12f00 20 49 66 20 50 61 67 65 72 2e 65 72 72 43 6f 64   If Pager.errCod
12f10 65 20 69 73 20 73 65 74 2c 20 74 68 65 20 63 6f  e is set, the co
12f20 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
12f30 67 65 72 20 63 61 63 68 65 20 63 61 6e 6e 6f 74  ger cache cannot
12f40 20 62 65 0a 20 20 2a 2a 20 74 72 75 73 74 65 64   be.  ** trusted
12f50 2e 20 4e 6f 77 20 74 68 61 74 20 74 68 65 72 65  . Now that there
12f60 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64   are no outstand
12f70 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74  ing references t
12f80 6f 20 74 68 65 20 70 61 67 65 72 2c 0a 20 20 2a  o the pager,.  *
12f90 2a 20 69 74 20 63 61 6e 20 73 61 66 65 6c 79 20  * it can safely 
12fa0 6d 6f 76 65 20 62 61 63 6b 20 74 6f 20 50 41 47  move back to PAG
12fb0 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 2e 20 54  ER_OPEN state. T
12fc0 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20 62  his happens in b
12fd0 6f 74 68 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20  oth.  ** normal 
12fe0 61 6e 64 20 65 78 63 6c 75 73 69 76 65 2d 6c 6f  and exclusive-lo
12ff0 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20 20 2a 2f  cking mode..  */
13000 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
13010 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
13020 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42 20  TE_OK || !MEMDB 
13030 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
13040 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
13050 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  if( pPager->temp
13060 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  File==0 ){.     
13070 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
13080 67 65 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67  ger);.      pPag
13090 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
130a0 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  one = 0;.      p
130b0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
130c0 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20  PAGER_OPEN;.    
130d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61  }else{.      pPa
130e0 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 28 69  ger->eState = (i
130f0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
13100 64 29 20 3f 20 50 41 47 45 52 5f 4f 50 45 4e 20  d) ? PAGER_OPEN 
13110 3a 20 50 41 47 45 52 5f 52 45 41 44 45 52 29 3b  : PAGER_READER);
13120 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 55  .    }.    if( U
13130 53 45 46 45 54 43 48 28 70 50 61 67 65 72 29 20  SEFETCH(pPager) 
13140 29 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74  ) sqlite3OsUnfet
13150 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30  ch(pPager->fd, 0
13160 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 67 65 72  , 0);.    pPager
13170 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49  ->errCode = SQLI
13180 54 45 5f 4f 4b 3b 0a 20 20 20 20 73 65 74 47 65  TE_OK;.    setGe
13190 74 74 65 72 4d 65 74 68 6f 64 28 70 50 61 67 65  tterMethod(pPage
131a0 72 29 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65  r);.  }..  pPage
131b0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
131c0 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  0;.  pPager->jou
131d0 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 70  rnalHdr = 0;.  p
131e0 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
131f0 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   = 0;.}../*.** T
13200 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
13210 63 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20  called whenever 
13220 61 6e 20 49 4f 45 52 52 20 6f 72 20 46 55 4c 4c  an IOERR or FULL
13230 20 65 72 72 6f 72 20 74 68 61 74 20 72 65 71 75   error that requ
13240 69 72 65 73 0a 2a 2a 20 74 68 65 20 70 61 67 65  ires.** the page
13250 72 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 20  r to transition 
13260 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73  into the ERROR s
13270 74 61 74 65 20 6d 61 79 20 61 68 76 65 20 6f 63  tate may ahve oc
13280 63 75 72 72 65 64 2e 0a 2a 2a 20 54 68 65 20 66  curred..** The f
13290 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
132a0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
132b0 65 20 70 61 67 65 72 20 73 74 72 75 63 74 75 72  e pager structur
132c0 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a  e, the second .*
132d0 2a 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65  * the error-code
132e0 20 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74   about to be ret
132f0 75 72 6e 65 64 20 62 79 20 61 20 70 61 67 65 72  urned by a pager
13300 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20 54   API function. T
13310 68 65 20 0a 2a 2a 20 76 61 6c 75 65 20 72 65 74  he .** value ret
13320 75 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20  urned is a copy 
13330 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  of the second ar
13340 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
13350 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20  unction. .**.** 
13360 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
13370 67 75 6d 65 6e 74 20 69 73 20 53 51 4c 49 54 45  gument is SQLITE
13380 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f  _FULL, SQLITE_IO
13390 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68  ERR or one of th
133a0 65 0a 2a 2a 20 49 4f 45 52 52 20 73 75 62 2d 63  e.** IOERR sub-c
133b0 6f 64 65 73 2c 20 74 68 65 20 70 61 67 65 72 20  odes, the pager 
133c0 65 6e 74 65 72 73 20 74 68 65 20 45 52 52 4f 52  enters the ERROR
133d0 20 73 74 61 74 65 20 61 6e 64 20 74 68 65 20 65   state and the e
133e0 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20  rror code.** is 
133f0 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e  stored in Pager.
13400 65 72 72 43 6f 64 65 2e 20 57 68 69 6c 65 20 74  errCode. While t
13410 68 65 20 70 61 67 65 72 20 72 65 6d 61 69 6e 73  he pager remains
13420 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74   in the ERROR st
13430 61 74 65 2c 0a 2a 2a 20 61 6c 6c 20 6d 61 6a 6f  ate,.** all majo
13440 72 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74  r API calls on t
13450 68 65 20 50 61 67 65 72 20 77 69 6c 6c 20 69 6d  he Pager will im
13460 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e  mediately return
13470 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e 0a   Pager.errCode..
13480 2a 2a 0a 2a 2a 20 54 68 65 20 45 52 52 4f 52 20  **.** The ERROR 
13490 73 74 61 74 65 20 69 6e 64 69 63 61 74 65 73 20  state indicates 
134a0 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  that the content
134b0 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63  s of the pager-c
134c0 61 63 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20  ache .** cannot 
134d0 62 65 20 74 72 75 73 74 65 64 2e 20 54 68 69 73  be trusted. This
134e0 20 73 74 61 74 65 20 63 61 6e 20 62 65 20 63 6c   state can be cl
134f0 65 61 72 65 64 20 62 79 20 63 6f 6d 70 6c 65 74  eared by complet
13500 65 6c 79 20 64 69 73 63 61 72 64 69 6e 67 20 0a  ely discarding .
13510 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ** the contents 
13520 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  of the pager-cac
13530 68 65 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63  he. If a transac
13540 74 69 6f 6e 20 77 61 73 20 61 63 74 69 76 65 20  tion was active 
13550 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73  when.** the pers
13560 69 73 74 65 6e 74 20 65 72 72 6f 72 20 6f 63 63  istent error occ
13570 75 72 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20  urred, then the 
13580 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
13590 20 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20   may need.** to 
135a0 62 65 20 72 65 70 6c 61 79 65 64 20 74 6f 20 72  be replayed to r
135b0 65 73 74 6f 72 65 20 74 68 65 20 63 6f 6e 74 65  estore the conte
135c0 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  nts of the datab
135d0 61 73 65 20 66 69 6c 65 20 28 61 73 20 69 66 0a  ase file (as if.
135e0 2a 2a 20 69 74 20 77 65 72 65 20 61 20 68 6f 74  ** it were a hot
135f0 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74  -journal)..*/.st
13600 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65  atic int pager_e
13610 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67  rror(Pager *pPag
13620 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69  er, int rc){.  i
13630 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20 30 78  nt rc2 = rc & 0x
13640 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  ff;.  assert( rc
13650 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21  ==SQLITE_OK || !
13660 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72  MEMDB );.  asser
13670 74 28 0a 20 20 20 20 20 20 20 70 50 61 67 65 72  t(.       pPager
13680 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
13690 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20  E_FULL ||.      
136a0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
136b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20  ==SQLITE_OK ||. 
136c0 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65        (pPager->e
136d0 72 72 43 6f 64 65 20 26 20 30 78 66 66 29 3d 3d  rrCode & 0xff)==
136e0 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 29  SQLITE_IOERR.  )
136f0 3b 0a 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c  ;.  if( rc2==SQL
13700 49 54 45 5f 46 55 4c 4c 20 7c 7c 20 72 63 32 3d  ITE_FULL || rc2=
13710 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b  =SQLITE_IOERR ){
13720 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
13730 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 70  Code = rc;.    p
13740 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
13750 50 41 47 45 52 5f 45 52 52 4f 52 3b 0a 20 20 20  PAGER_ERROR;.   
13760 20 73 65 74 47 65 74 74 65 72 4d 65 74 68 6f 64   setGetterMethod
13770 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
13780 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74  return rc;.}..st
13790 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74  atic int pager_t
137a0 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70  runcate(Pager *p
137b0 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67  Pager, Pgno nPag
137c0 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 77  e);../*.** The w
137d0 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
137e0 20 6f 70 65 6e 20 6f 6e 20 70 50 61 67 65 72 20   open on pPager 
137f0 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74  is being committ
13800 65 64 20 28 62 43 6f 6d 6d 69 74 3d 3d 31 29 0a  ed (bCommit==1).
13810 2a 2a 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63  ** or rolled bac
13820 6b 20 28 62 43 6f 6d 6d 69 74 3d 3d 30 29 2e 0a  k (bCommit==0)..
13830 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  **.** Return TRU
13840 45 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66  E if and only if
13850 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
13860 20 73 68 6f 75 6c 64 20 62 65 20 66 6c 75 73 68   should be flush
13870 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  ed to disk..**.*
13880 2a 20 52 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  * Rules:.**.**  
13890 20 2a 20 20 46 6f 72 20 6e 6f 6e 2d 54 45 4d 50   *  For non-TEMP
138a0 20 64 61 74 61 62 61 73 65 73 2c 20 61 6c 77 61   databases, alwa
138b0 79 73 20 73 79 6e 63 20 74 6f 20 64 69 73 6b 2e  ys sync to disk.
138c0 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73    This is necess
138d0 61 72 79 0a 2a 2a 20 20 20 20 20 20 66 6f 72 20  ary.**      for 
138e0 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 74 6f 20  transactions to 
138f0 62 65 20 64 75 72 61 62 6c 65 2e 0a 2a 2a 0a 2a  be durable..**.*
13900 2a 20 20 20 2a 20 20 53 79 6e 63 20 54 45 4d 50  *   *  Sync TEMP
13910 20 64 61 74 61 62 61 73 65 20 6f 6e 6c 79 20 6f   database only o
13920 6e 20 61 20 43 4f 4d 4d 49 54 20 28 6e 6f 74 20  n a COMMIT (not 
13930 61 20 52 4f 4c 4c 42 41 43 4b 29 20 77 68 65 6e  a ROLLBACK) when
13940 20 74 68 65 20 62 61 63 6b 69 6e 67 0a 2a 2a 20   the backing.** 
13950 20 20 20 20 20 66 69 6c 65 20 68 61 73 20 62 65       file has be
13960 65 6e 20 63 72 65 61 74 65 64 20 61 6c 72 65 61  en created alrea
13970 64 79 20 28 76 69 61 20 61 20 73 70 69 6c 6c 20  dy (via a spill 
13980 6f 6e 20 70 61 67 65 72 53 74 72 65 73 73 28 29  on pagerStress()
13990 29 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 77 68  ) and.**      wh
139a0 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  en the number of
139b0 20 64 69 72 74 79 20 70 61 67 65 73 20 69 6e 20   dirty pages in 
139c0 6d 65 6d 6f 72 79 20 65 78 63 65 65 64 73 20 32  memory exceeds 2
139d0 35 25 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 0a  5% of the total.
139e0 2a 2a 20 20 20 20 20 20 63 61 63 68 65 20 73 69  **      cache si
139f0 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
13a00 74 20 70 61 67 65 72 46 6c 75 73 68 4f 6e 43 6f  t pagerFlushOnCo
13a10 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67  mmit(Pager *pPag
13a20 65 72 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29  er, int bCommit)
13a30 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  {.  if( pPager->
13a40 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29 20 72 65  tempFile==0 ) re
13a50 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 21 62  turn 1;.  if( !b
13a60 43 6f 6d 6d 69 74 20 29 20 72 65 74 75 72 6e 20  Commit ) return 
13a70 30 3b 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e  0;.  if( !isOpen
13a80 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 20 72  (pPager->fd) ) r
13a90 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72  eturn 0;.  retur
13aa0 6e 20 28 73 71 6c 69 74 65 33 50 43 61 63 68 65  n (sqlite3PCache
13ab0 50 65 72 63 65 6e 74 44 69 72 74 79 28 70 50 61  PercentDirty(pPa
13ac0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 3d 32  ger->pPCache)>=2
13ad0 35 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  5);.}../*.** Thi
13ae0 73 20 72 6f 75 74 69 6e 65 20 65 6e 64 73 20 61  s routine ends a
13af0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20   transaction. A 
13b00 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 75  transaction is u
13b10 73 75 61 6c 6c 79 20 65 6e 64 65 64 20 62 79 20  sually ended by 
13b20 0a 2a 2a 20 65 69 74 68 65 72 20 61 20 43 4f 4d  .** either a COM
13b30 4d 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43  MIT or a ROLLBAC
13b40 4b 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 69  K operation. Thi
13b50 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 62 65  s routine may be
13b60 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 61 66 74 65   called .** afte
13b70 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20  r rollback of a 
13b80 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20  hot-journal, or 
13b90 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
13ba0 72 73 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67  rs while opening
13bb0 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
13bc0 66 69 6c 65 20 6f 72 20 77 72 69 74 69 6e 67 20  file or writing 
13bd0 74 68 65 20 76 65 72 79 20 66 69 72 73 74 20 6a  the very first j
13be0 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6f 66  ournal-header of
13bf0 20 61 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74   a.** database t
13c00 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a  ransaction..** .
13c10 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
13c20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20  is never called 
13c30 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  in PAGER_ERROR s
13c40 74 61 74 65 2e 20 49 66 20 69 74 20 69 73 20 63  tate. If it is c
13c50 61 6c 6c 65 64 0a 2a 2a 20 69 6e 20 50 41 47 45  alled.** in PAGE
13c60 52 5f 4e 4f 4e 45 20 6f 72 20 50 41 47 45 52 5f  R_NONE or PAGER_
13c70 53 48 41 52 45 44 20 73 74 61 74 65 20 61 6e 64  SHARED state and
13c80 20 74 68 65 20 6c 6f 63 6b 20 68 65 6c 64 20 69   the lock held i
13c90 73 20 6c 65 73 73 0a 2a 2a 20 65 78 63 6c 75 73  s less.** exclus
13ca0 69 76 65 20 74 68 61 6e 20 61 20 52 45 53 45 52  ive than a RESER
13cb0 56 45 44 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20  VED lock, it is 
13cc0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4f  a no-op..**.** O
13cd0 74 68 65 72 77 69 73 65 2c 20 61 6e 79 20 61 63  therwise, any ac
13ce0 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20  tive savepoints 
13cf0 61 72 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a  are released..**
13d00 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
13d10 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c  al file is open,
13d20 20 74 68 65 6e 20 69 74 20 69 73 20 22 66 69 6e   then it is "fin
13d30 61 6c 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20  alized". Once a 
13d40 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65  journal .** file
13d50 20 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69   has been finali
13d60 7a 65 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  zed it is not po
13d70 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20 69 74  ssible to use it
13d80 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20   to roll back a 
13d90 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
13da0 20 4e 6f 72 20 77 69 6c 6c 20 69 74 20 62 65 20   Nor will it be 
13db0 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65  considered to be
13dc0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62   a hot-journal b
13dd0 79 20 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79  y this.** or any
13de0 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
13df0 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63  connection. Exac
13e00 74 6c 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61  tly how a journa
13e10 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a  l is finalized.*
13e20 2a 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65  * depends on whe
13e30 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
13e40 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67  pager is running
13e50 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
13e60 64 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75  de and.** the cu
13e70 72 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  rrent journal-mo
13e80 64 65 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61  de (Pager.journa
13e90 6c 4d 6f 64 65 20 76 61 6c 75 65 29 2c 20 61 73  lMode value), as
13ea0 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
13eb0 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d    journalMode==M
13ec0 45 4d 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75  EMORY.**     Jou
13ed0 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
13ee0 70 74 6f 72 20 69 73 20 73 69 6d 70 6c 79 20 63  ptor is simply c
13ef0 6c 6f 73 65 64 2e 20 54 68 69 73 20 64 65 73 74  losed. This dest
13f00 72 6f 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20  roys an .**     
13f10 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
13f20 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e  l..**.**   journ
13f30 61 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45  alMode==TRUNCATE
13f40 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20  .**     Journal 
13f50 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65  file is truncate
13f60 64 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20  d to zero bytes 
13f70 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20  in size..**.**  
13f80 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45   journalMode==PE
13f90 52 53 49 53 54 0a 2a 2a 20 20 20 20 20 54 68 65  RSIST.**     The
13fa0 20 66 69 72 73 74 20 32 38 20 62 79 74 65 73 20   first 28 bytes 
13fb0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
13fc0 69 6c 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20  ile are zeroed. 
13fd0 54 68 69 73 20 69 6e 76 61 6c 69 64 61 74 65 73  This invalidates
13fe0 0a 2a 2a 20 20 20 20 20 74 68 65 20 66 69 72 73  .**     the firs
13ff0 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
14000 20 69 6e 20 74 68 65 20 66 69 6c 65 2c 20 61 6e   in the file, an
14010 64 20 68 65 6e 63 65 20 74 68 65 20 65 6e 74 69  d hence the enti
14020 72 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  re journal.**   
14030 20 20 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c    file. An inval
14040 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  id journal file 
14050 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64  cannot be rolled
14060 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a   back..**.**   j
14070 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45  ournalMode==DELE
14080 54 45 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f  TE.**     The jo
14090 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 6c  urnal file is cl
140a0 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64  osed and deleted
140b0 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73   using sqlite3Os
140c0 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  Delete()..**.** 
140d0 20 20 20 20 49 66 20 74 68 65 20 70 61 67 65 72      If the pager
140e0 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65   is running in e
140f0 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74  xclusive mode, t
14100 68 69 73 20 6d 65 74 68 6f 64 20 6f 66 20 66 69  his method of fi
14110 6e 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20  nalizing.**     
14120 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
14130 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e 20   is never used. 
14140 49 6e 73 74 65 61 64 2c 20 69 66 20 74 68 65 20  Instead, if the 
14150 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a  journalMode is.*
14160 2a 20 20 20 20 20 44 45 4c 45 54 45 20 61 6e 64  *     DELETE and
14170 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
14180 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c   exclusive mode,
14190 20 74 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63   the method desc
141a0 72 69 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20  ribed under.**  
141b0 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d     journalMode==
141c0 50 45 52 53 49 53 54 20 69 73 20 75 73 65 64 20  PERSIST is used 
141d0 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41  instead..**.** A
141e0 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  fter the journal
141f0 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74   is finalized, t
14200 68 65 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74  he pager moves t
14210 6f 20 50 41 47 45 52 5f 52 45 41 44 45 52 20 73  o PAGER_READER s
14220 74 61 74 65 2e 0a 2a 2a 20 49 66 20 72 75 6e 6e  tate..** If runn
14230 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75  ing in non-exclu
14240 73 69 76 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f  sive rollback mo
14250 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  de, the lock on 
14260 74 68 65 20 66 69 6c 65 20 69 73 20 0a 2a 2a 20  the file is .** 
14270 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20  downgraded to a 
14280 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
14290 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
142a0 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65  returned if no e
142b0 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 49 66 20  rror occurs. If 
142c0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
142d0 64 75 72 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66  during.** any of
142e0 20 74 68 65 20 49 4f 20 6f 70 65 72 61 74 69 6f   the IO operatio
142f0 6e 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74  ns to finalize t
14300 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
14310 6f 72 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a  or unlock the.**
14320 20 64 61 74 61 62 61 73 65 20 74 68 65 6e 20 74   database then t
14330 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
14340 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20   is returned to 
14350 74 68 65 20 75 73 65 72 2e 20 49 66 20 74 68 65  the user. If the
14360 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74   .** operation t
14370 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a  o finalize the j
14380 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c  ournal file fail
14390 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 64 65  s, then the code
143a0 20 73 74 69 6c 6c 0a 2a 2a 20 74 72 69 65 73 20   still.** tries 
143b0 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61  to unlock the da
143c0 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 6e  tabase file if n
143d0 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ot in exclusive 
143e0 6d 6f 64 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20  mode. If the.** 
143f0 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e  unlock operation
14400 20 66 61 69 6c 73 20 61 73 20 77 65 6c 6c 2c 20   fails as well, 
14410 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 65  then the first e
14420 72 72 6f 72 20 63 6f 64 65 20 72 65 6c 61 74 65  rror code relate
14430 64 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73  d.** to the firs
14440 74 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65  t error encounte
14450 72 65 64 20 28 74 68 65 20 6a 6f 75 72 6e 61 6c  red (the journal
14460 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e   finalization on
14470 65 29 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  e) is.** returne
14480 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
14490 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
144a0 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50  action(Pager *pP
144b0 61 67 65 72 2c 20 69 6e 74 20 68 61 73 4d 61 73  ager, int hasMas
144c0 74 65 72 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74  ter, int bCommit
144d0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
144e0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a  LITE_OK;      /*
144f0 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d   Error code from
14500 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a   journal finaliz
14510 61 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20  ation operation 
14520 2a 2f 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 53  */.  int rc2 = S
14530 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a  QLITE_OK;     /*
14540 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d   Error code from
14550 20 64 62 20 66 69 6c 65 20 75 6e 6c 6f 63 6b 20   db file unlock 
14560 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20  operation */..  
14570 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66  /* Do nothing if
14580 20 74 68 65 20 70 61 67 65 72 20 64 6f 65 73 20   the pager does 
14590 6e 6f 74 20 68 61 76 65 20 61 6e 20 6f 70 65 6e  not have an open
145a0 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
145b0 6f 6e 0a 20 20 2a 2a 20 6f 72 20 61 74 20 6c 65  on.  ** or at le
145c0 61 73 74 20 61 20 52 45 53 45 52 56 45 44 20 6c  ast a RESERVED l
145d0 6f 63 6b 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ock. This functi
145e0 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64  on may be called
145f0 20 77 68 65 6e 20 74 68 65 72 65 0a 20 20 2a 2a   when there.  **
14600 20 69 73 20 6e 6f 20 77 72 69 74 65 2d 74 72 61   is no write-tra
14610 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 20  nsaction active 
14620 62 75 74 20 61 20 52 45 53 45 52 56 45 44 20 6f  but a RESERVED o
14630 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69  r greater lock i
14640 73 0a 20 20 2a 2a 20 68 65 6c 64 20 75 6e 64 65  s.  ** held unde
14650 72 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e  r two circumstan
14660 63 65 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ces:.  **.  **  
14670 20 31 2e 20 41 66 74 65 72 20 61 20 73 75 63 63   1. After a succ
14680 65 73 73 66 75 6c 20 68 6f 74 2d 6a 6f 75 72 6e  essful hot-journ
14690 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20  al rollback, it 
146a0 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 0a 20  is called with. 
146b0 20 2a 2a 20 20 20 20 20 20 65 53 74 61 74 65 3d   **      eState=
146c0 3d 50 41 47 45 52 5f 4e 4f 4e 45 20 61 6e 64 20  =PAGER_NONE and 
146d0 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
146e0 5f 4c 4f 43 4b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  _LOCK..  **.  **
146f0 20 20 20 32 2e 20 49 66 20 61 20 63 6f 6e 6e 65     2. If a conne
14700 63 74 69 6f 6e 20 77 69 74 68 20 6c 6f 63 6b 69  ction with locki
14710 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
14720 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43  e holding an EXC
14730 4c 55 53 49 56 45 20 0a 20 20 2a 2a 20 20 20 20  LUSIVE .  **    
14740 20 20 6c 6f 63 6b 20 73 77 69 74 63 68 65 73 20    lock switches 
14750 62 61 63 6b 20 74 6f 20 6c 6f 63 6b 69 6e 67 5f  back to locking_
14760 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 61 6e 64 20  mode=normal and 
14770 74 68 65 6e 20 65 78 65 63 75 74 65 73 20 61 0a  then executes a.
14780 20 20 2a 2a 20 20 20 20 20 20 72 65 61 64 2d 74    **      read-t
14790 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 69 73  ransaction, this
147a0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
147b0 6c 65 64 20 77 69 74 68 20 65 53 74 61 74 65 3d  led with eState=
147c0 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 0a 20  =PAGER_READER . 
147d0 20 2a 2a 20 20 20 20 20 20 61 6e 64 20 65 4c 6f   **      and eLo
147e0 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
147f0 43 4b 20 77 68 65 6e 20 74 68 65 20 72 65 61 64  CK when the read
14800 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
14810 63 6c 6f 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 61  closed..  */.  a
14820 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
14830 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
14840 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
14850 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
14860 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20  AGER_ERROR );.  
14870 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  if( pPager->eSta
14880 74 65 3c 50 41 47 45 52 5f 57 52 49 54 45 52 5f  te<PAGER_WRITER_
14890 4c 4f 43 4b 45 44 20 26 26 20 70 50 61 67 65 72  LOCKED && pPager
148a0 2d 3e 65 4c 6f 63 6b 3c 52 45 53 45 52 56 45 44  ->eLock<RESERVED
148b0 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74  _LOCK ){.    ret
148c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
148d0 20 7d 0a 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c   }..  releaseAll
148e0 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65  Savepoints(pPage
148f0 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73  r);.  assert( is
14900 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
14910 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 49 6e  ) || pPager->pIn
14920 4a 6f 75 72 6e 61 6c 3d 3d 30 20 0a 20 20 20 20  Journal==0 .    
14930 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44    || (sqlite3OsD
14940 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
14950 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
14960 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 42 41  &SQLITE_IOCAP_BA
14970 54 43 48 5f 41 54 4f 4d 49 43 29 0a 20 20 29 3b  TCH_ATOMIC).  );
14980 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50  .  if( isOpen(pP
14990 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
149a0 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
149b0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
149c0 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69  ;..    /* Finali
149d0 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ze the journal f
149e0 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ile. */.    if( 
149f0 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 49 73  sqlite3JournalIs
14a00 49 6e 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d  InMemory(pPager-
14a10 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 2f  >jfd) ){.      /
14a20 2a 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72  * assert( pPager
14a30 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
14a40 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
14a50 5f 4d 45 4d 4f 52 59 20 29 3b 20 2a 2f 0a 20 20  _MEMORY ); */.  
14a60 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
14a70 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
14a80 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
14a90 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
14aa0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
14ab0 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 29  LMODE_TRUNCATE )
14ac0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  {.      if( pPag
14ad0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
14ae0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
14af0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
14b00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14b10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
14b20 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
14b30 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  >jfd, 0);.      
14b40 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
14b50 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 66  _OK && pPager->f
14b60 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  ullSync ){.     
14b70 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72       /* Make sur
14b80 65 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20 73  e the new file s
14b90 69 7a 65 20 69 73 20 77 72 69 74 74 65 6e 20 69  ize is written i
14ba0 6e 74 6f 20 74 68 65 20 69 6e 6f 64 65 20 72 69  nto the inode ri
14bb0 67 68 74 20 61 77 61 79 2e 0a 20 20 20 20 20 20  ght away..      
14bc0 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65      ** Otherwise
14bd0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67   the journal mig
14be0 68 74 20 72 65 73 75 72 72 65 63 74 20 66 6f 6c  ht resurrect fol
14bf0 6c 6f 77 69 6e 67 20 61 20 70 6f 77 65 72 20 6c  lowing a power l
14c00 6f 73 73 20 61 6e 64 0a 20 20 20 20 20 20 20 20  oss and.        
14c10 20 20 2a 2a 20 63 61 75 73 65 20 74 68 65 20 6c    ** cause the l
14c20 61 73 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ast transaction 
14c30 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 20 53  to roll back.  S
14c40 65 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ee.          ** 
14c50 68 74 74 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c 61  https://bugzilla
14c60 2e 6d 6f 7a 69 6c 6c 61 2e 6f 72 67 2f 73 68 6f  .mozilla.org/sho
14c70 77 5f 62 75 67 2e 63 67 69 3f 69 64 3d 31 30 37  w_bug.cgi?id=107
14c80 32 37 37 33 0a 20 20 20 20 20 20 20 20 20 20 2a  2773.          *
14c90 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  /.          rc =
14ca0 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
14cb0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
14cc0 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a  er->syncFlags);.
14cd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14ce0 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
14cf0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
14d00 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
14d10 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
14d20 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
14d30 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20  MODE_PERSIST.   
14d40 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65     || (pPager->e
14d50 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20  xclusiveMode && 
14d60 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
14d70 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
14d80 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20 20 20 20  ALMODE_WAL).    
14d90 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a 65  ){.      rc = ze
14da0 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  roJournalHdr(pPa
14db0 67 65 72 2c 20 68 61 73 4d 61 73 74 65 72 7c 7c  ger, hasMaster||
14dc0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
14dd0 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
14de0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
14df0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
14e00 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
14e10 20 6d 61 79 20 62 65 20 65 78 65 63 75 74 65 64   may be executed
14e20 20 77 69 74 68 20 50 61 67 65 72 2e 6a 6f 75 72   with Pager.jour
14e30 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 20  nalMode==MEMORY 
14e40 69 66 0a 20 20 20 20 20 20 2a 2a 20 61 20 68 6f  if.      ** a ho
14e50 74 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6a 75  t-journal was ju
14e60 73 74 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  st rolled back. 
14e70 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
14e80 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a   journal.      *
14e90 2a 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65  * file should be
14ea0 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65   closed and dele
14eb0 74 65 64 2e 20 49 66 20 74 68 69 73 20 63 6f 6e  ted. If this con
14ec0 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20 74  nection writes t
14ed0 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64  o.      ** the d
14ee0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74  atabase file, it
14ef0 20 77 69 6c 6c 20 64 6f 20 73 6f 20 75 73 69 6e   will do so usin
14f00 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a  g an in-memory j
14f10 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 20 20 2a 2f  ournal..      */
14f20 0a 20 20 20 20 20 20 69 6e 74 20 62 44 65 6c 65  .      int bDele
14f30 74 65 20 3d 20 21 70 50 61 67 65 72 2d 3e 74 65  te = !pPager->te
14f40 6d 70 46 69 6c 65 3b 0a 20 20 20 20 20 20 61 73  mpFile;.      as
14f50 73 65 72 74 28 20 73 71 6c 69 74 65 33 4a 6f 75  sert( sqlite3Jou
14f60 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f 72 79 28 70  rnalIsInMemory(p
14f70 50 61 67 65 72 2d 3e 6a 66 64 29 3d 3d 30 20 29  Pager->jfd)==0 )
14f80 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14f90 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
14fa0 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
14fb0 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 0a 20  ALMODE_DELETE . 
14fc0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
14fd0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
14fe0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
14ff0 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20  ODE_MEMORY .    
15000 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
15010 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
15020 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
15030 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20  _WAL .      );. 
15040 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
15050 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
15060 3b 0a 20 20 20 20 20 20 69 66 28 20 62 44 65 6c  ;.      if( bDel
15070 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ete ){.        r
15080 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
15090 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73  ete(pPager->pVfs
150a0 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
150b0 61 6c 2c 20 70 50 61 67 65 72 2d 3e 65 78 74 72  al, pPager->extr
150c0 61 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 7d 0a  aSync);.      }.
150d0 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65      }.  }..#ifde
150e0 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
150f0 41 47 45 53 0a 20 20 73 71 6c 69 74 65 33 50 63  AGES.  sqlite3Pc
15100 61 63 68 65 49 74 65 72 61 74 65 44 69 72 74 79  acheIterateDirty
15110 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
15120 2c 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  , pager_set_page
15130 68 61 73 68 29 3b 0a 20 20 69 66 28 20 70 50 61  hash);.  if( pPa
15140 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 20 26  ger->dbSize==0 &
15150 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  & sqlite3PcacheR
15160 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
15170 70 50 43 61 63 68 65 29 3e 30 20 29 7b 0a 20 20  pPCache)>0 ){.  
15180 20 20 50 67 48 64 72 20 2a 70 20 3d 20 73 71 6c    PgHdr *p = sql
15190 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
151a0 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  pPager, 1);.    
151b0 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 70  if( p ){.      p
151c0 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 30 3b 0a  ->pageHash = 0;.
151d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
151e0 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70  erUnrefNotNull(p
151f0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
15200 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 42 69  dif..  sqlite3Bi
15210 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
15220 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->pInJournal);
15230 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  .  pPager->pInJo
15240 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 70 50 61  urnal = 0;.  pPa
15250 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
15260 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
15270 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 4d 45  OK ){.    if( ME
15280 4d 44 42 20 7c 7c 20 70 61 67 65 72 46 6c 75 73  MDB || pagerFlus
15290 68 4f 6e 43 6f 6d 6d 69 74 28 70 50 61 67 65 72  hOnCommit(pPager
152a0 2c 20 62 43 6f 6d 6d 69 74 29 20 29 7b 0a 20 20  , bCommit) ){.  
152b0 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
152c0 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65 72  eCleanAll(pPager
152d0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20  ->pPCache);.    
152e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
152f0 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 57  ite3PcacheClearW
15300 72 69 74 61 62 6c 65 28 70 50 61 67 65 72 2d 3e  ritable(pPager->
15310 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20 7d 0a  pPCache);.    }.
15320 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
15330 65 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  eTruncate(pPager
15340 2d 3e 70 50 43 61 63 68 65 2c 20 70 50 61 67 65  ->pPCache, pPage
15350 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a  r->dbSize);.  }.
15360 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57  .  if( pagerUseW
15370 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
15380 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 57 41    /* Drop the WA
15390 4c 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 69 66  L write-lock, if
153a0 20 61 6e 79 2e 20 41 6c 73 6f 2c 20 69 66 20 74   any. Also, if t
153b0 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61  he connection wa
153c0 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20 6c 6f 63  s in .    ** loc
153d0 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73  king_mode=exclus
153e0 69 76 65 20 6d 6f 64 65 20 62 75 74 20 69 73 20  ive mode but is 
153f0 6e 6f 20 6c 6f 6e 67 65 72 2c 20 64 72 6f 70 20  no longer, drop 
15400 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 0a 20  the EXCLUSIVE . 
15410 20 20 20 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20     ** lock held 
15420 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
15430 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
15440 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 57 61   rc2 = sqlite3Wa
15450 6c 45 6e 64 57 72 69 74 65 54 72 61 6e 73 61 63  lEndWriteTransac
15460 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61  tion(pPager->pWa
15470 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  l);.    assert( 
15480 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  rc2==SQLITE_OK )
15490 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63  ;.  }else if( rc
154a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
154b0 43 6f 6d 6d 69 74 20 26 26 20 70 50 61 67 65 72  Commit && pPager
154c0 2d 3e 64 62 46 69 6c 65 53 69 7a 65 3e 70 50 61  ->dbFileSize>pPa
154d0 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20  ger->dbSize ){. 
154e0 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
154f0 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20  h is taken when 
15500 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61  committing a tra
15510 6e 73 61 63 74 69 6f 6e 20 69 6e 20 72 6f 6c 6c  nsaction in roll
15520 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20  back-journal.   
15530 20 2a 2a 20 6d 6f 64 65 20 69 66 20 74 68 65 20   ** mode if the 
15540 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e  database file on
15550 20 64 69 73 6b 20 69 73 20 6c 61 72 67 65 72 20   disk is larger 
15560 74 68 61 6e 20 74 68 65 20 64 61 74 61 62 61 73  than the databas
15570 65 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 20  e image..    ** 
15580 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  At this point th
15590 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65  e journal has be
155a0 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 61 6e 64  en finalized and
155b0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
155c0 20 0a 20 20 20 20 2a 2a 20 73 75 63 63 65 73 73   .    ** success
155d0 66 75 6c 6c 79 20 63 6f 6d 6d 69 74 74 65 64 2c  fully committed,
155e0 20 62 75 74 20 74 68 65 20 45 58 43 4c 55 53 49   but the EXCLUSI
155f0 56 45 20 6c 6f 63 6b 20 69 73 20 73 74 69 6c 6c  VE lock is still
15600 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 20   held on the.   
15610 20 2a 2a 20 66 69 6c 65 2e 20 53 6f 20 69 74 20   ** file. So it 
15620 69 73 20 73 61 66 65 20 74 6f 20 74 72 75 6e 63  is safe to trunc
15630 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ate the database
15640 20 66 69 6c 65 20 74 6f 20 69 74 73 20 6d 69 6e   file to its min
15650 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 72 65 71 75  imum.    ** requ
15660 69 72 65 64 20 73 69 7a 65 2e 20 20 2a 2f 0a 20  ired size.  */. 
15670 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
15680 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  r->eLock==EXCLUS
15690 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  IVE_LOCK );.    
156a0 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
156b0 61 74 65 28 70 50 61 67 65 72 2c 20 70 50 61 67  ate(pPager, pPag
156c0 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d  er->dbSize);.  }
156d0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
156e0 54 45 5f 4f 4b 20 26 26 20 62 43 6f 6d 6d 69 74  TE_OK && bCommit
156f0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
15700 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
15710 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51  l(pPager->fd, SQ
15720 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 4f 4d 4d 49  LITE_FCNTL_COMMI
15730 54 5f 50 48 41 53 45 54 57 4f 2c 20 30 29 3b 0a  T_PHASETWO, 0);.
15740 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
15750 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 20 72 63  TE_NOTFOUND ) rc
15760 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
15770 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  }..  if( !pPager
15780 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
15790 0a 20 20 20 26 26 20 28 21 70 61 67 65 72 55 73  .   && (!pagerUs
157a0 65 57 61 6c 28 70 50 61 67 65 72 29 20 7c 7c 20  eWal(pPager) || 
157b0 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73  sqlite3WalExclus
157c0 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e  iveMode(pPager->
157d0 70 57 61 6c 2c 20 30 29 29 0a 20 20 29 7b 0a 20  pWal, 0)).  ){. 
157e0 20 20 20 72 63 32 20 3d 20 70 61 67 65 72 55 6e     rc2 = pagerUn
157f0 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53  lockDb(pPager, S
15800 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
15810 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
15820 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20  ountDone = 0;.  
15830 7d 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61  }.  pPager->eSta
15840 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45  te = PAGER_READE
15850 52 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74  R;.  pPager->set
15860 4d 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72  Master = 0;..  r
15870 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54  eturn (rc==SQLIT
15880 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a  E_OK?rc2:rc);.}.
15890 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61  ./*.** Execute a
158a0 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74   rollback if a t
158b0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
158c0 74 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20  tive and unlock 
158d0 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65  the .** database
158e0 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66   file. .**.** If
158f0 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 61   the pager has a
15900 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74  lready entered t
15910 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20  he ERROR state, 
15920 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a  do not attempt .
15930 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
15940 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 49 6e  at this time. In
15950 73 74 65 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c  stead, pager_unl
15960 6f 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  ock() is called.
15970 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20   The.** call to 
15980 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77  pager_unlock() w
15990 69 6c 6c 20 64 69 73 63 61 72 64 20 61 6c 6c 20  ill discard all 
159a0 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c  in-memory pages,
159b0 20 75 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64   unlock.** the d
159c0 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
159d0 20 6d 6f 76 65 20 74 68 65 20 70 61 67 65 72 20   move the pager 
159e0 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61  back to OPEN sta
159f0 74 65 2e 20 49 66 20 74 68 69 73 20 0a 2a 2a 20  te. If this .** 
15a00 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 72 65  means that there
15a10 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   is a hot-journa
15a20 6c 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69  l left in the fi
15a30 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68 65 20 6e  le-system, the n
15a40 65 78 74 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  ext .** connecti
15a50 6f 6e 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73  on to obtain a s
15a60 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68  hared lock on th
15a70 65 20 70 61 67 65 72 20 28 77 68 69 63 68 20 6d  e pager (which m
15a80 61 79 20 62 65 20 74 68 69 73 20 6f 6e 65 29 20  ay be this one) 
15a90 0a 2a 2a 20 77 69 6c 6c 20 72 6f 6c 6c 20 69 74  .** will roll it
15aa0 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   back..**.** If 
15ab0 74 68 65 20 70 61 67 65 72 20 68 61 73 20 6e 6f  the pager has no
15ac0 74 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65  t already entere
15ad0 64 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  d the ERROR stat
15ae0 65 2c 20 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a  e, but an IO or.
15af0 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20  ** malloc error 
15b00 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20  occurs during a 
15b10 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74  rollback, then t
15b20 68 69 73 20 77 69 6c 6c 20 69 74 73 65 6c 66 20  his will itself 
15b30 63 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61  cause .** the pa
15b40 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65  ger to enter the
15b50 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 57 68   ERROR state. Wh
15b60 69 63 68 20 77 69 6c 6c 20 62 65 20 63 6c 65 61  ich will be clea
15b70 72 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 61  red by the.** ca
15b80 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f  ll to pager_unlo
15b90 63 6b 28 29 2c 20 61 73 20 64 65 73 63 72 69 62  ck(), as describ
15ba0 65 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61  ed above..*/.sta
15bb0 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e  tic void pagerUn
15bc0 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
15bd0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
15be0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53    if( pPager->eS
15bf0 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
15c00 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74  R && pPager->eSt
15c10 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate!=PAGER_OPEN 
15c20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61  ){.    assert( a
15c30 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
15c40 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  e(pPager) );.   
15c50 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
15c60 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
15c70 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20  R_LOCKED ){.    
15c80 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
15c90 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
15ca0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
15cb0 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  Rollback(pPager)
15cc0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
15cd0 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
15ce0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
15cf0 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
15d00 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  veMode ){.      
15d10 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
15d20 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
15d30 41 44 45 52 20 29 3b 0a 20 20 20 20 20 20 70 61  ADER );.      pa
15d40 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
15d50 69 6f 6e 28 70 50 61 67 65 72 2c 20 30 2c 20 30  ion(pPager, 0, 0
15d60 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  );.    }.  }.  p
15d70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
15d80 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61  er);.}../*.** Pa
15d90 72 61 6d 65 74 65 72 20 61 44 61 74 61 20 6d 75  rameter aData mu
15da0 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  st point to a bu
15db0 66 66 65 72 20 6f 66 20 70 50 61 67 65 72 2d 3e  ffer of pPager->
15dc0 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 0a 2a  pageSize bytes.*
15dd0 2a 20 6f 66 20 64 61 74 61 2e 20 43 6f 6d 70 75  * of data. Compu
15de0 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  te and return a 
15df0 63 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f  checksum based o
15e00 6e 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  nt the contents 
15e10 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20  of the .** page 
15e20 6f 66 20 64 61 74 61 20 61 6e 64 20 74 68 65 20  of data and the 
15e30 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66  current value of
15e40 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
15e50 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  it..**.** This i
15e60 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65  s not a real che
15e70 63 6b 73 75 6d 2e 20 49 74 20 69 73 20 72 65 61  cksum. It is rea
15e80 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d  lly just the sum
15e90 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64   of the .** rand
15ea0 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  om initial value
15eb0 20 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49   (pPager->cksumI
15ec0 6e 69 74 29 20 61 6e 64 20 65 76 65 72 79 20 32  nit) and every 2
15ed0 30 30 74 68 20 62 79 74 65 0a 2a 2a 20 6f 66 20  00th byte.** of 
15ee0 74 68 65 20 70 61 67 65 20 64 61 74 61 2c 20 73  the page data, s
15ef0 74 61 72 74 69 6e 67 20 77 69 74 68 20 62 79 74  tarting with byt
15f00 65 20 6f 66 66 73 65 74 20 28 70 50 61 67 65 72  e offset (pPager
15f10 2d 3e 70 61 67 65 53 69 7a 65 25 32 30 30 29 2e  ->pageSize%200).
15f20 0a 2a 2a 20 45 61 63 68 20 62 79 74 65 20 69 73  .** Each byte is
15f30 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
15f40 61 6e 20 38 2d 62 69 74 20 75 6e 73 69 67 6e 65  an 8-bit unsigne
15f50 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a  d integer..**.**
15f60 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20 66 6f   Changing the fo
15f70 72 6d 75 6c 61 20 75 73 65 64 20 74 6f 20 63 6f  rmula used to co
15f80 6d 70 75 74 65 20 74 68 69 73 20 63 68 65 63 6b  mpute this check
15f90 73 75 6d 20 72 65 73 75 6c 74 73 20 69 6e 20 61  sum results in a
15fa0 6e 0a 2a 2a 20 69 6e 63 6f 6d 70 61 74 69 62 6c  n.** incompatibl
15fb0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
15fc0 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ormat..**.** If 
15fd0 6a 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70 74 69  journal corrupti
15fe0 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f  on occurs due to
15ff0 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
16000 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c  , the most likel
16010 79 20 0a 2a 2a 20 73 63 65 6e 61 72 69 6f 20 69  y .** scenario i
16020 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f  s that one end o
16030 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74  r the other of t
16040 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62  he record will b
16050 65 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49  e changed. .** I
16060 74 20 69 73 20 6d 75 63 68 20 6c 65 73 73 20 6c  t is much less l
16070 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20 74  ikely that the t
16080 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a  wo ends of the j
16090 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69  ournal record wi
160a0 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74  ll be.** correct
160b0 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20   and the middle 
160c0 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75  be corrupt.  Thu
160d0 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73 75  s, this "checksu
160e0 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68  m" scheme,.** th
160f0 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20 73 69  ough fast and si
16100 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68  mple, catches th
16110 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20  e mostly likely 
16120 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69  kind of corrupti
16130 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33  on..*/.static u3
16140 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61  2 pager_cksum(Pa
16150 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
16160 73 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20  st u8 *aData){. 
16170 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61   u32 cksum = pPa
16180 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 20  ger->cksumInit; 
16190 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
161a0 73 75 6d 20 76 61 6c 75 65 20 74 6f 20 72 65 74  sum value to ret
161b0 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d  urn */.  int i =
161c0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
161d0 65 2d 32 30 30 3b 20 20 20 20 20 20 20 20 20 20  e-200;          
161e0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
161f0 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20  */.  while( i>0 
16200 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20  ){.    cksum += 
16210 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20  aData[i];.    i 
16220 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65  -= 200;.  }.  re
16230 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f  turn cksum;.}../
16240 2a 0a 2a 2a 20 52 65 70 6f 72 74 20 74 68 65 20  *.** Report the 
16250 63 75 72 72 65 6e 74 20 70 61 67 65 20 73 69 7a  current page siz
16260 65 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20  e and number of 
16270 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20 62  reserved bytes b
16280 61 63 6b 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f  ack.** to the co
16290 64 65 63 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  dec..*/.#ifdef S
162a0 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
162b0 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
162c0 72 52 65 70 6f 72 74 53 69 7a 65 28 50 61 67 65  rReportSize(Page
162d0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
162e0 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63  ( pPager->xCodec
162f0 53 69 7a 65 43 68 6e 67 20 29 7b 0a 20 20 20 20  SizeChng ){.    
16300 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69  pPager->xCodecSi
16310 7a 65 43 68 6e 67 28 70 50 61 67 65 72 2d 3e 70  zeChng(pPager->p
16320 43 6f 64 65 63 2c 20 70 50 61 67 65 72 2d 3e 70  Codec, pPager->p
16330 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20  ageSize,.       
16340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16350 20 20 20 20 28 69 6e 74 29 70 50 61 67 65 72 2d      (int)pPager-
16360 3e 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 7d 0a  >nReserve);.  }.
16370 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
16380 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65   pagerReportSize
16390 28 58 29 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70  (X)     /* No-op
163a0 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 20 73 75   if we do not su
163b0 70 70 6f 72 74 20 61 20 63 6f 64 65 63 20 2a 2f  pport a codec */
163c0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
163d0 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
163e0 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
163f0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
16400 65 73 65 72 76 65 64 20 62 69 74 73 20 69 73 20  eserved bits is 
16410 74 68 65 20 73 61 6d 65 20 69 6e 20 74 68 65 20  the same in the 
16420 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 70  destination.** p
16430 61 67 65 72 20 61 73 20 69 74 20 69 73 20 69 6e  ager as it is in
16440 20 74 68 65 20 73 6f 75 72 63 65 2e 20 20 54 68   the source.  Th
16450 69 73 20 63 6f 6d 65 73 20 75 70 20 77 68 65 6e  is comes up when
16460 20 61 20 56 41 43 55 55 4d 20 63 68 61 6e 67 65   a VACUUM change
16470 73 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20  s the.** number 
16480 6f 66 20 72 65 73 65 72 76 65 64 20 62 69 74 73  of reserved bits
16490 20 74 6f 20 74 68 65 20 22 6f 70 74 69 6d 61 6c   to the "optimal
164a0 22 20 61 6d 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69  " amount..*/.voi
164b0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 6c  d sqlite3PagerAl
164c0 69 67 6e 52 65 73 65 72 76 65 28 50 61 67 65 72  ignReserve(Pager
164d0 20 2a 70 44 65 73 74 2c 20 50 61 67 65 72 20 2a   *pDest, Pager *
164e0 70 53 72 63 29 7b 0a 20 20 69 66 28 20 70 44 65  pSrc){.  if( pDe
164f0 73 74 2d 3e 6e 52 65 73 65 72 76 65 21 3d 70 53  st->nReserve!=pS
16500 72 63 2d 3e 6e 52 65 73 65 72 76 65 20 29 7b 0a  rc->nReserve ){.
16510 20 20 20 20 70 44 65 73 74 2d 3e 6e 52 65 73 65      pDest->nRese
16520 72 76 65 20 3d 20 70 53 72 63 2d 3e 6e 52 65 73  rve = pSrc->nRes
16530 65 72 76 65 3b 0a 20 20 20 20 70 61 67 65 72 52  erve;.    pagerR
16540 65 70 6f 72 74 53 69 7a 65 28 70 44 65 73 74 29  eportSize(pDest)
16550 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
16560 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e  /*.** Read a sin
16570 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 65 69  gle page from ei
16580 74 68 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ther the journal
16590 20 66 69 6c 65 20 28 69 66 20 69 73 4d 61 69 6e   file (if isMain
165a0 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66  Jrnl==1) or.** f
165b0 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
165c0 6e 61 6c 20 28 69 66 20 69 73 4d 61 69 6e 4a 72  nal (if isMainJr
165d0 6e 6c 3d 3d 30 29 20 61 6e 64 20 70 6c 61 79 62  nl==0) and playb
165e0 61 63 6b 20 74 68 61 74 20 70 61 67 65 2e 0a 2a  ack that page..*
165f0 2a 20 54 68 65 20 70 61 67 65 20 62 65 67 69 6e  * The page begin
16600 73 20 61 74 20 6f 66 66 73 65 74 20 2a 70 4f 66  s at offset *pOf
16610 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69  fset into the fi
16620 6c 65 2e 20 54 68 65 20 2a 70 4f 66 66 73 65 74  le. The *pOffset
16630 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20 69 6e 63  .** value is inc
16640 72 65 61 73 65 64 20 74 6f 20 74 68 65 20 73 74  reased to the st
16650 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20  art of the next 
16660 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  page in the jour
16670 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  nal..**.** The m
16680 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  ain rollback jou
16690 72 6e 61 6c 20 75 73 65 73 20 63 68 65 63 6b 73  rnal uses checks
166a0 75 6d 73 20 2d 20 74 68 65 20 73 74 61 74 65 6d  ums - the statem
166b0 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73  ent journal does
166c0 20 0a 2a 2a 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20   .** not..**.** 
166d0 49 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  If the page numb
166e0 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 72  er of the page r
166f0 65 63 6f 72 64 20 72 65 61 64 20 66 72 6f 6d 20  ecord read from 
16700 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61  the (sub-)journa
16710 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65  l file.** is gre
16720 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75  ater than the cu
16730 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 50  rrent value of P
16740 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 65  ager.dbSize, the
16750 6e 20 70 6c 61 79 62 61 63 6b 20 69 73 0a 2a 2a  n playback is.**
16760 20 73 6b 69 70 70 65 64 20 61 6e 64 20 53 51 4c   skipped and SQL
16770 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
16780 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f  ed..**.** If pDo
16790 6e 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  ne is not NULL, 
167a0 74 68 65 6e 20 69 74 20 69 73 20 61 20 72 65 63  then it is a rec
167b0 6f 72 64 20 6f 66 20 70 61 67 65 73 20 74 68 61  ord of pages tha
167c0 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 2a  t have already.*
167d0 2a 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61  * been played ba
167e0 63 6b 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  ck.  If the page
167f0 20 61 74 20 2a 70 4f 66 66 73 65 74 20 68 61 73   at *pOffset has
16800 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c   already been pl
16810 61 79 65 64 20 62 61 63 6b 0a 2a 2a 20 28 69 66  ayed back.** (if
16820 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
16830 6e 67 20 70 44 6f 6e 65 20 62 69 74 20 69 73 20  ng pDone bit is 
16840 73 65 74 29 20 74 68 65 6e 20 73 6b 69 70 20 74  set) then skip t
16850 68 65 20 70 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20  he playback..** 
16860 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 70 44  Make sure the pD
16870 6f 6e 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f  one bit correspo
16880 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 2a 70 4f  nding to the *pO
16890 66 66 73 65 74 20 70 61 67 65 20 69 73 20 73 65  ffset page is se
168a0 74 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 72 65  t.** prior to re
168b0 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  turning..**.** I
168c0 66 20 74 68 65 20 70 61 67 65 20 72 65 63 6f 72  f the page recor
168d0 64 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c  d is successfull
168e0 79 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  y read from the 
168f0 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69  (sub-)journal fi
16900 6c 65 0a 2a 2a 20 61 6e 64 20 70 6c 61 79 65 64  le.** and played
16910 20 62 61 63 6b 2c 20 74 68 65 6e 20 53 51 4c 49   back, then SQLI
16920 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
16930 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
16940 72 20 6f 63 63 75 72 73 0a 2a 2a 20 77 68 69 6c  r occurs.** whil
16950 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 72 65  e reading the re
16960 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 28 73  cord from the (s
16970 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ub-)journal file
16980 20 6f 72 20 77 68 69 6c 65 20 77 72 69 74 69 6e   or while writin
16990 67 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61  g.** to the data
169a0 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
169b0 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
169c0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  e is returned. I
169d0 66 20 64 61 74 61 0a 2a 2a 20 69 73 20 73 75 63  f data.** is suc
169e0 63 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66  cessfully read f
169f0 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f  rom the (sub-)jo
16a00 75 72 6e 61 6c 20 66 69 6c 65 20 62 75 74 20 61  urnal file but a
16a10 70 70 65 61 72 73 20 74 6f 20 62 65 0a 2a 2a 20  ppears to be.** 
16a20 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54  corrupted, SQLIT
16a30 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e  E_DONE is return
16a40 65 64 2e 20 44 61 74 61 20 69 73 20 63 6f 6e 73  ed. Data is cons
16a50 69 64 65 72 65 64 20 63 6f 72 72 75 70 74 65 64  idered corrupted
16a60 20 69 6e 0a 2a 2a 20 74 77 6f 20 63 69 72 63 75   in.** two circu
16a70 6d 73 74 61 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a  mstances:.** .**
16a80 20 20 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f     * If the reco
16a90 72 64 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69  rd page-number i
16aa0 73 20 69 6c 6c 65 67 61 6c 20 28 30 20 6f 72 20  s illegal (0 or 
16ab0 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20  PAGER_MJ_PGNO), 
16ac0 6f 72 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65  or.**   * If the
16ad0 20 72 65 63 6f 72 64 20 69 73 20 62 65 69 6e 67   record is being
16ae0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 66 72 6f   rolled back fro
16af0 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  m the main journ
16b00 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61  al file.**     a
16b10 6e 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  nd the checksum 
16b20 66 69 65 6c 64 20 64 6f 65 73 20 6e 6f 74 20 6d  field does not m
16b30 61 74 63 68 20 74 68 65 20 72 65 63 6f 72 64 20  atch the record 
16b40 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e  content..**.** N
16b50 65 69 74 68 65 72 20 6f 66 20 74 68 65 73 65 20  either of these 
16b60 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 20 61 72  two scenarios ar
16b70 65 20 70 6f 73 73 69 62 6c 65 20 64 75 72 69 6e  e possible durin
16b80 67 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f  g a savepoint ro
16b90 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  llback..**.** If
16ba0 20 74 68 69 73 20 69 73 20 61 20 73 61 76 65 70   this is a savep
16bb0 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 74  oint rollback, t
16bc0 68 65 6e 20 6d 65 6d 6f 72 79 20 6d 61 79 20 68  hen memory may h
16bd0 61 76 65 20 74 6f 20 62 65 20 64 79 6e 61 6d 69  ave to be dynami
16be0 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74  cally.** allocat
16bf0 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
16c00 69 6f 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20  ion. If this is 
16c10 74 68 65 20 63 61 73 65 20 61 6e 64 20 61 6e 20  the case and an 
16c20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
16c30 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ,.** SQLITE_NOME
16c40 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  M is returned..*
16c50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
16c60 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
16c70 70 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70  page(.  Pager *p
16c80 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
16c90 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
16ca0 65 72 20 62 65 69 6e 67 20 70 6c 61 79 65 64 20  er being played 
16cb0 62 61 63 6b 20 2a 2f 0a 20 20 69 36 34 20 2a 70  back */.  i64 *p
16cc0 4f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20  Offset,         
16cd0 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
16ce0 74 20 6f 66 20 72 65 63 6f 72 64 20 74 6f 20 70  t of record to p
16cf0 6c 61 79 62 61 63 6b 20 2a 2f 0a 20 20 42 69 74  layback */.  Bit
16d00 76 65 63 20 2a 70 44 6f 6e 65 2c 20 20 20 20 20  vec *pDone,     
16d10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69             /* Bi
16d20 74 76 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c  tvec of pages al
16d30 72 65 61 64 79 20 70 6c 61 79 65 64 20 62 61 63  ready played bac
16d40 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61 69  k */.  int isMai
16d50 6e 4a 72 6e 6c 2c 20 20 20 20 20 20 20 20 20 20  nJrnl,          
16d60 20 20 20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61 69       /* 1 -> mai
16d70 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e 20  n journal. 0 -> 
16d80 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a  sub-journal. */.
16d90 20 20 69 6e 74 20 69 73 53 61 76 65 70 6e 74 20    int isSavepnt 
16da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16db0 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 73 61  /* True for a sa
16dc0 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
16dd0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
16de0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20  .  PgHdr *pPg;  
16df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e00 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20   /* An existing 
16e10 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68  page in the cach
16e20 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
16e30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16e40 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
16e50 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67   number of a pag
16e60 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  e in journal */.
16e70 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20    u32 cksum;    
16e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e90 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64  /* Checksum used
16ea0 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63   for sanity chec
16eb0 6b 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a  king */.  char *
16ec0 61 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  aData;          
16ed0 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f          /* Tempo
16ee0 72 61 72 79 20 73 74 6f 72 61 67 65 20 66 6f 72  rary storage for
16ef0 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 73   the page */.  s
16f00 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64  qlite3_file *jfd
16f10 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
16f20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  The file descrip
16f30 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  tor for the jour
16f40 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  nal file */.  in
16f50 74 20 69 73 53 79 6e 63 65 64 3b 20 20 20 20 20  t isSynced;     
16f60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
16f70 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 70  rue if journal p
16f80 61 67 65 20 69 73 20 73 79 6e 63 65 64 20 2a 2f  age is synced */
16f90 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
16fa0 41 53 5f 43 4f 44 45 43 0a 20 20 2f 2a 20 54 68  AS_CODEC.  /* Th
16fb0 65 20 6a 72 6e 6c 45 6e 63 20 66 6c 61 67 20 69  e jrnlEnc flag i
16fc0 73 20 74 72 75 65 20 69 66 20 4a 6f 75 72 6e 61  s true if Journa
16fd0 6c 20 70 61 67 65 73 20 73 68 6f 75 6c 64 20 62  l pages should b
16fe0 65 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68  e passed through
16ff0 0a 20 20 2a 2a 20 74 68 65 20 63 6f 64 65 63 2e  .  ** the codec.
17000 20 20 49 74 20 69 73 20 66 61 6c 73 65 20 66 6f    It is false fo
17010 72 20 70 75 72 65 20 69 6e 2d 6d 65 6d 6f 72 79  r pure in-memory
17020 20 6a 6f 75 72 6e 61 6c 73 2e 20 2a 2f 0a 20 20   journals. */.  
17030 63 6f 6e 73 74 20 69 6e 74 20 6a 72 6e 6c 45 6e  const int jrnlEn
17040 63 20 3d 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 20  c = (isMainJrnl 
17050 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49  || pPager->subjI
17060 6e 4d 65 6d 6f 72 79 3d 3d 30 29 3b 0a 23 65 6e  nMemory==0);.#en
17070 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 28  dif..  assert( (
17080 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e 31 29 3d 3d  isMainJrnl&~1)==
17090 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 69 73 4d  0 );      /* isM
170a0 61 69 6e 4a 72 6e 6c 20 69 73 20 30 20 6f 72 20  ainJrnl is 0 or 
170b0 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  1 */.  assert( (
170c0 69 73 53 61 76 65 70 6e 74 26 7e 31 29 3d 3d 30  isSavepnt&~1)==0
170d0 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 69 73 53   );       /* isS
170e0 61 76 65 70 6e 74 20 69 73 20 30 20 6f 72 20 31  avepnt is 0 or 1
170f0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73   */.  assert( is
17100 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20 70 44 6f 6e  MainJrnl || pDon
17110 65 20 29 3b 20 20 20 20 20 2f 2a 20 70 44 6f 6e  e );     /* pDon
17120 65 20 61 6c 77 61 79 73 20 75 73 65 64 20 6f 6e  e always used on
17130 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f   sub-journals */
17140 0a 20 20 61 73 73 65 72 74 28 20 69 73 53 61 76  .  assert( isSav
17150 65 70 6e 74 20 7c 7c 20 70 44 6f 6e 65 3d 3d 30  epnt || pDone==0
17160 20 29 3b 20 20 20 2f 2a 20 70 44 6f 6e 65 20 6e   );   /* pDone n
17170 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6e 6f 6e  ever used on non
17180 2d 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 0a 20  -savepoint */.. 
17190 20 61 44 61 74 61 20 3d 20 70 50 61 67 65 72 2d   aData = pPager-
171a0 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 61 73  >pTmpSpace;.  as
171b0 73 65 72 74 28 20 61 44 61 74 61 20 29 3b 20 20  sert( aData );  
171c0 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73         /* Temp s
171d0 74 6f 72 61 67 65 20 6d 75 73 74 20 68 61 76 65  torage must have
171e0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c   already been al
171f0 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 61 73 73  located */.  ass
17200 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
17210 28 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20 28  (pPager)==0 || (
17220 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 69  !isMainJrnl && i
17230 73 53 61 76 65 70 6e 74 29 20 29 3b 0a 0a 20 20  sSavepnt) );..  
17240 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20 73 74  /* Either the st
17250 61 74 65 20 69 73 20 67 72 65 61 74 65 72 20 74  ate is greater t
17260 68 61 6e 20 50 41 47 45 52 5f 57 52 49 54 45 52  han PAGER_WRITER
17270 5f 43 41 43 48 45 4d 4f 44 20 28 61 20 74 72 61  _CACHEMOD (a tra
17280 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f  nsaction .  ** o
17290 72 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  r savepoint roll
172a0 62 61 63 6b 20 64 6f 6e 65 20 61 74 20 74 68 65  back done at the
172b0 20 72 65 71 75 65 73 74 20 6f 66 20 74 68 65 20   request of the 
172c0 63 61 6c 6c 65 72 29 20 6f 72 20 74 68 69 73 20  caller) or this 
172d0 69 73 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f  is.  ** a hot-jo
172e0 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20  urnal rollback. 
172f0 49 66 20 69 74 20 69 73 20 61 20 68 6f 74 2d 6a  If it is a hot-j
17300 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c  ournal rollback,
17310 20 74 68 65 20 70 61 67 65 72 0a 20 20 2a 2a 20   the pager.  ** 
17320 69 73 20 69 6e 20 73 74 61 74 65 20 4f 50 45 4e  is in state OPEN
17330 20 61 6e 64 20 68 6f 6c 64 73 20 61 6e 20 45 58   and holds an EX
17340 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 48 6f  CLUSIVE lock. Ho
17350 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
17360 63 6b 0a 20 20 2a 2a 20 6f 6e 6c 79 20 72 65 61  ck.  ** only rea
17370 64 73 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ds from the main
17380 20 6a 6f 75 72 6e 61 6c 2c 20 6e 6f 74 20 74 68   journal, not th
17390 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20  e sub-journal.. 
173a0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
173b0 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
173c0 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
173d0 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  MOD.       || (p
173e0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
173f0 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 70 50 61  AGER_OPEN && pPa
17400 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c  ger->eLock==EXCL
17410 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b  USIVE_LOCK).  );
17420 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
17430 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
17440 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
17450 20 7c 7c 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29   || isMainJrnl )
17460 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  ;..  /* Read the
17470 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64   page number and
17480 20 70 61 67 65 20 64 61 74 61 20 66 72 6f 6d 20   page data from 
17490 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73  the journal or s
174a0 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  ub-journal.  ** 
174b0 66 69 6c 65 2e 20 52 65 74 75 72 6e 20 61 6e 20  file. Return an 
174c0 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68  error code to th
174d0 65 20 63 61 6c 6c 65 72 20 69 66 20 61 6e 20 49  e caller if an I
174e0 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a  O error occurs..
174f0 20 20 2a 2f 0a 20 20 6a 66 64 20 3d 20 69 73 4d    */.  jfd = isM
17500 61 69 6e 4a 72 6e 6c 20 3f 20 70 50 61 67 65 72  ainJrnl ? pPager
17510 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72 2d 3e  ->jfd : pPager->
17520 73 6a 66 64 3b 0a 20 20 72 63 20 3d 20 72 65 61  sjfd;.  rc = rea
17530 64 33 32 62 69 74 73 28 6a 66 64 2c 20 2a 70 4f  d32bits(jfd, *pO
17540 66 66 73 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20  ffset, &pgno);. 
17550 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17560 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
17570 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
17580 52 65 61 64 28 6a 66 64 2c 20 28 75 38 2a 29 61  Read(jfd, (u8*)a
17590 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
175a0 67 65 53 69 7a 65 2c 20 28 2a 70 4f 66 66 73 65  geSize, (*pOffse
175b0 74 29 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21  t)+4);.  if( rc!
175c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
175d0 75 72 6e 20 72 63 3b 0a 20 20 2a 70 4f 66 66 73  urn rc;.  *pOffs
175e0 65 74 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61  et += pPager->pa
175f0 67 65 53 69 7a 65 20 2b 20 34 20 2b 20 69 73 4d  geSize + 4 + isM
17600 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a  ainJrnl*4;..  /*
17610 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   Sanity checking
17620 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54   on the page.  T
17630 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f  his is more impo
17640 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69  rtant that I ori
17650 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f  ginally.  ** tho
17660 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65  ught.  If a powe
17670 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  r failure occurs
17680 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
17690 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69 74  al is being writ
176a0 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75  ten,.  ** it cou
176b0 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64  ld cause invalid
176c0 20 64 61 74 61 20 74 6f 20 62 65 20 77 72 69 74   data to be writ
176d0 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
176e0 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74  rnal.  We need t
176f0 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68  o.  ** detect th
17700 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20  is invalid data 
17710 28 77 69 74 68 20 68 69 67 68 20 70 72 6f 62 61  (with high proba
17720 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f  bility) and igno
17730 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  re it..  */.  if
17740 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e  ( pgno==0 || pgn
17750 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o==PAGER_MJ_PGNO
17760 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
17770 61 73 73 65 72 74 28 20 21 69 73 53 61 76 65 70  assert( !isSavep
17780 6e 74 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  nt );.    return
17790 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
177a0 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 50 67  }.  if( pgno>(Pg
177b0 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  no)pPager->dbSiz
177c0 65 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76  e || sqlite3Bitv
177d0 65 63 54 65 73 74 28 70 44 6f 6e 65 2c 20 70 67  ecTest(pDone, pg
177e0 6e 6f 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  no) ){.    retur
177f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
17800 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e  .  if( isMainJrn
17810 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65  l ){.    rc = re
17820 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 28 2a  ad32bits(jfd, (*
17830 70 4f 66 66 73 65 74 29 2d 34 2c 20 26 63 6b 73  pOffset)-4, &cks
17840 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  um);.    if( rc 
17850 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
17860 20 69 66 28 20 21 69 73 53 61 76 65 70 6e 74 20   if( !isSavepnt 
17870 26 26 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70  && pager_cksum(p
17880 50 61 67 65 72 2c 20 28 75 38 2a 29 61 44 61 74  Pager, (u8*)aDat
17890 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20  a)!=cksum ){.   
178a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
178b0 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _DONE;.    }.  }
178c0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70  ..  /* If this p
178d0 61 67 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  age has already 
178e0 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b  been played back
178f0 20 62 65 66 6f 72 65 20 64 75 72 69 6e 67 20 74   before during t
17900 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20  he current.  ** 
17910 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 64  rollback, then d
17920 6f 6e 27 74 20 62 6f 74 68 65 72 20 74 6f 20 70  on't bother to p
17930 6c 61 79 20 69 74 20 62 61 63 6b 20 61 67 61 69  lay it back agai
17940 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44  n..  */.  if( pD
17950 6f 6e 65 20 26 26 20 28 72 63 20 3d 20 73 71 6c  one && (rc = sql
17960 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 44  ite3BitvecSet(pD
17970 6f 6e 65 2c 20 70 67 6e 6f 29 29 21 3d 53 51 4c  one, pgno))!=SQL
17980 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
17990 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
179a0 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69 6e 67 20  /* When playing 
179b0 62 61 63 6b 20 70 61 67 65 20 31 2c 20 72 65 73  back page 1, res
179c0 74 6f 72 65 20 74 68 65 20 6e 52 65 73 65 72 76  tore the nReserv
179d0 65 20 73 65 74 74 69 6e 67 0a 20 20 2a 2f 0a 20  e setting.  */. 
179e0 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 26 26 20   if( pgno==1 && 
179f0 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
17a00 21 3d 28 28 75 38 2a 29 61 44 61 74 61 29 5b 32  !=((u8*)aData)[2
17a10 30 5d 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  0] ){.    pPager
17a20 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28 28 75  ->nReserve = ((u
17a30 38 2a 29 61 44 61 74 61 29 5b 32 30 5d 3b 0a 20  8*)aData)[20];. 
17a40 20 20 20 70 61 67 65 72 52 65 70 6f 72 74 53 69     pagerReportSi
17a50 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ze(pPager);.  }.
17a60 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
17a70 65 72 20 69 73 20 69 6e 20 43 41 43 48 45 4d 4f  er is in CACHEMO
17a80 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68  D state, then th
17a90 65 72 65 20 6d 75 73 74 20 62 65 20 61 20 63 6f  ere must be a co
17aa0 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20  py of this.  ** 
17ab0 70 61 67 65 20 69 6e 20 74 68 65 20 70 61 67 65  page in the page
17ac0 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68 69 73  r cache. In this
17ad0 20 63 61 73 65 20 6a 75 73 74 20 75 70 64 61 74   case just updat
17ae0 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  e the pager cach
17af0 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20  e,.  ** not the 
17b00 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
17b10 68 65 20 70 61 67 65 20 69 73 20 6c 65 66 74 20  he page is left 
17b20 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69 6e 20  marked dirty in 
17b30 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a  this case..  **.
17b40 20 20 2a 2a 20 41 6e 20 65 78 63 65 70 74 69 6f    ** An exceptio
17b50 6e 20 74 6f 20 74 68 65 20 61 62 6f 76 65 20 72  n to the above r
17b60 75 6c 65 3a 20 49 66 20 74 68 65 20 64 61 74 61  ule: If the data
17b70 62 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d 73 79  base is in no-sy
17b80 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e 64  nc mode.  ** and
17b90 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64   a page is moved
17ba0 20 64 75 72 69 6e 67 20 61 6e 20 69 6e 63 72 65   during an incre
17bb0 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 74 68  mental vacuum th
17bc0 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79 0a  en the page may.
17bd0 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e 20 74    ** not be in t
17be0 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20  he pager cache. 
17bf0 4c 61 74 65 72 3a 20 69 66 20 61 20 6d 61 6c 6c  Later: if a mall
17c00 6f 63 28 29 20 6f 72 20 49 4f 20 65 72 72 6f 72  oc() or IO error
17c10 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72   occurs.  ** dur
17c20 69 6e 67 20 61 20 4d 6f 76 65 70 61 67 65 28 29  ing a Movepage()
17c30 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20   call, then the 
17c40 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  page may not be 
17c50 69 6e 20 74 68 65 20 63 61 63 68 65 0a 20 20 2a  in the cache.  *
17c60 2a 20 65 69 74 68 65 72 2e 20 53 6f 20 74 68 65  * either. So the
17c70 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72   condition descr
17c80 69 62 65 64 20 69 6e 20 74 68 65 20 61 62 6f 76  ibed in the abov
17c90 65 20 70 61 72 61 67 72 61 70 68 20 69 73 20 6e  e paragraph is n
17ca0 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72 74 28 29  ot.  ** assert()
17cb0 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  able..  **.  ** 
17cc0 49 66 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  If in WRITER_DBM
17cd0 4f 44 2c 20 57 52 49 54 45 52 5f 46 49 4e 49 53  OD, WRITER_FINIS
17ce0 48 45 44 20 6f 72 20 4f 50 45 4e 20 73 74 61 74  HED or OPEN stat
17cf0 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64 61 74  e, then we updat
17d00 65 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 72  e the.  ** pager
17d10 20 63 61 63 68 65 20 69 66 20 69 74 20 65 78 69   cache if it exi
17d20 73 74 73 20 61 6e 64 20 74 68 65 20 6d 61 69 6e  sts and the main
17d30 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20   file. The page 
17d40 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64 20 0a  is then marked .
17d50 20 20 2a 2a 20 6e 6f 74 20 64 69 72 74 79 2e 20    ** not dirty. 
17d60 53 69 6e 63 65 20 74 68 69 73 20 63 6f 64 65 20  Since this code 
17d70 69 73 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 64  is only executed
17d80 20 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e 20 73   in PAGER_OPEN s
17d90 74 61 74 65 20 66 6f 72 0a 20 20 2a 2a 20 61 20  tate for.  ** a 
17da0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
17db0 62 61 63 6b 2c 20 69 74 20 69 73 20 67 75 61 72  back, it is guar
17dc0 61 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 20  anteed that the 
17dd0 70 61 67 65 2d 63 61 63 68 65 20 69 73 20 65 6d  page-cache is em
17de0 70 74 79 0a 20 20 2a 2a 20 69 66 20 74 68 65 20  pty.  ** if the 
17df0 70 61 67 65 72 20 69 73 20 69 6e 20 4f 50 45 4e  pager is in OPEN
17e00 20 73 74 61 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a   state..  **.  *
17e10 2a 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20  * Ticket #1171: 
17e20 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   The statement j
17e30 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e  ournal might con
17e40 74 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e  tain page conten
17e50 74 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64  t that is.  ** d
17e60 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68  ifferent from th
17e70 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61  e page content a
17e80 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
17e90 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  he transaction..
17ea0 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73    ** This occurs
17eb0 20 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 20   when a page is 
17ec0 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f  changed prior to
17ed0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20   the start of a 
17ee0 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74  statement.  ** t
17ef0 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69  hen changed agai
17f00 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61  n within the sta
17f10 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f  tement.  When ro
17f20 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20  lling back such 
17f30 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74  a.  ** statement
17f40 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69   we must not wri
17f50 74 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e  te to the origin
17f60 61 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65  al database unle
17f70 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20  ss we know.  ** 
17f80 66 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61 74  for certain that
17f90 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63   original page c
17fa0 6f 6e 74 65 6e 74 73 20 61 72 65 20 73 79 6e 63  ontents are sync
17fb0 65 64 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e  ed into the main
17fc0 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a   rollback.  ** j
17fd0 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69  ournal.  Otherwi
17fe0 73 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73 73  se, a power loss
17ff0 20 6d 69 67 68 74 20 6c 65 61 76 65 20 6d 6f 64   might leave mod
18000 69 66 69 65 64 20 64 61 74 61 20 69 6e 20 74 68  ified data in th
18010 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
18020 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61 6e 20  file without an 
18030 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72 6f 6c  entry in the rol
18040 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68  lback journal th
18050 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74  at can.  ** rest
18060 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
18070 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
18080 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64   form.  Two cond
18090 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20  itions must be. 
180a0 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65 20 77   ** met before w
180b0 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
180c0 74 61 62 61 73 65 20 66 69 6c 65 73 2e 20 28 31  tabase files. (1
180d0 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  ) the database m
180e0 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b  ust be.  ** lock
180f0 65 64 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77  ed.  (2) we know
18100 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e   that the origin
18110 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  al page content 
18120 69 73 20 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a  is fully synced.
18130 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e    ** in the main
18140 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20   journal either 
18150 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65  because the page
18160 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
18170 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68   or else.  ** th
18180 65 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64  e page is marked
18190 20 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e   as needSync==0.
181a0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d  .  **.  ** 2008-
181b0 30 34 2d 31 34 3a 20 20 57 68 65 6e 20 61 74 74  04-14:  When att
181c0 65 6d 70 74 69 6e 67 20 74 6f 20 76 61 63 75 75  empting to vacuu
181d0 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  m a corrupt data
181e0 62 61 73 65 20 66 69 6c 65 2c 20 69 74 0a 20 20  base file, it.  
181f0 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  ** is possible t
18200 6f 20 66 61 69 6c 20 61 20 73 74 61 74 65 6d 65  o fail a stateme
18210 6e 74 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65  nt on a database
18220 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 79   that does not y
18230 65 74 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44  et exist..  ** D
18240 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f  o not attempt to
18250 20 77 72 69 74 65 20 69 66 20 64 61 74 61 62 61   write if databa
18260 73 65 20 66 69 6c 65 20 68 61 73 20 6e 65 76 65  se file has neve
18270 72 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20  r been opened.. 
18280 20 2a 2f 0a 20 20 69 66 28 20 70 61 67 65 72 55   */.  if( pagerU
18290 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
182a0 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20  .    pPg = 0;.  
182b0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 67 20 3d  }else{.    pPg =
182c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
182d0 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
182e0 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
182f0 20 70 50 67 20 7c 7c 20 21 4d 45 4d 44 42 20 29   pPg || !MEMDB )
18300 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
18310 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
18320 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 67 3d 3d 30  R_OPEN || pPg==0
18330 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
18340 46 69 6c 65 20 29 3b 0a 20 20 50 41 47 45 52 54  File );.  PAGERT
18350 52 41 43 45 28 28 22 50 4c 41 59 42 41 43 4b 20  RACE(("PLAYBACK 
18360 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
18370 25 30 38 78 29 20 25 73 5c 6e 22 2c 0a 20 20 20  %08x) %s\n",.   
18380 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
18390 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70  pPager), pgno, p
183a0 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50  ager_datahash(pP
183b0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
183c0 28 75 38 2a 29 61 44 61 74 61 29 2c 0a 20 20 20  (u8*)aData),.   
183d0 20 20 20 20 20 20 20 20 28 69 73 4d 61 69 6e 4a          (isMainJ
183e0 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61  rnl?"main-journa
183f0 6c 22 3a 22 73 75 62 2d 6a 6f 75 72 6e 61 6c 22  l":"sub-journal"
18400 29 0a 20 20 29 29 3b 0a 20 20 69 66 28 20 69 73  ).  ));.  if( is
18410 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20  MainJrnl ){.    
18420 69 73 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65  isSynced = pPage
18430 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 2a 70  r->noSync || (*p
18440 4f 66 66 73 65 74 20 3c 3d 20 70 50 61 67 65 72  Offset <= pPager
18450 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20  ->journalHdr);. 
18460 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73 53 79   }else{.    isSy
18470 6e 63 65 64 20 3d 20 28 70 50 67 3d 3d 30 20 7c  nced = (pPg==0 |
18480 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61 67 73  | 0==(pPg->flags
18490 20 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59   & PGHDR_NEED_SY
184a0 4e 43 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  NC));.  }.  if( 
184b0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
184c0 64 29 0a 20 20 20 26 26 20 28 70 50 61 67 65 72  d).   && (pPager
184d0 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
184e0 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20  WRITER_DBMOD || 
184f0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
18500 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20 20 26  PAGER_OPEN).   &
18510 26 20 69 73 53 79 6e 63 65 64 0a 20 20 29 7b 0a  & isSynced.  ){.
18520 20 20 20 20 69 36 34 20 6f 66 73 74 20 3d 20 28      i64 ofst = (
18530 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
18540 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
18550 20 20 20 74 65 73 74 63 61 73 65 28 20 21 69 73     testcase( !is
18560 53 61 76 65 70 6e 74 20 26 26 20 70 50 67 21 3d  Savepnt && pPg!=
18570 30 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67 73  0 && (pPg->flags
18580 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
18590 29 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  )!=0 );.    asse
185a0 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
185b0 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 20  (pPager) );..   
185c0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 64 61   /* Write the da
185d0 74 61 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ta read from the
185e0 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 20 69 6e   journal back in
185f0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
18600 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 69  file..    ** Thi
18610 73 20 69 73 20 75 73 75 61 6c 6c 79 20 73 61 66  s is usually saf
18620 65 20 65 76 65 6e 20 66 6f 72 20 61 6e 20 65 6e  e even for an en
18630 63 72 79 70 74 65 64 20 64 61 74 61 62 61 73 65  crypted database
18640 20 2d 20 61 73 20 74 68 65 20 64 61 74 61 0a 20   - as the data. 
18650 20 20 20 2a 2a 20 77 61 73 20 65 6e 63 72 79 70     ** was encryp
18660 74 65 64 20 62 65 66 6f 72 65 20 69 74 20 77 61  ted before it wa
18670 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
18680 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
18690 68 65 20 65 78 63 65 70 74 69 6f 6e 0a 20 20 20  he exception.   
186a0 20 2a 2a 20 69 73 20 69 66 20 74 68 65 20 64 61   ** is if the da
186b0 74 61 20 77 61 73 20 6a 75 73 74 20 72 65 61 64  ta was just read
186c0 20 66 72 6f 6d 20 61 6e 20 69 6e 2d 6d 65 6d 6f   from an in-memo
186d0 72 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  ry sub-journal. 
186e0 49 6e 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 63  In that.    ** c
186f0 61 73 65 20 69 74 20 6d 75 73 74 20 62 65 20 65  ase it must be e
18700 6e 63 72 79 70 74 65 64 20 68 65 72 65 20 62 65  ncrypted here be
18710 66 6f 72 65 20 69 74 20 69 73 20 63 6f 70 69 65  fore it is copie
18720 64 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  d into the datab
18730 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e  ase.    ** file.
18740 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
18750 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20  TE_HAS_CODEC.   
18760 20 69 66 28 20 21 6a 72 6e 6c 45 6e 63 20 29 7b   if( !jrnlEnc ){
18770 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50  .      CODEC2(pP
18780 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e  ager, aData, pgn
18790 6f 2c 20 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f  o, 7, rc=SQLITE_
187a0 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 20 61 44 61 74  NOMEM_BKPT, aDat
187b0 61 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  a);.      rc = s
187c0 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
187d0 61 67 65 72 2d 3e 66 64 2c 20 28 75 38 20 2a 29  ager->fd, (u8 *)
187e0 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
187f0 61 67 65 53 69 7a 65 2c 20 6f 66 73 74 29 3b 0a  ageSize, ofst);.
18800 20 20 20 20 20 20 43 4f 44 45 43 31 28 70 50 61        CODEC1(pPa
18810 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f  ger, aData, pgno
18820 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 3, rc=SQLITE_N
18830 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20 20 20 20  OMEM_BKPT);.    
18840 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
18850 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
18860 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
18870 20 28 75 38 20 2a 29 61 44 61 74 61 2c 20 70 50   (u8 *)aData, pP
18880 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
18890 6f 66 73 74 29 3b 0a 0a 20 20 20 20 69 66 28 20  ofst);..    if( 
188a0 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46  pgno>pPager->dbF
188b0 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ileSize ){.     
188c0 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53   pPager->dbFileS
188d0 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20  ize = pgno;.    
188e0 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
188f0 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a 23 69 66  ->pBackup ){.#if
18900 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
18910 4f 44 45 43 0a 20 20 20 20 20 20 69 66 28 20 6a  ODEC.      if( j
18920 72 6e 6c 45 6e 63 20 29 7b 0a 20 20 20 20 20 20  rnlEnc ){.      
18930 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c    CODEC1(pPager,
18940 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c   aData, pgno, 3,
18950 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   rc=SQLITE_NOMEM
18960 5f 42 4b 50 54 29 3b 0a 20 20 20 20 20 20 20 20  _BKPT);.        
18970 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64  sqlite3BackupUpd
18980 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63  ate(pPager->pBac
18990 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29  kup, pgno, (u8*)
189a0 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20  aData);.        
189b0 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 61  CODEC2(pPager, a
189c0 44 61 74 61 2c 20 70 67 6e 6f 2c 20 37 2c 20 72  Data, pgno, 7, r
189d0 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  c=SQLITE_NOMEM_B
189e0 4b 50 54 2c 61 44 61 74 61 29 3b 0a 20 20 20 20  KPT,aData);.    
189f0 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
18a00 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b       sqlite3Back
18a10 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d  upUpdate(pPager-
18a20 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20  >pBackup, pgno, 
18a30 28 75 38 2a 29 61 44 61 74 61 29 3b 0a 20 20 20  (u8*)aData);.   
18a40 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21   }.  }else if( !
18a50 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50  isMainJrnl && pP
18a60 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49  g==0 ){.    /* I
18a70 66 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c 6c  f this is a roll
18a80 62 61 63 6b 20 6f 66 20 61 20 73 61 76 65 70 6f  back of a savepo
18a90 69 6e 74 20 61 6e 64 20 64 61 74 61 20 77 61 73  int and data was
18aa0 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 0a   not written to.
18ab0 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
18ac0 61 73 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  ase and the page
18ad0 20 69 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72   is not in-memor
18ae0 79 2c 20 74 68 65 72 65 20 69 73 20 61 20 70 6f  y, there is a po
18af0 74 65 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70  tential.    ** p
18b00 72 6f 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65  roblem. When the
18b10 20 70 61 67 65 20 69 73 20 6e 65 78 74 20 66 65   page is next fe
18b20 74 63 68 65 64 20 62 79 20 74 68 65 20 62 2d 74  tched by the b-t
18b30 72 65 65 20 6c 61 79 65 72 2c 20 69 74 20 0a 20  ree layer, it . 
18b40 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65     ** will be re
18b50 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
18b60 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68  base file, which
18b70 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20   may or may not 
18b80 62 65 20 0a 20 20 20 20 2a 2a 20 63 75 72 72 65  be .    ** curre
18b90 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  nt. .    **.    
18ba0 2a 2a 20 54 68 65 72 65 20 61 72 65 20 61 20 63  ** There are a c
18bb0 6f 75 70 6c 65 20 6f 66 20 64 69 66 66 65 72 65  ouple of differe
18bc0 6e 74 20 77 61 79 73 20 74 68 69 73 20 63 61 6e  nt ways this can
18bd0 20 68 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65   happen. All are
18be0 20 71 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62   quite.    ** ob
18bf0 73 63 75 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e  scure. When runn
18c00 69 6e 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f  ing in synchrono
18c10 75 73 20 6d 6f 64 65 2c 20 74 68 69 73 20 63 61  us mode, this ca
18c20 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20  n only happen . 
18c30 20 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67     ** if the pag
18c40 65 20 69 73 20 6f 6e 20 74 68 65 20 66 72 65 65  e is on the free
18c50 2d 6c 69 73 74 20 61 74 20 74 68 65 20 73 74 61  -list at the sta
18c60 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  rt of the transa
18c70 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20  ction, then.    
18c80 2a 2a 20 70 6f 70 75 6c 61 74 65 64 2c 20 74 68  ** populated, th
18c90 65 6e 20 6d 6f 76 65 64 20 75 73 69 6e 67 20 73  en moved using s
18ca0 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
18cb0 61 67 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  age()..    **.  
18cc0 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f    ** The solutio
18cd0 6e 20 69 73 20 74 6f 20 61 64 64 20 61 6e 20 69  n is to add an i
18ce0 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 74 6f  n-memory page to
18cf0 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61   the cache conta
18d00 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65  ining.    ** the
18d10 20 64 61 74 61 20 6a 75 73 74 20 72 65 61 64 20   data just read 
18d20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
18d30 72 6e 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70  rnal. Mark the p
18d40 61 67 65 20 61 73 20 64 69 72 74 79 20 0a 20 20  age as dirty .  
18d50 20 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65 20    ** and if the 
18d60 70 61 67 65 72 20 72 65 71 75 69 72 65 73 20 61  pager requires a
18d70 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74   journal-sync, t
18d80 68 65 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67  hen mark the pag
18d90 65 20 61 73 20 0a 20 20 20 20 2a 2a 20 72 65 71  e as .    ** req
18da0 75 69 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c  uiring a journal
18db0 2d 73 79 6e 63 20 62 65 66 6f 72 65 20 69 74 20  -sync before it 
18dc0 69 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20  is written..    
18dd0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  */.    assert( i
18de0 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20  sSavepnt );.    
18df0 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d  assert( (pPager-
18e00 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50  >doNotSpill & SP
18e10 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b  ILLFLAG_ROLLBACK
18e20 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67  )==0 );.    pPag
18e30 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c  er->doNotSpill |
18e40 3d 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c  = SPILLFLAG_ROLL
18e50 42 41 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20 73  BACK;.    rc = s
18e60 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
18e70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50  Pager, pgno, &pP
18e80 67 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72  g, 1);.    asser
18e90 74 28 20 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  t( (pPager->doNo
18ea0 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c  tSpill & SPILLFL
18eb0 41 47 5f 52 4f 4c 4c 42 41 43 4b 29 21 3d 30 20  AG_ROLLBACK)!=0 
18ec0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
18ed0 6f 4e 6f 74 53 70 69 6c 6c 20 26 3d 20 7e 53 50  oNotSpill &= ~SP
18ee0 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b  ILLFLAG_ROLLBACK
18ef0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
18f00 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
18f10 20 72 63 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   rc;.    sqlite3
18f20 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28  PcacheMakeDirty(
18f30 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  pPg);.  }.  if( 
18f40 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  pPg ){.    /* No
18f50 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65   page should eve
18f60 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20  r be explicitly 
18f70 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74  rolled back that
18f80 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65   is in use, exce
18f90 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61  pt.    ** for pa
18fa0 67 65 20 31 20 77 68 69 63 68 20 69 73 20 68 65  ge 1 which is he
18fb0 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64  ld in use in ord
18fc0 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c  er to keep the l
18fd0 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  ock on the.    *
18fe0 2a 20 64 61 74 61 62 61 73 65 20 61 63 74 69 76  * database activ
18ff0 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68 20  e. However such 
19000 61 20 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f  a page may be ro
19010 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72  lled back as a r
19020 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20  esult.    ** of 
19030 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f  an internal erro
19040 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61  r resulting in a
19050 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c  n automatic call
19060 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
19070 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
19080 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f  )..    */.    vo
19090 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 70  id *pData;.    p
190a0 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74  Data = pPg->pDat
190b0 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44  a;.    memcpy(pD
190c0 61 74 61 2c 20 28 75 38 2a 29 61 44 61 74 61 2c  ata, (u8*)aData,
190d0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
190e0 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  e);.    pPager->
190f0 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a  xReiniter(pPg);.
19100 20 20 20 20 2f 2a 20 49 74 20 75 73 65 64 20 74      /* It used t
19110 6f 20 62 65 20 74 68 61 74 20 73 71 6c 69 74 65  o be that sqlite
19120 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e  3PcacheMakeClean
19130 28 70 50 67 29 20 77 61 73 20 63 61 6c 6c 65 64  (pPg) was called
19140 20 68 65 72 65 2e 20 20 42 75 74 0a 20 20 20 20   here.  But.    
19150 2a 2a 20 74 68 61 74 20 63 61 6c 6c 20 77 61 73  ** that call was
19160 20 64 61 6e 67 65 72 6f 75 73 20 61 6e 64 20 68   dangerous and h
19170 61 64 20 6e 6f 20 64 65 74 65 63 74 61 62 6c 65  ad no detectable
19180 20 62 65 6e 65 66 69 74 20 73 69 6e 63 65 20 74   benefit since t
19190 68 65 20 63 61 63 68 65 0a 20 20 20 20 2a 2a 20  he cache.    ** 
191a0 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 63 6c 65 61  is normally clea
191b0 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 50 63  ned by sqlite3Pc
191c0 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 29 20 61  acheCleanAll() a
191d0 66 74 65 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  fter rollback an
191e0 64 20 73 6f 0a 20 20 20 20 2a 2a 20 68 61 73 20  d so.    ** has 
191f0 62 65 65 6e 20 72 65 6d 6f 76 65 64 2e 20 2a 2f  been removed. */
19200 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70  .    pager_set_p
19210 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 0a 20  agehash(pPg);.. 
19220 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61     /* If this wa
19230 73 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20 72  s page 1, then r
19240 65 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65  estore the value
19250 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65   of Pager.dbFile
19260 56 65 72 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20  Vers..    ** Do 
19270 74 68 69 73 20 62 65 66 6f 72 65 20 61 6e 79 20  this before any 
19280 64 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20  decoding. */.   
19290 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a   if( pgno==1 ){.
192a0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
192b0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
192c0 2c 20 26 28 28 75 38 2a 29 70 44 61 74 61 29 5b  , &((u8*)pData)[
192d0 32 34 5d 2c 73 69 7a 65 6f 66 28 70 50 61 67 65  24],sizeof(pPage
192e0 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b  r->dbFileVers));
192f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
19300 65 63 6f 64 65 20 74 68 65 20 70 61 67 65 20 6a  ecode the page j
19310 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20 64 69  ust read from di
19320 73 6b 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  sk */.#if SQLITE
19330 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 69  _HAS_CODEC.    i
19340 66 28 20 6a 72 6e 6c 45 6e 63 20 29 7b 20 43 4f  f( jrnlEnc ){ CO
19350 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 44 61  DEC1(pPager, pDa
19360 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33  ta, pPg->pgno, 3
19370 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  , rc=SQLITE_NOME
19380 4d 5f 42 4b 50 54 29 3b 20 7d 0a 23 65 6e 64 69  M_BKPT); }.#endi
19390 66 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  f.    sqlite3Pca
193a0 63 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b  cheRelease(pPg);
193b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
193c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d  ;.}../*.** Param
193d0 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20  eter zMaster is 
193e0 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61  the name of a ma
193f0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
19400 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72  e. A single jour
19410 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74  nal.** file that
19420 20 72 65 66 65 72 72 65 64 20 74 6f 20 74 68 65   referred to the
19430 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
19440 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65  file has just be
19450 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  en rolled back..
19460 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
19470 63 68 65 63 6b 73 20 69 66 20 69 74 20 69 73 20  checks if it is 
19480 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65  possible to dele
19490 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
194a0 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61  urnal file,.** a
194b0 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74  nd does so if it
194c0 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d   is..**.** Argum
194d0 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61 79 20  ent zMaster may 
194e0 70 6f 69 6e 74 20 74 6f 20 50 61 67 65 72 2e 70  point to Pager.p
194f0 54 6d 70 53 70 61 63 65 2e 20 53 6f 20 74 68 61  TmpSpace. So tha
19500 74 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20  t buffer is not 
19510 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  .** available fo
19520 72 20 75 73 65 20 77 69 74 68 69 6e 20 74 68 69  r use within thi
19530 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
19540 2a 20 57 68 65 6e 20 61 20 6d 61 73 74 65 72 20  * When a master 
19550 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
19560 63 72 65 61 74 65 64 2c 20 69 74 20 69 73 20 70  created, it is p
19570 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68  opulated with th
19580 65 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 61  e names .** of a
19590 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20  ll of its child 
195a0 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65 20 61 66  journals, one af
195b0 74 65 72 20 61 6e 6f 74 68 65 72 2c 20 66 6f 72  ter another, for
195c0 6d 61 74 74 65 64 20 61 73 20 75 74 66 2d 38 20  matted as utf-8 
195d0 0a 2a 2a 20 65 6e 63 6f 64 65 64 20 74 65 78 74  .** encoded text
195e0 2e 20 54 68 65 20 65 6e 64 20 6f 66 20 65 61 63  . The end of eac
195f0 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  h child journal 
19600 66 69 6c 65 20 69 73 20 6d 61 72 6b 65 64 20 77  file is marked w
19610 69 74 68 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65  ith a .** nul-te
19620 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 28 30  rminator byte (0
19630 78 30 30 29 2e 20 69 2e 65 2e 20 74 68 65 20 65  x00). i.e. the e
19640 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f  ntire contents o
19650 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
19660 61 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 61  al.** file for a
19670 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 76   transaction inv
19680 6f 6c 76 69 6e 67 20 74 77 6f 20 64 61 74 61 62  olving two datab
19690 61 73 65 73 20 6d 69 67 68 74 20 62 65 3a 0a 2a  ases might be:.*
196a0 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65 2f 62 69  *.**   "/home/bi
196b0 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c  ll/a.db-journal\
196c0 78 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e  x00/home/bill/b.
196d0 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 22 0a  db-journal\x00".
196e0 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74 65 72 20 6a  **.** A master j
196f0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20  ournal file may 
19700 6f 6e 6c 79 20 62 65 20 64 65 6c 65 74 65 64 20  only be deleted 
19710 6f 6e 63 65 20 61 6c 6c 20 6f 66 20 69 74 73 20  once all of its 
19720 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61  child .** journa
19730 6c 73 20 68 61 76 65 20 62 65 65 6e 20 72 6f 6c  ls have been rol
19740 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
19750 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
19760 61 64 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ads the contents
19770 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a   of the master-j
19780 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f  ournal file into
19790 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20   .** memory and 
197a0 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 65 61  loops through ea
197b0 63 68 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20  ch of the child 
197c0 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 73 2e 20 46  journal names. F
197d0 6f 72 0a 2a 2a 20 65 61 63 68 20 63 68 69 6c 64  or.** each child
197e0 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 63 68 65   journal, it che
197f0 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20  cks if:.**.**   
19800 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64 20 6a  * if the child j
19810 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2c 20 61  ournal exists, a
19820 6e 64 20 69 66 20 73 6f 0a 2a 2a 20 20 20 2a 20  nd if so.**   * 
19830 69 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75  if the child jou
19840 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 61 20  rnal contains a 
19850 72 65 66 65 72 65 6e 63 65 20 74 6f 20 6d 61 73  reference to mas
19860 74 65 72 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20  ter journal .** 
19870 20 20 20 20 66 69 6c 65 20 7a 4d 61 73 74 65 72      file zMaster
19880 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63 68 69 6c  .**.** If a chil
19890 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65  d journal can be
198a0 20 66 6f 75 6e 64 20 74 68 61 74 20 6d 61 74 63   found that matc
198b0 68 65 73 20 62 6f 74 68 20 6f 66 20 74 68 65 20  hes both of the 
198c0 63 72 69 74 65 72 69 61 0a 2a 2a 20 61 62 6f 76  criteria.** abov
198d0 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
198e0 20 72 65 74 75 72 6e 73 20 77 69 74 68 6f 75 74   returns without
198f0 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e   doing anything.
19900 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 0a 2a   Otherwise, if.*
19910 2a 20 6e 6f 20 73 75 63 68 20 63 68 69 6c 64 20  * no such child 
19920 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66  journal can be f
19930 6f 75 6e 64 2c 20 66 69 6c 65 20 7a 4d 61 73 74  ound, file zMast
19940 65 72 20 69 73 20 64 65 6c 65 74 65 64 20 66 72  er is deleted fr
19950 6f 6d 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73  om.** the file-s
19960 79 73 74 65 6d 20 75 73 69 6e 67 20 73 71 6c 69  ystem using sqli
19970 74 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a  te3OsDelete()..*
19980 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72  *.** If an IO er
19990 72 6f 72 20 77 69 74 68 69 6e 20 74 68 69 73 20  ror within this 
199a0 66 75 6e 63 74 69 6f 6e 2c 20 61 6e 20 65 72 72  function, an err
199b0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
199c0 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  ned. This.** fun
199d0 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20  ction allocates 
199e0 6d 65 6d 6f 72 79 20 62 79 20 63 61 6c 6c 69 6e  memory by callin
199f0 67 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  g sqlite3Malloc(
19a00 29 2e 20 49 66 20 61 6e 20 61 6c 6c 6f 63 61 74  ). If an allocat
19a10 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51  ion.** fails, SQ
19a20 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65  LITE_NOMEM is re
19a30 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
19a40 65 2c 20 69 66 20 6e 6f 20 49 4f 20 6f 72 20 6d  e, if no IO or m
19a50 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 0a 2a 2a  alloc errors .**
19a60 20 6f 63 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f   occur, SQLITE_O
19a70 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
19a80 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20  *.** TODO: This 
19a90 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74  function allocat
19aa0 65 73 20 61 20 73 69 6e 67 6c 65 20 62 6c 6f 63  es a single bloc
19ab0 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6c  k of memory to l
19ac0 6f 61 64 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72  oad.** the entir
19ad0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
19ae0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
19af0 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 75 6c   file. This coul
19b00 64 20 62 65 0a 2a 2a 20 61 20 63 6f 75 70 6c 65  d be.** a couple
19b10 20 6f 66 20 6b 69 6c 6f 62 79 74 65 73 20 6f 72   of kilobytes or
19b20 20 73 6f 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c   so - potentiall
19b30 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  y larger than th
19b40 65 20 70 61 67 65 20 0a 2a 2a 20 73 69 7a 65 2e  e page .** size.
19b50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
19b60 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 50  ager_delmaster(P
19b70 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
19b80 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
19b90 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  r){.  sqlite3_vf
19ba0 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72  s *pVfs = pPager
19bb0 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63  ->pVfs;.  int rc
19bc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19bd0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
19be0 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
19bf0 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b 20 20  file *pMaster;  
19c00 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d 61    /* Malloc'd ma
19c10 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster-journal fil
19c20 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
19c30 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
19c40 70 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d  pJournal;   /* M
19c50 61 6c 6c 6f 63 27 64 20 63 68 69 6c 64 2d 6a 6f  alloc'd child-jo
19c60 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
19c70 69 70 74 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20  iptor */.  char 
19c80 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  *zMasterJournal 
19c90 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73  = 0; /* Contents
19ca0 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
19cb0 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34  al file */.  i64
19cc0 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b   nMasterJournal;
19cd0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
19ce0 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
19cf0 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
19d00 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  *zJournal;      
19d10 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
19d20 74 6f 20 6f 6e 65 20 6a 6f 75 72 6e 61 6c 20 77  to one journal w
19d30 69 74 68 69 6e 20 4d 4a 20 66 69 6c 65 20 2a 2f  ithin MJ file */
19d40 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  .  char *zMaster
19d50 50 74 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Ptr;         /* 
19d60 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 4d 4a  Space to hold MJ
19d70 20 66 69 6c 65 6e 61 6d 65 20 66 72 6f 6d 20 61   filename from a
19d80 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
19d90 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 50 74  .  int nMasterPt
19da0 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r;           /* 
19db0 41 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20  Amount of space 
19dc0 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 7a 4d 61  allocated to zMa
19dd0 73 74 65 72 50 74 72 5b 5d 20 2a 2f 0a 0a 20 20  sterPtr[] */..  
19de0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  /* Allocate spac
19df0 65 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20 70  e for both the p
19e00 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 70 4d 61 73  Journal and pMas
19e10 74 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70  ter file descrip
19e20 74 6f 72 73 2e 0a 20 20 2a 2a 20 49 66 20 73 75  tors..  ** If su
19e30 63 63 65 73 73 66 75 6c 2c 20 6f 70 65 6e 20 74  ccessful, open t
19e40 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
19e50 6c 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 69  l file for readi
19e60 6e 67 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74  ng..  */.  pMast
19e70 65 72 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  er = (sqlite3_fi
19e80 6c 65 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  le *)sqlite3Mall
19e90 6f 63 5a 65 72 6f 28 70 56 66 73 2d 3e 73 7a 4f  ocZero(pVfs->szO
19ea0 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a  sFile * 2);.  pJ
19eb0 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65  ournal = (sqlite
19ec0 33 5f 66 69 6c 65 20 2a 29 28 28 28 75 38 20 2a  3_file *)(((u8 *
19ed0 29 70 4d 61 73 74 65 72 29 20 2b 20 70 56 66 73  )pMaster) + pVfs
19ee0 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69  ->szOsFile);.  i
19ef0 66 28 20 21 70 4d 61 73 74 65 72 20 29 7b 0a 20  f( !pMaster ){. 
19f00 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
19f10 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c  OMEM_BKPT;.  }el
19f20 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e  se{.    const in
19f30 74 20 66 6c 61 67 73 20 3d 20 0a 23 69 66 20 53  t flags = .#if S
19f40 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54  QLITE_ENABLE_DAT
19f50 41 5f 50 52 4f 54 45 43 54 49 4f 4e 0a 20 20 20  A_PROTECTION.   
19f60 20 20 20 28 70 50 61 67 65 72 2d 3e 76 66 73 46     (pPager->vfsF
19f70 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e  lags&SQLITE_OPEN
19f80 5f 46 49 4c 45 50 52 4f 54 45 43 54 49 4f 4e 5f  _FILEPROTECTION_
19f90 4d 41 53 4b 29 7c 0a 23 65 6e 64 69 66 0a 20 20  MASK)|.#endif.  
19fa0 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e      (SQLITE_OPEN
19fb0 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45  _READONLY|SQLITE
19fc0 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
19fd0 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20  RNAL);.    rc = 
19fe0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
19ff0 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61  fs, zMaster, pMa
1a000 73 74 65 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b  ster, flags, 0);
1a010 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
1a020 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
1a030 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a  delmaster_out;..
1a040 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e    /* Load the en
1a050 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72  tire master jour
1a060 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70  nal file into sp
1a070 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ace obtained fro
1a080 6d 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d  m.  ** sqlite3_m
1a090 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e  alloc() and poin
1a0a0 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65  ted to by zMaste
1a0b0 72 4a 6f 75 72 6e 61 6c 2e 20 20 20 41 6c 73 6f  rJournal.   Also
1a0c0 20 6f 62 74 61 69 6e 0a 20 20 2a 2a 20 73 75 66   obtain.  ** suf
1a0d0 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 28 69  ficient space (i
1a0e0 6e 20 7a 4d 61 73 74 65 72 50 74 72 29 20 74 6f  n zMasterPtr) to
1a0f0 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65 73 20   hold the names 
1a100 6f 66 20 6d 61 73 74 65 72 0a 20 20 2a 2a 20 6a  of master.  ** j
1a110 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 65 78 74  ournal files ext
1a120 72 61 63 74 65 64 20 66 72 6f 6d 20 72 65 67 75  racted from regu
1a130 6c 61 72 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75  lar rollback-jou
1a140 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 72 63  rnals..  */.  rc
1a150 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
1a160 53 69 7a 65 28 70 4d 61 73 74 65 72 2c 20 26 6e  Size(pMaster, &n
1a170 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a  MasterJournal);.
1a180 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1a190 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
1a1a0 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6e 4d 61 73  ster_out;.  nMas
1a1b0 74 65 72 50 74 72 20 3d 20 70 56 66 73 2d 3e 6d  terPtr = pVfs->m
1a1c0 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 7a  xPathname+1;.  z
1a1d0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20  MasterJournal = 
1a1e0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 4d  sqlite3Malloc(nM
1a1f0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e  asterJournal + n
1a200 4d 61 73 74 65 72 50 74 72 20 2b 20 31 29 3b 0a  MasterPtr + 1);.
1a210 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f    if( !zMasterJo
1a220 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 72 63 20  urnal ){.    rc 
1a230 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
1a240 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 64 65  KPT;.    goto de
1a250 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7d  lmaster_out;.  }
1a260 0a 20 20 7a 4d 61 73 74 65 72 50 74 72 20 3d 20  .  zMasterPtr = 
1a270 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b  &zMasterJournal[
1a280 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2b 31  nMasterJournal+1
1a290 5d 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ];.  rc = sqlite
1a2a0 33 4f 73 52 65 61 64 28 70 4d 61 73 74 65 72 2c  3OsRead(pMaster,
1a2b0 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c   zMasterJournal,
1a2c0 20 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75   (int)nMasterJou
1a2d0 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 69 66 28 20  rnal, 0);.  if( 
1a2e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1a2f0 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
1a300 75 74 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75  ut;.  zMasterJou
1a310 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72  rnal[nMasterJour
1a320 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20 20 7a 4a 6f  nal] = 0;..  zJo
1a330 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a  urnal = zMasterJ
1a340 6f 75 72 6e 61 6c 3b 0a 20 20 77 68 69 6c 65 28  ournal;.  while(
1a350 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74   (zJournal-zMast
1a360 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74  erJournal)<nMast
1a370 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  erJournal ){.   
1a380 20 69 6e 74 20 65 78 69 73 74 73 3b 0a 20 20 20   int exists;.   
1a390 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
1a3a0 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4a 6f 75  ccess(pVfs, zJou
1a3b0 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43  rnal, SQLITE_ACC
1a3c0 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69  ESS_EXISTS, &exi
1a3d0 73 74 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63  sts);.    if( rc
1a3e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1a3f0 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
1a400 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ter_out;.    }. 
1a410 20 20 20 69 66 28 20 65 78 69 73 74 73 20 29 7b     if( exists ){
1a420 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66  .      /* One of
1a430 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f   the journals po
1a440 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20  inted to by the 
1a450 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65  master journal e
1a460 78 69 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20  xists..      ** 
1a470 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63  Open it and chec
1a480 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61  k if it points a
1a490 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  t the master jou
1a4a0 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 2a  rnal. If.      *
1a4b0 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69 74  * so, return wit
1a4c0 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68  hout deleting th
1a4d0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
1a4e0 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a   file..      */.
1a4f0 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20        int c;.   
1a500 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 0a     int flags = .
1a510 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
1a520 45 5f 44 41 54 41 5f 50 52 4f 54 45 43 54 49 4f  E_DATA_PROTECTIO
1a530 4e 0a 20 20 20 20 20 20 20 20 28 70 50 61 67 65  N.        (pPage
1a540 72 2d 3e 76 66 73 46 6c 61 67 73 26 53 51 4c 49  r->vfsFlags&SQLI
1a550 54 45 5f 4f 50 45 4e 5f 46 49 4c 45 50 52 4f 54  TE_OPEN_FILEPROT
1a560 45 43 54 49 4f 4e 5f 4d 41 53 4b 29 7c 0a 23 65  ECTION_MASK)|.#e
1a570 6e 64 69 66 0a 20 20 20 20 20 20 20 20 28 53 51  ndif.        (SQ
1a580 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
1a590 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  LY|SQLITE_OPEN_M
1a5a0 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20  AIN_JOURNAL);.  
1a5b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1a5c0 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4a 6f  OsOpen(pVfs, zJo
1a5d0 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c  urnal, pJournal,
1a5e0 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20   flags, 0);.    
1a5f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1a600 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
1a610 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
1a620 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  t;.      }..    
1a630 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65    rc = readMaste
1a640 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75 72 6e 61  rJournal(pJourna
1a650 6c 2c 20 7a 4d 61 73 74 65 72 50 74 72 2c 20 6e  l, zMasterPtr, n
1a660 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20  MasterPtr);.    
1a670 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
1a680 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  (pJournal);.    
1a690 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1a6a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
1a6b0 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
1a6c0 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  t;.      }..    
1a6d0 20 20 63 20 3d 20 7a 4d 61 73 74 65 72 50 74 72    c = zMasterPtr
1a6e0 5b 30 5d 21 3d 30 20 26 26 20 73 74 72 63 6d 70  [0]!=0 && strcmp
1a6f0 28 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61  (zMasterPtr, zMa
1a700 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20  ster)==0;.      
1a710 69 66 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20  if( c ){.       
1a720 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61   /* We have a ma
1a730 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65  tch. Do not dele
1a740 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
1a750 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20  urnal file. */. 
1a760 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
1a770 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
1a780 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4a 6f   }.    }.    zJo
1a790 75 72 6e 61 6c 20 2b 3d 20 28 73 71 6c 69 74 65  urnal += (sqlite
1a7a0 33 53 74 72 6c 65 6e 33 30 28 7a 4a 6f 75 72 6e  3Strlen30(zJourn
1a7b0 61 6c 29 2b 31 29 3b 0a 20 20 7d 0a 20 0a 20 20  al)+1);.  }. .  
1a7c0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
1a7d0 4d 61 73 74 65 72 29 3b 0a 20 20 72 63 20 3d 20  Master);.  rc = 
1a7e0 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
1a7f0 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30  pVfs, zMaster, 0
1a800 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75  );..delmaster_ou
1a810 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  t:.  sqlite3_fre
1a820 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  e(zMasterJournal
1a830 29 3b 0a 20 20 69 66 28 20 70 4d 61 73 74 65 72  );.  if( pMaster
1a840 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
1a850 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b  sClose(pMaster);
1a860 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73  .    assert( !is
1a870 4f 70 65 6e 28 70 4a 6f 75 72 6e 61 6c 29 20 29  Open(pJournal) )
1a880 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
1a890 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 7d  ee(pMaster);.  }
1a8a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1a8b0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1a8c0 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
1a8d0 20 63 68 61 6e 67 65 20 74 68 65 20 61 63 74 75   change the actu
1a8e0 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  al size of the d
1a8f0 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65  atabase .** file
1a900 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73   in the file-sys
1a910 74 65 6d 2e 20 54 68 69 73 20 6f 6e 6c 79 20 68  tem. This only h
1a920 61 70 70 65 6e 73 20 77 68 65 6e 20 63 6f 6d 6d  appens when comm
1a930 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63  itting a transac
1a940 74 69 6f 6e 2c 0a 2a 2a 20 6f 72 20 72 6f 6c 6c  tion,.** or roll
1a950 69 6e 67 20 62 61 63 6b 20 61 20 74 72 61 6e 73  ing back a trans
1a960 61 63 74 69 6f 6e 20 28 69 6e 63 6c 75 64 69 6e  action (includin
1a970 67 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  g rolling back a
1a980 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a   hot-journal)..*
1a990 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 69 6e  *.** If the main
1a9a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
1a9b0 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 74  s not open, or t
1a9c0 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
1a9d0 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 44 42 4d  in either.** DBM
1a9e0 4f 44 20 6f 72 20 4f 50 45 4e 20 73 74 61 74 65  OD or OPEN state
1a9f0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
1aa00 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65  is a no-op. Othe
1aa10 72 77 69 73 65 2c 20 74 68 65 20 73 69 7a 65 20  rwise, the size 
1aa20 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20  .** of the file 
1aa30 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 6e 50  is changed to nP
1aa40 61 67 65 20 70 61 67 65 73 20 28 6e 50 61 67 65  age pages (nPage
1aa50 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  *pPager->pageSiz
1aa60 65 20 62 79 74 65 73 29 2e 20 0a 2a 2a 20 49 66  e bytes). .** If
1aa70 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
1aa80 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6c  k is currently l
1aa90 61 72 67 65 72 20 74 68 61 6e 20 6e 50 61 67 65  arger than nPage
1aaa0 20 70 61 67 65 73 2c 20 74 68 65 6e 20 75 73 65   pages, then use
1aab0 20 74 68 65 20 56 46 53 0a 2a 2a 20 78 54 72 75   the VFS.** xTru
1aac0 6e 63 61 74 65 28 29 20 6d 65 74 68 6f 64 20 74  ncate() method t
1aad0 6f 20 74 72 75 6e 63 61 74 65 20 69 74 2e 0a 2a  o truncate it..*
1aae0 2a 0a 2a 2a 20 4f 72 2c 20 69 74 20 6d 69 67 68  *.** Or, it migh
1aaf0 74 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68  t be the case th
1ab00 61 74 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64  at the file on d
1ab10 69 73 6b 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  isk is smaller t
1ab20 68 61 6e 20 0a 2a 2a 20 6e 50 61 67 65 20 70 61  han .** nPage pa
1ab30 67 65 73 2e 20 53 6f 6d 65 20 6f 70 65 72 61 74  ges. Some operat
1ab40 69 6e 67 20 73 79 73 74 65 6d 20 69 6d 70 6c 65  ing system imple
1ab50 6d 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20 67  mentations can g
1ab60 65 74 20 63 6f 6e 66 75 73 65 64 20 69 66 20 0a  et confused if .
1ab70 2a 2a 20 79 6f 75 20 74 72 79 20 74 6f 20 74 72  ** you try to tr
1ab80 75 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74 6f  uncate a file to
1ab90 20 73 6f 6d 65 20 73 69 7a 65 20 74 68 61 74 20   some size that 
1aba0 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69  is larger than i
1abb0 74 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  t .** currently 
1abc0 69 73 2c 20 73 6f 20 64 65 74 65 63 74 20 74 68  is, so detect th
1abd0 69 73 20 63 61 73 65 20 61 6e 64 20 77 72 69 74  is case and writ
1abe0 65 20 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f 20  e a single zero 
1abf0 62 79 74 65 20 74 6f 20 0a 2a 2a 20 74 68 65 20  byte to .** the 
1ac00 65 6e 64 20 6f 66 20 74 68 65 20 6e 65 77 20 66  end of the new f
1ac10 69 6c 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a  ile instead..**.
1ac20 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
1ac30 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
1ac40 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  OK. If an IO err
1ac50 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
1ac60 6d 6f 64 69 66 79 69 6e 67 0a 2a 2a 20 74 68 65  modifying.** the
1ac70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
1ac80 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72  return the error
1ac90 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c   code to the cal
1aca0 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ler..*/.static i
1acb0 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74  nt pager_truncat
1acc0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
1acd0 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20   Pgno nPage){.  
1ace0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1acf0 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  OK;.  assert( pP
1ad00 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
1ad10 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61  GER_ERROR );.  a
1ad20 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
1ad30 53 74 61 74 65 21 3d 50 41 47 45 52 5f 52 45 41  State!=PAGER_REA
1ad40 44 45 52 20 29 3b 0a 20 20 0a 20 20 69 66 28 20  DER );.  .  if( 
1ad50 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
1ad60 64 29 20 0a 20 20 20 26 26 20 28 70 50 61 67 65  d) .   && (pPage
1ad70 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
1ad80 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c  _WRITER_DBMOD ||
1ad90 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
1ada0 3d 50 41 47 45 52 5f 4f 50 45 4e 29 20 0a 20 20  =PAGER_OPEN) .  
1adb0 29 7b 0a 20 20 20 20 69 36 34 20 63 75 72 72 65  ){.    i64 curre
1adc0 6e 74 53 69 7a 65 2c 20 6e 65 77 53 69 7a 65 3b  ntSize, newSize;
1add0 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67 65 20  .    int szPage 
1ade0 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
1adf0 7a 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ze;.    assert( 
1ae00 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45  pPager->eLock==E
1ae10 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
1ae20 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73  .    /* TODO: Is
1ae30 20 69 74 20 73 61 66 65 20 74 6f 20 75 73 65 20   it safe to use 
1ae40 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65  Pager.dbFileSize
1ae50 20 68 65 72 65 3f 20 2a 2f 0a 20 20 20 20 72 63   here? */.    rc
1ae60 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
1ae70 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  Size(pPager->fd,
1ae80 20 26 63 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a   &currentSize);.
1ae90 20 20 20 20 6e 65 77 53 69 7a 65 20 3d 20 73 7a      newSize = sz
1aea0 50 61 67 65 2a 28 69 36 34 29 6e 50 61 67 65 3b  Page*(i64)nPage;
1aeb0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1aec0 49 54 45 5f 4f 4b 20 26 26 20 63 75 72 72 65 6e  ITE_OK && curren
1aed0 74 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65 20 29  tSize!=newSize )
1aee0 7b 0a 20 20 20 20 20 20 69 66 28 20 63 75 72 72  {.      if( curr
1aef0 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a 65 20  entSize>newSize 
1af00 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1af10 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
1af20 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6e 65  e(pPager->fd, ne
1af30 77 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65  wSize);.      }e
1af40 6c 73 65 20 69 66 28 20 28 63 75 72 72 65 6e 74  lse if( (current
1af50 53 69 7a 65 2b 73 7a 50 61 67 65 29 3c 3d 6e 65  Size+szPage)<=ne
1af60 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  wSize ){.       
1af70 20 63 68 61 72 20 2a 70 54 6d 70 20 3d 20 70 50   char *pTmp = pP
1af80 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
1af90 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
1afa0 70 54 6d 70 2c 20 30 2c 20 73 7a 50 61 67 65 29  pTmp, 0, szPage)
1afb0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
1afc0 73 65 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50  se( (newSize-szP
1afd0 61 67 65 29 20 3d 3d 20 63 75 72 72 65 6e 74 53  age) == currentS
1afe0 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 74  ize );.        t
1aff0 65 73 74 63 61 73 65 28 20 28 6e 65 77 53 69 7a  estcase( (newSiz
1b000 65 2d 73 7a 50 61 67 65 29 20 3e 20 20 63 75 72  e-szPage) >  cur
1b010 72 65 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20  rentSize );.    
1b020 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1b030 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
1b040 66 64 2c 20 70 54 6d 70 2c 20 73 7a 50 61 67 65  fd, pTmp, szPage
1b050 2c 20 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65  , newSize-szPage
1b060 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1b070 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1b080 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  OK ){.        pP
1b090 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
1b0a0 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20   = nPage;.      
1b0b0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
1b0c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1b0d0 2a 20 52 65 74 75 72 6e 20 61 20 73 61 6e 69 74  * Return a sanit
1b0e0 69 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  ized version of 
1b0f0 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  the sector-size 
1b100 6f 66 20 4f 53 20 66 69 6c 65 20 70 46 69 6c 65  of OS file pFile
1b110 2e 20 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20  . The.** return 
1b120 76 61 6c 75 65 20 69 73 20 67 75 61 72 61 6e 74  value is guarant
1b130 65 65 64 20 74 6f 20 6c 69 65 20 62 65 74 77 65  eed to lie betwe
1b140 65 6e 20 33 32 20 61 6e 64 20 4d 41 58 5f 53 45  en 32 and MAX_SE
1b150 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2f 0a 69 6e  CTOR_SIZE..*/.in
1b160 74 20 73 71 6c 69 74 65 33 53 65 63 74 6f 72 53  t sqlite3SectorS
1b170 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ize(sqlite3_file
1b180 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20   *pFile){.  int 
1b190 69 52 65 74 20 3d 20 73 71 6c 69 74 65 33 4f 73  iRet = sqlite3Os
1b1a0 53 65 63 74 6f 72 53 69 7a 65 28 70 46 69 6c 65  SectorSize(pFile
1b1b0 29 3b 0a 20 20 69 66 28 20 69 52 65 74 3c 33 32  );.  if( iRet<32
1b1c0 20 29 7b 0a 20 20 20 20 69 52 65 74 20 3d 20 35   ){.    iRet = 5
1b1d0 31 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  12;.  }else if( 
1b1e0 69 52 65 74 3e 4d 41 58 5f 53 45 43 54 4f 52 5f  iRet>MAX_SECTOR_
1b1f0 53 49 5a 45 20 29 7b 0a 20 20 20 20 61 73 73 65  SIZE ){.    asse
1b200 72 74 28 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  rt( MAX_SECTOR_S
1b210 49 5a 45 3e 3d 35 31 32 20 29 3b 0a 20 20 20 20  IZE>=512 );.    
1b220 69 52 65 74 20 3d 20 4d 41 58 5f 53 45 43 54 4f  iRet = MAX_SECTO
1b230 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 20 20 72 65  R_SIZE;.  }.  re
1b240 74 75 72 6e 20 69 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn iRet;.}../*
1b250 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75  .** Set the valu
1b260 65 20 6f 66 20 74 68 65 20 50 61 67 65 72 2e 73  e of the Pager.s
1b270 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62  ectorSize variab
1b280 6c 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  le for the given
1b290 0a 2a 2a 20 70 61 67 65 72 20 62 61 73 65 64 20  .** pager based 
1b2a0 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  on the value ret
1b2b0 75 72 6e 65 64 20 62 79 20 74 68 65 20 78 53 65  urned by the xSe
1b2c0 63 74 6f 72 53 69 7a 65 20 6d 65 74 68 6f 64 0a  ctorSize method.
1b2d0 2a 2a 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 64  ** of the open d
1b2e0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
1b2f0 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69  e sector size wi
1b300 6c 6c 20 62 65 20 75 73 65 64 20 0a 2a 2a 20 74  ll be used .** t
1b310 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
1b320 73 69 7a 65 20 61 6e 64 20 61 6c 69 67 6e 6d 65  size and alignme
1b330 6e 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65  nt of journal he
1b340 61 64 65 72 20 61 6e 64 20 0a 2a 2a 20 6d 61 73  ader and .** mas
1b350 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
1b360 74 65 72 73 20 77 69 74 68 69 6e 20 63 72 65 61  ters within crea
1b370 74 65 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ted journal file
1b380 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d  s..**.** For tem
1b390 70 6f 72 61 72 79 20 66 69 6c 65 73 20 74 68 65  porary files the
1b3a0 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f   effective secto
1b3b0 72 20 73 69 7a 65 20 69 73 20 61 6c 77 61 79 73  r size is always
1b3c0 20 35 31 32 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a   512 bytes..**.*
1b3d0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6f 72  * Otherwise, for
1b3e0 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72 79 20 66   non-temporary f
1b3f0 69 6c 65 73 2c 20 74 68 65 20 65 66 66 65 63 74  iles, the effect
1b400 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  ive sector size 
1b410 69 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  is.** the value 
1b420 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
1b430 78 53 65 63 74 6f 72 53 69 7a 65 28 29 20 6d 65  xSectorSize() me
1b440 74 68 6f 64 20 72 6f 75 6e 64 65 64 20 75 70 20  thod rounded up 
1b450 74 6f 20 33 32 20 69 66 0a 2a 2a 20 69 74 20 69  to 32 if.** it i
1b460 73 20 6c 65 73 73 20 74 68 61 6e 20 33 32 2c 20  s less than 32, 
1b470 6f 72 20 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20  or rounded down 
1b480 74 6f 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  to MAX_SECTOR_SI
1b490 5a 45 20 69 66 20 69 74 0a 2a 2a 20 69 73 20 67  ZE if it.** is g
1b4a0 72 65 61 74 65 72 20 74 68 61 6e 20 4d 41 58 5f  reater than MAX_
1b4b0 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2a 0a  SECTOR_SIZE..**.
1b4c0 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 68  ** If the file h
1b4d0 61 73 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f  as the SQLITE_IO
1b4e0 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  CAP_POWERSAFE_OV
1b4f0 45 52 57 52 49 54 45 20 70 72 6f 70 65 72 74 79  ERWRITE property
1b500 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a 20 74 68  , then set.** th
1b510 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74  e effective sect
1b520 6f 72 20 73 69 7a 65 20 74 6f 20 69 74 73 20 6d  or size to its m
1b530 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 28 35 31  inimum value (51
1b540 32 29 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65  2).  The purpose
1b550 20 6f 66 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 73   of.** pPager->s
1b560 65 63 74 6f 72 53 69 7a 65 20 69 73 20 74 6f 20  ectorSize is to 
1b570 64 65 66 69 6e 65 20 74 68 65 20 22 62 6c 61 73  define the "blas
1b580 74 20 72 61 64 69 75 73 22 20 6f 66 20 62 79 74  t radius" of byt
1b590 65 73 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74  es that.** might
1b5a0 20 63 68 61 6e 67 65 20 69 66 20 61 20 63 72 61   change if a cra
1b5b0 73 68 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  sh occurs while 
1b5c0 77 72 69 74 69 6e 67 20 74 6f 20 61 20 73 69 6e  writing to a sin
1b5d0 67 6c 65 20 62 79 74 65 20 69 6e 0a 2a 2a 20 74  gle byte in.** t
1b5e0 68 61 74 20 72 61 6e 67 65 2e 20 20 42 75 74 20  hat range.  But 
1b5f0 77 69 74 68 20 50 4f 57 45 52 53 41 46 45 5f 4f  with POWERSAFE_O
1b600 56 45 52 57 52 49 54 45 2c 20 74 68 65 20 62 6c  VERWRITE, the bl
1b610 61 73 74 20 72 61 64 69 75 73 20 69 73 20 7a 65  ast radius is ze
1b620 72 6f 0a 2a 2a 20 28 74 68 61 74 20 69 73 20 77  ro.** (that is w
1b630 68 61 74 20 50 4f 57 45 52 53 41 46 45 5f 4f 56  hat POWERSAFE_OV
1b640 45 52 57 52 49 54 45 20 6d 65 61 6e 73 29 2c 20  ERWRITE means), 
1b650 73 6f 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74  so we minimize t
1b660 68 65 20 73 65 63 74 6f 72 0a 2a 2a 20 73 69 7a  he sector.** siz
1b670 65 2e 20 20 46 6f 72 20 62 61 63 6b 77 61 72 64  e.  For backward
1b680 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20  s compatibility 
1b690 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  of the rollback 
1b6a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
1b6b0 6d 61 74 2c 0a 2a 2a 20 77 65 20 63 61 6e 6e 6f  mat,.** we canno
1b6c0 74 20 72 65 64 75 63 65 20 74 68 65 20 65 66 66  t reduce the eff
1b6d0 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69  ective sector si
1b6e0 7a 65 20 62 65 6c 6f 77 20 35 31 32 2e 0a 2a 2f  ze below 512..*/
1b6f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
1b700 53 65 63 74 6f 72 53 69 7a 65 28 50 61 67 65 72  SectorSize(Pager
1b710 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73   *pPager){.  ass
1b720 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
1b730 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65  er->fd) || pPage
1b740 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a  r->tempFile );..
1b750 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65    if( pPager->te
1b760 6d 70 46 69 6c 65 0a 20 20 20 7c 7c 20 28 73 71  mpFile.   || (sq
1b770 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
1b780 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
1b790 67 65 72 2d 3e 66 64 29 20 26 20 0a 20 20 20 20  ger->fd) & .    
1b7a0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
1b7b0 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45  _IOCAP_POWERSAFE
1b7c0 5f 4f 56 45 52 57 52 49 54 45 29 21 3d 30 0a 20  _OVERWRITE)!=0. 
1b7d0 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f   ){.    /* Secto
1b7e0 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d  r size doesn't m
1b7f0 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70 6f 72  atter for tempor
1b800 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c  ary files. Also,
1b810 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
1b820 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62 65   may not have be
1b830 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c 20 69  en opened yet, i
1b840 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65  n which case the
1b850 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a   OsSectorSize().
1b860 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c      ** call will
1b870 20 73 65 67 66 61 75 6c 74 2e 20 2a 2f 0a 20 20   segfault. */.  
1b880 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
1b890 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d 65  Size = 512;.  }e
1b8a0 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
1b8b0 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71  >sectorSize = sq
1b8c0 6c 69 74 65 33 53 65 63 74 6f 72 53 69 7a 65 28  lite3SectorSize(
1b8d0 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d  pPager->fd);.  }
1b8e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61  .}../*.** Playba
1b8f0 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  ck the journal a
1b900 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72 65 20  nd thus restore 
1b910 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1b920 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74  e to.** the stat
1b930 65 20 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f  e it was in befo
1b940 72 65 20 77 65 20 73 74 61 72 74 65 64 20 6d 61  re we started ma
1b950 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a  king changes.  .
1b960 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  **.** The journa
1b970 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73  l file format is
1b980 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a   as follows: .**
1b990 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79 74 65  .**  (1)  8 byte
1b9a0 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f 70 79   prefix.  A copy
1b9b0 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69   of aJournalMagi
1b9c0 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20  c[]..**  (2)  4 
1b9d0 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
1b9e0 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
1b9f0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76   the number of v
1ba00 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64  alid page record
1ba10 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68  s.**       in th
1ba20 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74  e journal.  If t
1ba30 68 69 73 20 76 61 6c 75 65 20 69 73 20 30 78 66  his value is 0xf
1ba40 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f  fffffff, then co
1ba50 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20  mpute the.**    
1ba60 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67     number of pag
1ba70 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74  e records from t
1ba80 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e  he journal size.
1ba90 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79 74 65  .**  (3)  4 byte
1baa0 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
1bab0 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
1bac0 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66   initial value f
1bad0 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20  or the .**      
1bae0 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d   sanity checksum
1baf0 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62 79 74  ..**  (4)  4 byt
1bb00 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  e integer which 
1bb10 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
1bb20 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e 63 61   pages to trunca
1bb30 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  te the.**       
1bb40 64 61 74 61 62 61 73 65 20 74 6f 20 64 75 72 69  database to duri
1bb50 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  ng a rollback..*
1bb60 2a 20 20 28 35 29 20 20 34 20 62 79 74 65 20 62  *  (5)  4 byte b
1bb70 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
1bb80 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73  r which is the s
1bb90 65 63 74 6f 72 20 73 69 7a 65 2e 20 20 54 68 65  ector size.  The
1bba0 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 20   header.**      
1bbb0 20 69 73 20 74 68 69 73 20 6d 61 6e 79 20 62 79   is this many by
1bbc0 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20  tes in size..** 
1bbd0 20 28 36 29 20 20 34 20 62 79 74 65 20 62 69 67   (6)  4 byte big
1bbe0 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
1bbf0 77 68 69 63 68 20 69 73 20 74 68 65 20 70 61 67  which is the pag
1bc00 65 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 37 29 20  e size..**  (7) 
1bc10 20 7a 65 72 6f 20 70 61 64 64 69 6e 67 20 6f 75   zero padding ou
1bc20 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65  t to the next se
1bc30 63 74 6f 72 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  ctor size..**  (
1bc40 38 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65  8)  Zero or more
1bc50 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73   pages instances
1bc60 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77  , each as follow
1bc70 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  s:.**        +  
1bc80 34 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62  4 byte page numb
1bc90 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  er..**        + 
1bca0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1bcb0 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e  e bytes of data.
1bcc0 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20  .**        +  4 
1bcd0 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a  byte checksum.**
1bce0 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61  .** When we spea
1bcf0 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  k of the journal
1bd00 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e   header, we mean
1bd10 20 74 68 65 20 66 69 72 73 74 20 37 20 69 74 65   the first 7 ite
1bd20 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63  ms above..** Eac
1bd30 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a  h entry in the j
1bd40 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73  ournal is an ins
1bd50 74 61 6e 63 65 20 6f 66 20 74 68 65 20 38 74 68  tance of the 8th
1bd60 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c   item..**.** Cal
1bd70 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d  l the value from
1bd80 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c   the second bull
1bd90 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63  et "nRec".  nRec
1bda0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
1bdb0 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20  f.** valid page 
1bdc0 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a  entries in the j
1bdd0 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74  ournal.  In most
1bde0 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20   cases, you can 
1bdf0 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76  compute the.** v
1be00 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f  alue of nRec fro
1be10 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  m the size of th
1be20 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
1be30 20 42 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a   But if a power.
1be40 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  ** failure occur
1be50 72 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  red while the jo
1be60 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20  urnal was being 
1be70 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c  written, it coul
1be80 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65  d be the.** case
1be90 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f   that the size o
1bea0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
1beb0 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79 20 62  le had already b
1bec0 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75  een increased bu
1bed0 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65  t.** the extra e
1bee0 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79  ntries had not y
1bef0 65 74 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c  et made it safel
1bf00 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73  y to disk.  In s
1bf10 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74  uch a case,.** t
1bf20 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  he value of nRec
1bf30 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74   computed from t
1bf40 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75  he file size wou
1bf50 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e  ld be too large.
1bf60 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65    For.** that re
1bf70 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20  ason, we always 
1bf80 75 73 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c  use the nRec val
1bf90 75 65 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ue in the header
1bfa0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
1bfb0 52 65 63 20 76 61 6c 75 65 20 69 73 20 30 78 66  Rec value is 0xf
1bfc0 66 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73  fffffff it means
1bfd0 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c   that nRec shoul
1bfe0 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a  d be computed.**
1bff0 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73   from the file s
1c000 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65  ize.  This value
1c010 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 74 68   is used when th
1c020 65 20 75 73 65 72 20 73 65 6c 65 63 74 73 20 74  e user selects t
1c030 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70  he.** no-sync op
1c040 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75  tion for the jou
1c050 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66  rnal.  A power f
1c060 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61  ailure could lea
1c070 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a  d to corruption.
1c080 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ** in this case.
1c090 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73    But for things
1c0a0 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20   like temporary 
1c0b0 74 61 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c  table (which wil
1c0c0 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20  l be.** deleted 
1c0d0 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69  when the power i
1c0e0 73 20 72 65 73 74 6f 72 65 64 29 20 77 65 20 64  s restored) we d
1c0f0 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a  on't care.  .**.
1c100 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f  ** If the file o
1c110 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75  pened as the jou
1c120 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74  rnal file is not
1c130 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a   a well-formed.*
1c140 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  * journal file t
1c150 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70  hen all pages up
1c160 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f   to the first co
1c170 72 72 75 70 74 65 64 20 70 61 67 65 20 61 72 65  rrupted page are
1c180 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20   rolled.** back 
1c190 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20  (or no pages if 
1c1a0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
1c1b0 65 72 20 69 73 20 63 6f 72 72 75 70 74 65 64 29  er is corrupted)
1c1c0 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  . The journal fi
1c1d0 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65  le.** is then de
1c1e0 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45  leted and SQLITE
1c1f0 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75  _OK returned, ju
1c200 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72  st as if no corr
1c210 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65  uption had.** be
1c220 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a  en encountered..
1c230 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20  **.** If an I/O 
1c240 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f  or malloc() erro
1c250 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f  r occurs, the jo
1c260 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f  urnal-file is no
1c270 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64  t deleted.** and
1c280 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
1c290 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
1c2a0 2a 20 54 68 65 20 69 73 48 6f 74 20 70 61 72 61  * The isHot para
1c2b0 6d 65 74 65 72 20 69 6e 64 69 63 61 74 65 73 20  meter indicates 
1c2c0 74 68 61 74 20 77 65 20 61 72 65 20 74 72 79 69  that we are tryi
1c2d0 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61  ng to rollback a
1c2e0 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68 61 74   journal.** that
1c2f0 20 6d 69 67 68 74 20 62 65 20 61 20 68 6f 74 20   might be a hot 
1c300 6a 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c 20 69 74  journal.  Or, it
1c310 20 63 6f 75 6c 64 20 62 65 20 74 68 61 74 20 74   could be that t
1c320 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 0a 2a  he journal is .*
1c330 2a 20 70 72 65 73 65 72 76 65 64 20 62 65 63 61  * preserved beca
1c340 75 73 65 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f  use of JOURNALMO
1c350 44 45 5f 50 45 52 53 49 53 54 20 6f 72 20 4a 4f  DE_PERSIST or JO
1c360 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
1c370 54 45 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  TE..** If the jo
1c380 75 72 6e 61 6c 20 72 65 61 6c 6c 79 20 69 73 20  urnal really is 
1c390 68 6f 74 2c 20 72 65 73 65 74 20 74 68 65 20 70  hot, reset the p
1c3a0 61 67 65 72 20 63 61 63 68 65 20 70 72 69 6f 72  ager cache prior
1c3b0 20 72 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b   rolling.** back
1c3c0 20 61 6e 79 20 63 6f 6e 74 65 6e 74 2e 20 20 49   any content.  I
1c3d0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  f the journal is
1c3e0 20 6d 65 72 65 6c 79 20 70 65 72 73 69 73 74 65   merely persiste
1c3f0 6e 74 2c 20 6e 6f 20 72 65 73 65 74 20 69 73 0a  nt, no reset is.
1c400 2a 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74  ** needed..*/.st
1c410 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70  atic int pager_p
1c420 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70  layback(Pager *p
1c430 50 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74  Pager, int isHot
1c440 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
1c450 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d   *pVfs = pPager-
1c460 3e 70 56 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a  >pVfs;.  i64 szJ
1c470 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c480 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
1c490 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
1c4a0 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20   bytes */.  u32 
1c4b0 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
1c4c0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1c4d0 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65  f Records in the
1c4e0 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33   journal */.  u3
1c4f0 32 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20  2 u;            
1c500 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e         /* Unsign
1c510 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  ed loop counter 
1c520 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d  */.  Pgno mxPg =
1c530 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
1c540 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69   Size of the ori
1c550 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61  ginal file in pa
1c560 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ges */.  int rc;
1c570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c580 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
1c590 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65   of a subroutine
1c5a0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20   */.  int res = 
1c5b0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  1;             /
1c5c0 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64  * Value returned
1c5d0 20 62 79 20 73 71 6c 69 74 65 33 4f 73 41 63 63   by sqlite3OsAcc
1c5e0 65 73 73 28 29 20 2a 2f 0a 20 20 63 68 61 72 20  ess() */.  char 
1c5f0 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20  *zMaster = 0;   
1c600 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d      /* Name of m
1c610 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1c620 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69  le if any */.  i
1c630 6e 74 20 6e 65 65 64 50 61 67 65 72 52 65 73 65  nt needPagerRese
1c640 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  t;      /* True 
1c650 74 6f 20 72 65 73 65 74 20 70 61 67 65 20 70 72  to reset page pr
1c660 69 6f 72 20 74 6f 20 66 69 72 73 74 20 70 61 67  ior to first pag
1c670 65 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20  e rollback */.  
1c680 69 6e 74 20 6e 50 6c 61 79 62 61 63 6b 20 3d 20  int nPlayback = 
1c690 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61  0;       /* Tota
1c6a0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
1c6b0 73 20 72 65 73 74 6f 72 65 64 20 66 72 6f 6d 20  s restored from 
1c6c0 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
1c6d0 20 73 61 76 65 64 50 61 67 65 53 69 7a 65 20 3d   savedPageSize =
1c6e0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1c6f0 65 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  e;..  /* Figure 
1c700 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63  out how many rec
1c710 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20  ords are in the 
1c720 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20  journal.  Abort 
1c730 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68  early if.  ** th
1c740 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70  e journal is emp
1c750 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ty..  */.  asser
1c760 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
1c770 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 72 63 20 3d  ->jfd) );.  rc =
1c780 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
1c790 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
1c7a0 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21  &szJ);.  if( rc!
1c7b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c7c0 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
1c7d0 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  ack;.  }..  /* R
1c7e0 65 61 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ead the master j
1c7f0 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d  ournal name from
1c800 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66   the journal, if
1c810 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a   it is present..
1c820 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72    ** If a master
1c830 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
1c840 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c  me is specified,
1c850 20 62 75 74 20 74 68 65 20 66 69 6c 65 20 69 73   but the file is
1c860 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e   not.  ** presen
1c870 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20  t on disk, then 
1c880 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e  the journal is n
1c890 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20  ot hot and does 
1c8a0 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20  not need to be. 
1c8b0 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   ** played back.
1c8c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a  .  **.  ** TODO:
1c8d0 20 54 65 63 68 6e 69 63 61 6c 6c 79 20 74 68 65   Technically the
1c8e0 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 6e   following is an
1c8f0 20 65 72 72 6f 72 20 62 65 63 61 75 73 65 20 69   error because i
1c900 74 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a 20  t assumes that. 
1c910 20 2a 2a 20 62 75 66 66 65 72 20 50 61 67 65 72   ** buffer Pager
1c920 2e 70 54 6d 70 53 70 61 63 65 20 69 73 20 28 6d  .pTmpSpace is (m
1c930 78 50 61 74 68 6e 61 6d 65 2b 31 29 20 62 79 74  xPathname+1) byt
1c940 65 73 20 6f 72 20 6c 61 72 67 65 72 2e 20 69 2e  es or larger. i.
1c950 65 2e 20 74 68 61 74 0a 20 20 2a 2a 20 28 70 50  e. that.  ** (pP
1c960 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3e  ager->pageSize >
1c970 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e  = pPager->pVfs->
1c980 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 2e 20 55  mxPathname+1). U
1c990 73 69 6e 67 20 6f 73 5f 75 6e 69 78 2e 63 2c 0a  sing os_unix.c,.
1c9a0 20 20 2a 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20    ** mxPathname 
1c9b0 69 73 20 35 31 32 2c 20 77 68 69 63 68 20 69 73  is 512, which is
1c9c0 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
1c9d0 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f 77 61 62   minimum allowab
1c9e0 6c 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 66 6f  le value.  ** fo
1c9f0 72 20 70 61 67 65 53 69 7a 65 2e 0a 20 20 2a 2f  r pageSize..  */
1ca00 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61  .  zMaster = pPa
1ca10 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
1ca20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65    rc = readMaste
1ca30 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  rJournal(pPager-
1ca40 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70  >jfd, zMaster, p
1ca50 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50  Pager->pVfs->mxP
1ca60 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 69 66  athname+1);.  if
1ca70 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1ca80 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b  && zMaster[0] ){
1ca90 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1caa0 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
1cab0 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f  zMaster, SQLITE_
1cac0 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
1cad0 72 65 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73  res);.  }.  zMas
1cae0 74 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 72  ter = 0;.  if( r
1caf0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
1cb00 21 72 65 73 20 29 7b 0a 20 20 20 20 67 6f 74 6f  !res ){.    goto
1cb10 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
1cb20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75   }.  pPager->jou
1cb30 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 6e  rnalOff = 0;.  n
1cb40 65 65 64 50 61 67 65 72 52 65 73 65 74 20 3d 20  eedPagerReset = 
1cb50 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a 20 54 68 69  isHot;..  /* Thi
1cb60 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65  s loop terminate
1cb70 73 20 65 69 74 68 65 72 20 77 68 65 6e 20 61 20  s either when a 
1cb80 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29  readJournalHdr()
1cb90 20 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 72 5f   or .  ** pager_
1cba0 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
1cbb0 65 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73  e() call returns
1cbc0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20   SQLITE_DONE or 
1cbd0 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 20 20 2a  an IO error .  *
1cbe0 2a 20 6f 63 63 75 72 73 2e 20 0a 20 20 2a 2f 0a  * occurs. .  */.
1cbf0 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
1cc00 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 65    /* Read the ne
1cc10 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  xt journal heade
1cc20 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  r from the journ
1cc30 61 6c 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  al file.  If the
1cc40 72 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f  re are.    ** no
1cc50 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20 6c  t enough bytes l
1cc60 65 66 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  eft in the journ
1cc70 61 6c 20 66 69 6c 65 20 66 6f 72 20 61 20 63 6f  al file for a co
1cc80 6d 70 6c 65 74 65 20 68 65 61 64 65 72 2c 20 6f  mplete header, o
1cc90 72 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 63  r.    ** it is c
1cca0 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20 61  orrupted, then a
1ccb0 20 70 72 6f 63 65 73 73 20 6d 75 73 74 20 68 61   process must ha
1ccc0 76 65 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20  ve failed while 
1ccd0 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20  writing it..    
1cce0 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74 65  ** This indicate
1ccf0 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e  s nothing more n
1cd00 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65  eeds to be rolle
1cd10 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20  d back..    */. 
1cd20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72     rc = readJour
1cd30 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 69  nalHdr(pPager, i
1cd40 73 48 6f 74 2c 20 73 7a 4a 2c 20 26 6e 52 65 63  sHot, szJ, &nRec
1cd50 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66  , &mxPg);.    if
1cd60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1cd70 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63  ){ .      if( rc
1cd80 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
1cd90 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1cda0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
1cdb0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
1cdc0 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a  playback;.    }.
1cdd0 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20  .    /* If nRec 
1cde0 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74  is 0xffffffff, t
1cdf0 68 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  hen this journal
1ce00 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20   was created by 
1ce10 61 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a  a process.    **
1ce20 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73   working in no-s
1ce30 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d  ync mode. This m
1ce40 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 65  eans that the re
1ce50 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  st of the journa
1ce60 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f  l.    ** file co
1ce70 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c  nsists of pages,
1ce80 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f   there are no mo
1ce90 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  re journal heade
1cea0 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20  rs. Compute.    
1ceb0 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
1cec0 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68  nRec based on th
1ced0 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20  is assumption.. 
1cee0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52     */.    if( nR
1cef0 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29  ec==0xffffffff )
1cf00 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1cf10 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1cf20 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ff==JOURNAL_HDR_
1cf30 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  SZ(pPager) );.  
1cf40 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29      nRec = (int)
1cf50 28 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f  ((szJ - JOURNAL_
1cf60 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f  HDR_SZ(pPager))/
1cf70 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
1cf80 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  ager));.    }.. 
1cf90 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73     /* If nRec is
1cfa0 20 30 20 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c   0 and this roll
1cfb0 62 61 63 6b 20 69 73 20 6f 66 20 61 20 74 72 61  back is of a tra
1cfc0 6e 73 61 63 74 69 6f 6e 20 63 72 65 61 74 65 64  nsaction created
1cfd0 20 62 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20   by this.    ** 
1cfe0 70 72 6f 63 65 73 73 20 61 6e 64 20 69 66 20 74  process and if t
1cff0 68 69 73 20 69 73 20 74 68 65 20 66 69 6e 61 6c  his is the final
1d000 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 20 6a   header in the j
1d010 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69 74 20  ournal, then it 
1d020 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68 61  means.    ** tha
1d030 74 20 74 68 69 73 20 70 61 72 74 20 6f 66 20 74  t this part of t
1d040 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62  he journal was b
1d050 65 69 6e 67 20 66 69 6c 6c 65 64 20 62 75 74 20  eing filled but 
1d060 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
1d070 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65 64 20 74  .    ** synced t
1d080 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75 74 65  o disk.  Compute
1d090 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
1d0a0 61 67 65 73 20 62 61 73 65 64 20 6f 6e 20 74 68  ages based on th
1d0b0 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20 20 20  e remaining.    
1d0c0 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  ** size of the f
1d0d0 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ile..    **.    
1d0e0 2a 2a 20 54 68 65 20 74 68 69 72 64 20 74 65 72  ** The third ter
1d0f0 6d 20 6f 66 20 74 68 65 20 74 65 73 74 20 77 61  m of the test wa
1d100 73 20 61 64 64 65 64 20 74 6f 20 66 69 78 20 74  s added to fix t
1d110 69 63 6b 65 74 20 23 32 35 36 35 2e 0a 20 20 20  icket #2565..   
1d120 20 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67   ** When rolling
1d130 20 62 61 63 6b 20 61 20 68 6f 74 20 6a 6f 75 72   back a hot jour
1d140 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30 20 61 6c 77  nal, nRec==0 alw
1d150 61 79 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74  ays means that t
1d160 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 63  he next.    ** c
1d170 68 75 6e 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72  hunk of the jour
1d180 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 7a 65 72  nal contains zer
1d190 6f 20 70 61 67 65 73 20 74 6f 20 62 65 20 72 6f  o pages to be ro
1d1a0 6c 6c 65 64 20 62 61 63 6b 2e 20 20 42 75 74 0a  lled back.  But.
1d1b0 20 20 20 20 2a 2a 20 77 68 65 6e 20 64 6f 69 6e      ** when doin
1d1c0 67 20 61 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64  g a ROLLBACK and
1d1d0 20 74 68 65 20 6e 52 65 63 3d 3d 30 20 63 68 75   the nRec==0 chu
1d1e0 6e 6b 20 69 73 20 74 68 65 20 6c 61 73 74 20 63  nk is the last c
1d1f0 68 75 6e 6b 20 69 6e 0a 20 20 20 20 2a 2a 20 74  hunk in.    ** t
1d200 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 6d  he journal, it m
1d210 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6a 6f  eans that the jo
1d220 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74  urnal might cont
1d230 61 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 0a 20  ain additional. 
1d240 20 20 20 2a 2a 20 70 61 67 65 73 20 74 68 61 74     ** pages that
1d250 20 6e 65 65 64 20 74 6f 20 62 65 20 72 6f 6c 6c   need to be roll
1d260 65 64 20 62 61 63 6b 20 61 6e 64 20 74 68 61 74  ed back and that
1d270 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
1d280 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 68 6f  ages .    ** sho
1d290 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20  uld be computed 
1d2a0 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75  based on the jou
1d2b0 72 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65 2e 0a  rnal file size..
1d2c0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
1d2d0 52 65 63 3d 3d 30 20 26 26 20 21 69 73 48 6f 74  Rec==0 && !isHot
1d2e0 20 26 26 0a 20 20 20 20 20 20 20 20 70 50 61 67   &&.        pPag
1d2f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a  er->journalHdr+J
1d300 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
1d310 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a  ager)==pPager->j
1d320 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20  ournalOff ){.   
1d330 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28     nRec = (int)(
1d340 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a  (szJ - pPager->j
1d350 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55  ournalOff) / JOU
1d360 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
1d370 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  r));.    }..    
1d380 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
1d390 65 20 66 69 72 73 74 20 68 65 61 64 65 72 20 72  e first header r
1d3a0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
1d3b0 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74  rnal, truncate t
1d3c0 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
1d3d0 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20  se file back to 
1d3e0 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a  its original siz
1d3f0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
1d400 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
1d410 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44  lOff==JOURNAL_HD
1d420 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a  R_SZ(pPager) ){.
1d430 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
1d440 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
1d450 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69  , mxPg);.      i
1d460 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1d470 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
1d480 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
1d490 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61       }.      pPa
1d4a0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78  ger->dbSize = mx
1d4b0 50 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  Pg;.    }..    /
1d4c0 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20  * Copy original 
1d4d0 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65  pages out of the
1d4e0 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63   journal and bac
1d4f0 6b 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20  k into the .    
1d500 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
1d510 20 61 6e 64 2f 6f 72 20 70 61 67 65 20 63 61 63   and/or page cac
1d520 68 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  he..    */.    f
1d530 6f 72 28 75 3d 30 3b 20 75 3c 6e 52 65 63 3b 20  or(u=0; u<nRec; 
1d540 75 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  u++){.      if( 
1d550 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20 29  needPagerReset )
1d560 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f  {.        pager_
1d570 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
1d580 20 20 20 20 20 20 20 6e 65 65 64 50 61 67 65 72         needPager
1d590 52 65 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  Reset = 0;.     
1d5a0 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61   }.      rc = pa
1d5b0 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
1d5c0 5f 70 61 67 65 28 70 50 61 67 65 72 2c 26 70 50  _page(pPager,&pP
1d5d0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1d5e0 2c 30 2c 31 2c 30 29 3b 0a 20 20 20 20 20 20 69  ,0,1,0);.      i
1d5f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1d600 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 50 6c 61   ){.        nPla
1d610 79 62 61 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 7d  yback++;.      }
1d620 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66  else{.        if
1d630 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
1d640 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  E ){.          p
1d650 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1d660 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20  f = szJ;.       
1d670 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1d680 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d    }else if( rc==
1d690 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
1d6a0 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
1d6b0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6a       /* If the j
1d6c0 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20  ournal has been 
1d6d0 74 72 75 6e 63 61 74 65 64 2c 20 73 69 6d 70 6c  truncated, simpl
1d6e0 79 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20 61  y stop reading a
1d6f0 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nd.          ** 
1d700 70 72 6f 63 65 73 73 69 6e 67 20 74 68 65 20 6a  processing the j
1d710 6f 75 72 6e 61 6c 2e 20 54 68 69 73 20 6d 69 67  ournal. This mig
1d720 68 74 20 68 61 70 70 65 6e 20 69 66 20 74 68 65  ht happen if the
1d730 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 20   journal was.   
1d740 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f         ** not co
1d750 6d 70 6c 65 74 65 6c 79 20 77 72 69 74 74 65 6e  mpletely written
1d760 20 61 6e 64 20 73 79 6e 63 65 64 20 70 72 69 6f   and synced prio
1d770 72 20 74 6f 20 61 20 63 72 61 73 68 2e 20 20 49  r to a crash.  I
1d780 6e 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20  n that.         
1d790 20 2a 2a 20 63 61 73 65 2c 20 74 68 65 20 64 61   ** case, the da
1d7a0 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20 68 61  tabase should ha
1d7b0 76 65 20 6e 65 76 65 72 20 62 65 65 6e 20 77 72  ve never been wr
1d7c0 69 74 74 65 6e 20 69 6e 20 74 68 65 0a 20 20 20  itten in the.   
1d7d0 20 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74 20         ** first 
1d7e0 70 6c 61 63 65 20 73 6f 20 69 74 20 69 73 20 4f  place so it is O
1d7f0 4b 20 74 6f 20 73 69 6d 70 6c 79 20 61 62 61 6e  K to simply aban
1d800 64 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  don the rollback
1d810 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
1d820 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1d830 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
1d840 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
1d850 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d860 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72       /* If we ar
1d870 65 20 75 6e 61 62 6c 65 20 74 6f 20 72 6f 6c 6c  e unable to roll
1d880 62 61 63 6b 2c 20 71 75 69 74 20 61 6e 64 20 72  back, quit and r
1d890 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 0a  eturn the error.
1d8a0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 64            ** cod
1d8b0 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61  e.  This will ca
1d8c0 75 73 65 20 74 68 65 20 70 61 67 65 72 20 74 6f  use the pager to
1d8d0 20 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72   enter the error
1d8e0 20 73 74 61 74 65 0a 20 20 20 20 20 20 20 20 20   state.         
1d8f0 20 2a 2a 20 73 6f 20 74 68 61 74 20 6e 6f 20 66   ** so that no f
1d900 75 72 74 68 65 72 20 68 61 72 6d 20 77 69 6c 6c  urther harm will
1d910 20 62 65 20 64 6f 6e 65 2e 20 20 50 65 72 68 61   be done.  Perha
1d920 70 73 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20  ps the next.    
1d930 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
1d940 20 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67 20 77   to come along w
1d950 69 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f 20 72  ill be able to r
1d960 6f 6c 6c 62 61 63 6b 20 74 68 65 20 64 61 74 61  ollback the data
1d970 62 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20  base..          
1d980 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  */.          got
1d990 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
1d9a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1d9b0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a  }.    }.  }.  /*
1d9c0 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20 61  NOTREACHED*/.  a
1d9d0 73 73 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64  ssert( 0 );..end
1d9e0 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28  _playback:.  if(
1d9f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1da00 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
1da10 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
1da20 7a 65 28 70 50 61 67 65 72 2c 20 26 73 61 76 65  ze(pPager, &save
1da30 64 50 61 67 65 53 69 7a 65 2c 20 2d 31 29 3b 0a  dPageSize, -1);.
1da40 20 20 7d 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69    }.  /* Followi
1da50 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74  ng a rollback, t
1da60 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1da70 20 73 68 6f 75 6c 64 20 62 65 20 62 61 63 6b 20   should be back 
1da80 69 6e 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a  in its original.
1da90 20 20 2a 2a 20 73 74 61 74 65 20 70 72 69 6f 72    ** state prior
1daa0 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
1dab0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1dac0 2c 20 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65 0a  , so invoke the.
1dad0 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e 54    ** SQLITE_FCNT
1dae0 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 20 66  L_DB_UNCHANGED f
1daf0 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74 68  ile-control meth
1db00 6f 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68  od to disable th
1db10 65 0a 20 20 2a 2a 20 61 73 73 65 72 74 69 6f 6e  e.  ** assertion
1db20 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73 61   that the transa
1db30 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61  ction counter wa
1db40 73 20 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a 2f  s modified..  */
1db50 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1db60 45 42 55 47 0a 20 20 73 71 6c 69 74 65 33 4f 73  EBUG.  sqlite3Os
1db70 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28  FileControlHint(
1db80 70 50 61 67 65 72 2d 3e 66 64 2c 53 51 4c 49 54  pPager->fd,SQLIT
1db90 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41  E_FCNTL_DB_UNCHA
1dba0 4e 47 45 44 2c 30 29 3b 0a 23 65 6e 64 69 66 0a  NGED,0);.#endif.
1dbb0 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 6c  .  /* If this pl
1dbc0 61 79 62 61 63 6b 20 69 73 20 68 61 70 70 65 6e  ayback is happen
1dbd0 69 6e 67 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ing automaticall
1dbe0 79 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66  y as a result of
1dbf0 20 61 6e 20 49 4f 20 6f 72 20 0a 20 20 2a 2a 20   an IO or .  ** 
1dc00 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 74 68 61  malloc error tha
1dc10 74 20 6f 63 63 75 72 72 65 64 20 61 66 74 65 72  t occurred after
1dc20 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
1dc30 74 65 72 20 77 61 73 20 75 70 64 61 74 65 64 20  ter was updated 
1dc40 62 75 74 20 0a 20 20 2a 2a 20 62 65 66 6f 72 65  but .  ** before
1dc50 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1dc60 20 77 61 73 20 63 6f 6d 6d 69 74 74 65 64 2c 20   was committed, 
1dc70 74 68 65 6e 20 74 68 65 20 63 68 61 6e 67 65 2d  then the change-
1dc80 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 6f  counter .  ** mo
1dc90 64 69 66 69 63 61 74 69 6f 6e 20 6d 61 79 20 6a  dification may j
1dca0 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 72 65  ust have been re
1dcb0 76 65 72 74 65 64 2e 20 49 66 20 74 68 69 73 20  verted. If this 
1dcc0 68 61 70 70 65 6e 73 20 69 6e 20 65 78 63 6c 75  happens in exclu
1dcd0 73 69 76 65 20 0a 20 20 2a 2a 20 6d 6f 64 65 2c  sive .  ** mode,
1dce0 20 74 68 65 6e 20 73 75 62 73 65 71 75 65 6e 74   then subsequent
1dcf0 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 70 65   transactions pe
1dd00 72 66 6f 72 6d 65 64 20 62 79 20 74 68 65 20 63  rformed by the c
1dd10 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 6e  onnection will n
1dd20 6f 74 0a 20 20 2a 2a 20 75 70 64 61 74 65 20 74  ot.  ** update t
1dd30 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
1dd40 72 20 61 74 20 61 6c 6c 2e 20 54 68 69 73 20 6d  r at all. This m
1dd50 61 79 20 6c 65 61 64 20 74 6f 20 63 61 63 68 65  ay lead to cache
1dd60 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 79 0a 20   inconsistency. 
1dd70 20 2a 2a 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72   ** problems for
1dd80 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
1dd90 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69   at some point i
1dda0 6e 20 74 68 65 20 66 75 74 75 72 65 2e 20 53 6f  n the future. So
1ddb0 2c 20 6a 75 73 74 0a 20 20 2a 2a 20 69 6e 20 63  , just.  ** in c
1ddc0 61 73 65 20 74 68 69 73 20 68 61 73 20 68 61 70  ase this has hap
1ddd0 70 65 6e 65 64 2c 20 63 6c 65 61 72 20 74 68 65  pened, clear the
1dde0 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65   changeCountDone
1ddf0 20 66 6c 61 67 20 6e 6f 77 2e 0a 20 20 2a 2f 0a   flag now..  */.
1de00 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
1de10 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67  CountDone = pPag
1de20 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20  er->tempFile;.. 
1de30 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1de40 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65  OK ){.    zMaste
1de50 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  r = pPager->pTmp
1de60 53 70 61 63 65 3b 0a 20 20 20 20 72 63 20 3d 20  Space;.    rc = 
1de70 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
1de80 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  l(pPager->jfd, z
1de90 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e  Master, pPager->
1dea0 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
1deb0 2b 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  +1);.    testcas
1dec0 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
1ded0 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63   );.  }.  if( rc
1dee0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26  ==SQLITE_OK.   &
1def0 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74  & (pPager->eStat
1df00 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
1df10 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d  DBMOD || pPager-
1df20 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
1df30 50 45 4e 29 0a 20 20 29 7b 0a 20 20 20 20 72 63  PEN).  ){.    rc
1df40 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
1df50 79 6e 63 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ync(pPager, 0);.
1df60 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
1df70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1df80 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  c = pager_end_tr
1df90 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
1dfa0 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d 27 5c  , zMaster[0]!='\
1dfb0 30 27 2c 20 30 29 3b 0a 20 20 20 20 74 65 73 74  0', 0);.    test
1dfc0 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
1dfd0 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28  _OK );.  }.  if(
1dfe0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1dff0 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26 26 20  & zMaster[0] && 
1e000 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  res ){.    /* If
1e010 20 74 68 65 72 65 20 77 61 73 20 61 20 6d 61 73   there was a mas
1e020 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ter journal and 
1e030 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
1e040 6c 20 72 65 74 75 72 6e 20 73 75 63 63 65 73 73  l return success
1e050 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20  ,.    ** see if 
1e060 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
1e070 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  o delete the mas
1e080 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20  ter journal..   
1e090 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67   */.    rc = pag
1e0a0 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 70 50 61  er_delmaster(pPa
1e0b0 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  ger, zMaster);. 
1e0c0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
1e0d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
1e0e0 7d 0a 20 20 69 66 28 20 69 73 48 6f 74 20 26 26  }.  if( isHot &&
1e0f0 20 6e 50 6c 61 79 62 61 63 6b 20 29 7b 0a 20 20   nPlayback ){.  
1e100 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
1e110 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f  LITE_NOTICE_RECO
1e120 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 2c 20 22 72  VER_ROLLBACK, "r
1e130 65 63 6f 76 65 72 65 64 20 25 64 20 70 61 67 65  ecovered %d page
1e140 73 20 66 72 6f 6d 20 25 73 22 2c 0a 20 20 20 20  s from %s",.    
1e150 20 20 20 20 20 20 20 20 20 20 20 20 6e 50 6c 61              nPla
1e160 79 62 61 63 6b 2c 20 70 50 61 67 65 72 2d 3e 7a  yback, pPager->z
1e170 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 0a 0a 20  Journal);.  }.. 
1e180 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65   /* The Pager.se
1e190 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c  ctorSize variabl
1e1a0 65 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20  e may have been 
1e1b0 75 70 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f  updated while ro
1e1c0 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20  lling.  ** back 
1e1d0 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65  a journal create
1e1e0 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 77  d by a process w
1e1f0 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74 20  ith a different 
1e200 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a  sector size.  **
1e210 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74   value. Reset it
1e220 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20   to the correct 
1e230 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70  value for this p
1e240 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73  rocess..  */.  s
1e250 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
1e260 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ger);.  return r
1e270 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  c;.}.../*.** Rea
1e280 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f  d the content fo
1e290 72 20 70 61 67 65 20 70 50 67 20 6f 75 74 20 6f  r page pPg out o
1e2a0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1e2b0 69 6c 65 20 28 6f 72 20 6f 75 74 20 6f 66 0a 2a  ile (or out of.*
1e2c0 2a 20 74 68 65 20 57 41 4c 20 69 66 20 74 68 61  * the WAL if tha
1e2d0 74 20 69 73 20 77 68 65 72 65 20 74 68 65 20 6d  t is where the m
1e2e0 6f 73 74 20 72 65 63 65 6e 74 20 63 6f 70 79 20  ost recent copy 
1e2f0 69 66 20 66 6f 75 6e 64 29 20 69 6e 74 6f 20 0a  if found) into .
1e300 2a 2a 20 70 50 67 2d 3e 70 44 61 74 61 2e 20 41  ** pPg->pData. A
1e310 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 72 20   shared lock or 
1e320 67 72 65 61 74 65 72 20 6d 75 73 74 20 62 65 20  greater must be 
1e330 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1e340 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 62 65 66  base.** file bef
1e350 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ore this functio
1e360 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  n is called..**.
1e370 2a 2a 20 49 66 20 70 61 67 65 20 31 20 69 73 20  ** If page 1 is 
1e380 72 65 61 64 2c 20 74 68 65 6e 20 74 68 65 20 76  read, then the v
1e390 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62  alue of Pager.db
1e3a0 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 73 65  FileVers[] is se
1e3b0 74 20 74 6f 0a 2a 2a 20 74 68 65 20 76 61 6c 75  t to.** the valu
1e3c0 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
1e3d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
1e3e0 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72  *.** If an IO er
1e3f0 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  ror occurs, then
1e400 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 69 73   the IO error is
1e410 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
1e420 20 63 61 6c 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65   caller..** Othe
1e430 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
1e440 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
1e450 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
1e460 44 62 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  DbPage(PgHdr *pP
1e470 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
1e480 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
1e490 72 3b 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65  r; /* Pager obje
1e4a0 63 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ct associated wi
1e4b0 74 68 20 70 61 67 65 20 70 50 67 20 2a 2f 0a 20  th page pPg */. 
1e4c0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1e4d0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  _OK;          /*
1e4e0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1e4f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1e500 4f 4d 49 54 5f 57 41 4c 0a 20 20 75 33 32 20 69  OMIT_WAL.  u32 i
1e510 46 72 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20  Frame = 0;      
1e520 20 20 20 20 20 20 20 20 2f 2a 20 46 72 61 6d 65          /* Frame
1e530 20 6f 66 20 57 41 4c 20 63 6f 6e 74 61 69 6e 69   of WAL containi
1e540 6e 67 20 70 67 6e 6f 20 2a 2f 0a 0a 20 20 61 73  ng pgno */..  as
1e550 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
1e560 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44  tate>=PAGER_READ
1e570 45 52 20 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a  ER && !MEMDB );.
1e580 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
1e590 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a  (pPager->fd) );.
1e5a0 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57  .  if( pagerUseW
1e5b0 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
1e5c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
1e5d0 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65  lFindFrame(pPage
1e5e0 72 2d 3e 70 57 61 6c 2c 20 70 50 67 2d 3e 70 67  r->pWal, pPg->pg
1e5f0 6e 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20 20  no, &iFrame);.  
1e600 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1e610 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20  n rc;.  }.  if( 
1e620 69 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 72 63  iFrame ){.    rc
1e630 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 52 65 61   = sqlite3WalRea
1e640 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70  dFrame(pPager->p
1e650 57 61 6c 2c 20 69 46 72 61 6d 65 2c 70 50 61 67  Wal, iFrame,pPag
1e660 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 70 50 67  er->pageSize,pPg
1e670 2d 3e 70 44 61 74 61 29 3b 0a 20 20 7d 65 6c 73  ->pData);.  }els
1e680 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20  e.#endif.  {.   
1e690 20 69 36 34 20 69 4f 66 66 73 65 74 20 3d 20 28   i64 iOffset = (
1e6a0 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 2a 28 69 36  pPg->pgno-1)*(i6
1e6b0 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
1e6c0 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ze;.    rc = sql
1e6d0 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
1e6e0 72 2d 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61 74  r->fd, pPg->pDat
1e6f0 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
1e700 69 7a 65 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20  ize, iOffset);. 
1e710 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1e720 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
1e730 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  AD ){.      rc =
1e740 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1e750 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 67  }.  }..  if( pPg
1e760 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ->pgno==1 ){.   
1e770 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
1e780 20 2f 2a 20 49 66 20 74 68 65 20 72 65 61 64 20   /* If the read 
1e790 69 73 20 75 6e 73 75 63 63 65 73 73 66 75 6c 2c  is unsuccessful,
1e7a0 20 73 65 74 20 74 68 65 20 64 62 46 69 6c 65 56   set the dbFileV
1e7b0 65 72 73 5b 5d 20 74 6f 20 73 6f 6d 65 74 68 69  ers[] to somethi
1e7c0 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  ng.      ** that
1e7d0 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 61   will never be a
1e7e0 20 76 61 6c 69 64 20 66 69 6c 65 20 76 65 72 73   valid file vers
1e7f0 69 6f 6e 2e 20 20 64 62 46 69 6c 65 56 65 72 73  ion.  dbFileVers
1e800 5b 5d 20 69 73 20 61 20 63 6f 70 79 0a 20 20 20  [] is a copy.   
1e810 20 20 20 2a 2a 20 6f 66 20 62 79 74 65 73 20 32     ** of bytes 2
1e820 34 2e 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74  4..39 of the dat
1e830 61 62 61 73 65 2e 20 20 42 79 74 65 73 20 32 38  abase.  Bytes 28
1e840 2e 2e 33 31 20 73 68 6f 75 6c 64 20 61 6c 77 61  ..31 should alwa
1e850 79 73 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 7a  ys be.      ** z
1e860 65 72 6f 20 6f 72 20 74 68 65 20 73 69 7a 65 20  ero or the size 
1e870 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1e880 69 6e 20 70 61 67 65 2e 20 42 79 74 65 73 20 33  in page. Bytes 3
1e890 32 2e 2e 33 35 20 61 6e 64 20 33 35 2e 2e 33 39  2..35 and 35..39
1e8a0 0a 20 20 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64  .      ** should
1e8b0 20 62 65 20 70 61 67 65 20 6e 75 6d 62 65 72 73   be page numbers
1e8c0 20 77 68 69 63 68 20 61 72 65 20 6e 65 76 65 72   which are never
1e8d0 20 30 78 66 66 66 66 66 66 66 66 2e 20 20 53 6f   0xffffffff.  So
1e8e0 20 66 69 6c 6c 69 6e 67 0a 20 20 20 20 20 20 2a   filling.      *
1e8f0 2a 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  * pPager->dbFile
1e900 56 65 72 73 5b 5d 20 77 69 74 68 20 61 6c 6c 20  Vers[] with all 
1e910 30 78 66 66 20 62 79 74 65 73 20 73 68 6f 75 6c  0xff bytes shoul
1e920 64 20 73 75 66 66 69 63 65 2e 0a 20 20 20 20 20  d suffice..     
1e930 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72   **.      ** For
1e940 20 61 6e 20 65 6e 63 72 79 70 74 65 64 20 64 61   an encrypted da
1e950 74 61 62 61 73 65 2c 20 74 68 65 20 73 69 74 75  tabase, the situ
1e960 61 74 69 6f 6e 20 69 73 20 6d 6f 72 65 20 63 6f  ation is more co
1e970 6d 70 6c 65 78 3a 20 20 62 79 74 65 73 0a 20 20  mplex:  bytes.  
1e980 20 20 20 20 2a 2a 20 32 34 2e 2e 33 39 20 6f 66      ** 24..39 of
1e990 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 72   the database ar
1e9a0 65 20 77 68 69 74 65 20 6e 6f 69 73 65 2e 20 20  e white noise.  
1e9b0 42 75 74 20 74 68 65 20 70 72 6f 62 61 62 69 6c  But the probabil
1e9c0 69 74 79 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  ity of.      ** 
1e9d0 77 68 69 74 65 20 6e 6f 69 73 65 20 65 71 75 61  white noise equa
1e9e0 6c 69 6e 67 20 31 36 20 62 79 74 65 73 20 6f 66  ling 16 bytes of
1e9f0 20 30 78 66 66 20 69 73 20 76 61 6e 69 73 68 69   0xff is vanishi
1ea00 6e 67 6c 79 20 73 6d 61 6c 6c 20 73 6f 0a 20 20  ngly small so.  
1ea10 20 20 20 20 2a 2a 20 77 65 20 73 68 6f 75 6c 64      ** we should
1ea20 20 73 74 69 6c 6c 20 62 65 20 6f 6b 2e 0a 20 20   still be ok..  
1ea30 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d      */.      mem
1ea40 73 65 74 28 70 50 61 67 65 72 2d 3e 64 62 46 69  set(pPager->dbFi
1ea50 6c 65 56 65 72 73 2c 20 30 78 66 66 2c 20 73 69  leVers, 0xff, si
1ea60 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
1ea70 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d  ileVers));.    }
1ea80 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 38 20 2a  else{.      u8 *
1ea90 64 62 46 69 6c 65 56 65 72 73 20 3d 20 26 28 28  dbFileVers = &((
1eaa0 75 38 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 5b  u8*)pPg->pData)[
1eab0 32 34 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  24];.      memcp
1eac0 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
1ead0 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72  eVers, dbFileVer
1eae0 73 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  s, sizeof(pPager
1eaf0 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
1eb00 20 20 20 20 7d 0a 20 20 7d 0a 20 20 43 4f 44 45      }.  }.  CODE
1eb10 43 31 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  C1(pPager, pPg->
1eb20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
1eb30 2c 20 33 2c 20 72 63 20 3d 20 53 51 4c 49 54 45  , 3, rc = SQLITE
1eb40 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a 0a 20  _NOMEM_BKPT);.. 
1eb50 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
1eb60 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62  te3_pager_readdb
1eb70 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52  _count);.  PAGER
1eb80 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52  _INCR(pPager->nR
1eb90 65 61 64 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  ead);.  IOTRACE(
1eba0 28 22 50 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c  ("PGIN %p %d\n",
1ebb0 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
1ebc0 6e 6f 29 29 3b 0a 20 20 50 41 47 45 52 54 52 41  no));.  PAGERTRA
1ebd0 43 45 28 28 22 46 45 54 43 48 20 25 64 20 70 61  CE(("FETCH %d pa
1ebe0 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29  ge %d hash(%08x)
1ebf0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1ec00 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
1ec10 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  er), pPg->pgno, 
1ec20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
1ec30 50 67 29 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e  Pg)));..  return
1ec40 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70   rc;.}../*.** Up
1ec50 64 61 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f  date the value o
1ec60 66 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  f the change-cou
1ec70 6e 74 65 72 20 61 74 20 6f 66 66 73 65 74 73 20  nter at offsets 
1ec80 32 34 20 61 6e 64 20 39 32 20 69 6e 0a 2a 2a 20  24 and 92 in.** 
1ec90 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 74  the header and t
1eca0 68 65 20 73 71 6c 69 74 65 20 76 65 72 73 69 6f  he sqlite versio
1ecb0 6e 20 6e 75 6d 62 65 72 20 61 74 20 6f 66 66 73  n number at offs
1ecc0 65 74 20 39 36 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  et 96..**.** Thi
1ecd0 73 20 69 73 20 61 6e 20 75 6e 63 6f 6e 64 69 74  s is an uncondit
1ece0 69 6f 6e 61 6c 20 75 70 64 61 74 65 2e 20 20 53  ional update.  S
1ecf0 65 65 20 61 6c 73 6f 20 74 68 65 20 70 61 67 65  ee also the page
1ed00 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
1ed10 6e 74 65 72 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  nter().** routin
1ed20 65 20 77 68 69 63 68 20 6f 6e 6c 79 20 75 70 64  e which only upd
1ed30 61 74 65 73 20 74 68 65 20 63 68 61 6e 67 65 2d  ates the change-
1ed40 63 6f 75 6e 74 65 72 20 69 66 20 74 68 65 20 75  counter if the u
1ed50 70 64 61 74 65 20 69 73 20 61 63 74 75 61 6c 6c  pdate is actuall
1ed60 79 0a 2a 2a 20 6e 65 65 64 65 64 2c 20 61 73 20  y.** needed, as 
1ed70 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
1ed80 65 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65  e pPager->change
1ed90 43 6f 75 6e 74 44 6f 6e 65 20 73 74 61 74 65 20  CountDone state 
1eda0 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  variable..*/.sta
1edb0 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 77  tic void pager_w
1edc0 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74  rite_changecount
1edd0 65 72 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  er(PgHdr *pPg){.
1ede0 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75    u32 change_cou
1edf0 6e 74 65 72 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72  nter;..  /* Incr
1ee00 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20  ement the value 
1ee10 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20 77 72  just read and wr
1ee20 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62  ite it back to b
1ee30 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 63 68 61  yte 24. */.  cha
1ee40 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71  nge_counter = sq
1ee50 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 28 75  lite3Get4byte((u
1ee60 38 2a 29 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  8*)pPg->pPager->
1ee70 64 62 46 69 6c 65 56 65 72 73 29 2b 31 3b 0a 20  dbFileVers)+1;. 
1ee80 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61   put32bits(((cha
1ee90 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 32  r*)pPg->pData)+2
1eea0 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  4, change_counte
1eeb0 72 29 3b 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 73  r);..  /* Also s
1eec0 74 6f 72 65 20 74 68 65 20 53 51 4c 69 74 65 20  tore the SQLite 
1eed0 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 69  version number i
1eee0 6e 20 62 79 74 65 73 20 39 36 2e 2e 39 39 20 61  n bytes 96..99 a
1eef0 6e 64 20 69 6e 0a 20 20 2a 2a 20 62 79 74 65 73  nd in.  ** bytes
1ef00 20 39 32 2e 2e 39 35 20 73 74 6f 72 65 20 74 68   92..95 store th
1ef10 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
1ef20 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 76   for which the v
1ef30 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 0a 20 20  ersion number.  
1ef40 2a 2a 20 69 73 20 76 61 6c 69 64 2e 20 2a 2f 0a  ** is valid. */.
1ef50 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68    put32bits(((ch
1ef60 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b  ar*)pPg->pData)+
1ef70 39 32 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  92, change_count
1ef80 65 72 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73  er);.  put32bits
1ef90 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44  (((char*)pPg->pD
1efa0 61 74 61 29 2b 39 36 2c 20 53 51 4c 49 54 45 5f  ata)+96, SQLITE_
1efb0 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 29 3b  VERSION_NUMBER);
1efc0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
1efd0 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a  TE_OMIT_WAL./*.*
1efe0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1eff0 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20  is invoked once 
1f000 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 74 68  for each page th
1f010 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  at has already b
1f020 65 65 6e 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20  een .** written 
1f030 69 6e 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c  into the log fil
1f040 65 20 77 68 65 6e 20 61 20 57 41 4c 20 74 72 61  e when a WAL tra
1f050 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
1f060 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 50 61 72 61  ed back..** Para
1f070 6d 65 74 65 72 20 69 50 67 20 69 73 20 74 68 65  meter iPg is the
1f080 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
1f090 73 61 69 64 20 70 61 67 65 2e 20 54 68 65 20 70  said page. The p
1f0a0 43 74 78 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a  Ctx argument .**
1f0b0 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 70   is actually a p
1f0c0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61  ointer to the Pa
1f0d0 67 65 72 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ger structure..*
1f0e0 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 69 50 67  *.** If page iPg
1f0f0 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74   is present in t
1f100 68 65 20 63 61 63 68 65 2c 20 61 6e 64 20 68 61  he cache, and ha
1f110 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  s no outstanding
1f120 20 72 65 66 65 72 65 6e 63 65 73 2c 0a 2a 2a 20   references,.** 
1f130 69 74 20 69 73 20 64 69 73 63 61 72 64 65 64 2e  it is discarded.
1f140 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
1f150 68 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20  here are one or 
1f160 6d 6f 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67  more outstanding
1f170 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2c 20  .** references, 
1f180 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
1f190 20 69 73 20 72 65 6c 6f 61 64 65 64 20 66 72 6f   is reloaded fro
1f1a0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
1f1b0 49 66 20 74 68 65 0a 2a 2a 20 61 74 74 65 6d 70  If the.** attemp
1f1c0 74 20 74 6f 20 72 65 6c 6f 61 64 20 63 6f 6e 74  t to reload cont
1f1d0 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ent from the dat
1f1e0 61 62 61 73 65 20 69 73 20 72 65 71 75 69 72 65  abase is require
1f1f0 64 20 61 6e 64 20 66 61 69 6c 73 2c 20 0a 2a 2a  d and fails, .**
1f200 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74   return an SQLit
1f210 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74  e error code. Ot
1f220 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
1f230 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
1f240 74 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62  t pagerUndoCallb
1f250 61 63 6b 28 76 6f 69 64 20 2a 70 43 74 78 2c 20  ack(void *pCtx, 
1f260 50 67 6e 6f 20 69 50 67 29 7b 0a 20 20 69 6e 74  Pgno iPg){.  int
1f270 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1f280 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1f290 20 3d 20 28 50 61 67 65 72 20 2a 29 70 43 74 78   = (Pager *)pCtx
1f2a0 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  ;.  PgHdr *pPg;.
1f2b0 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72  .  assert( pager
1f2c0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
1f2d0 3b 0a 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65  ;.  pPg = sqlite
1f2e0 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61  3PagerLookup(pPa
1f2f0 67 65 72 2c 20 69 50 67 29 3b 0a 20 20 69 66 28  ger, iPg);.  if(
1f300 20 70 50 67 20 29 7b 0a 20 20 20 20 69 66 28 20   pPg ){.    if( 
1f310 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67  sqlite3PcachePag
1f320 65 52 65 66 63 6f 75 6e 74 28 70 50 67 29 3d 3d  eRefcount(pPg)==
1f330 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 ){.      sqlit
1f340 65 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67  e3PcacheDrop(pPg
1f350 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1f360 20 20 20 20 72 63 20 3d 20 72 65 61 64 44 62 50      rc = readDbP
1f370 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  age(pPg);.      
1f380 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1f390 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  K ){.        pPa
1f3a0 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70  ger->xReiniter(p
1f3b0 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Pg);.      }.   
1f3c0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
1f3d0 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 67 29  nrefNotNull(pPg)
1f3e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1f3f0 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61  * Normally, if a
1f400 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1f410 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6e 79  rolled back, any
1f420 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65   backup processe
1f430 73 20 61 72 65 0a 20 20 2a 2a 20 75 70 64 61 74  s are.  ** updat
1f440 65 64 20 61 73 20 64 61 74 61 20 69 73 20 63 6f  ed as data is co
1f450 70 69 65 64 20 6f 75 74 20 6f 66 20 74 68 65 20  pied out of the 
1f460 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1f470 20 61 6e 64 20 69 6e 74 6f 20 74 68 65 0a 20 20   and into the.  
1f480 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 69  ** database. Thi
1f490 73 20 69 73 20 6e 6f 74 20 67 65 6e 65 72 61 6c  s is not general
1f4a0 6c 79 20 70 6f 73 73 69 62 6c 65 20 77 69 74 68  ly possible with
1f4b0 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 2c   a WAL database,
1f4c0 20 61 73 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63   as.  ** rollbac
1f4d0 6b 20 69 6e 76 6f 6c 76 65 73 20 73 69 6d 70 6c  k involves simpl
1f4e0 79 20 74 72 75 6e 63 61 74 69 6e 67 20 74 68 65  y truncating the
1f4f0 20 6c 6f 67 20 66 69 6c 65 2e 20 54 68 65 72 65   log file. There
1f500 66 6f 72 65 2c 20 69 66 20 6f 6e 65 0a 20 20 2a  fore, if one.  *
1f510 2a 20 6f 72 20 6d 6f 72 65 20 66 72 61 6d 65 73  * or more frames
1f520 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
1f530 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
1f540 65 20 6c 6f 67 20 28 61 6e 64 20 74 68 65 72 65  e log (and there
1f550 66 6f 72 65 20 0a 20 20 2a 2a 20 61 6c 73 6f 20  fore .  ** also 
1f560 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20  copied into the 
1f570 62 61 63 6b 75 70 20 64 61 74 61 62 61 73 65 73  backup databases
1f580 29 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 69  ) as part of thi
1f590 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 20  s transaction,. 
1f5a0 20 2a 2a 20 74 68 65 20 62 61 63 6b 75 70 73 20   ** the backups 
1f5b0 6d 75 73 74 20 62 65 20 72 65 73 74 61 72 74 65  must be restarte
1f5c0 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  d..  */.  sqlite
1f5d0 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 70  3BackupRestart(p
1f5e0 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b  Pager->pBackup);
1f5f0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1f600 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1f610 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1f620 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 74 72  to rollback a tr
1f630 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 61 20 57  ansaction on a W
1f640 41 4c 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  AL database..*/.
1f650 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1f660 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 50 61 67 65  RollbackWal(Page
1f670 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
1f680 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1f690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f6a0 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
1f6b0 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 3b 20    PgHdr *pList; 
1f6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6d0 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 64 69 72    /* List of dir
1f6e0 74 79 20 70 61 67 65 73 20 74 6f 20 72 65 76 65  ty pages to reve
1f6f0 72 74 20 2a 2f 0a 0a 20 20 2f 2a 20 46 6f 72 20  rt */..  /* For 
1f700 61 6c 6c 20 70 61 67 65 73 20 69 6e 20 74 68 65  all pages in the
1f710 20 63 61 63 68 65 20 74 68 61 74 20 61 72 65 20   cache that are 
1f720 63 75 72 72 65 6e 74 6c 79 20 64 69 72 74 79 20  currently dirty 
1f730 6f 72 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a  or have already.
1f740 20 20 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65    ** been writte
1f750 6e 20 28 62 75 74 20 6e 6f 74 20 63 6f 6d 6d 69  n (but not commi
1f760 74 74 65 64 29 20 74 6f 20 74 68 65 20 6c 6f 67  tted) to the log
1f770 20 66 69 6c 65 2c 20 64 6f 20 6f 6e 65 20 6f 66   file, do one of
1f780 20 74 68 65 20 0a 20 20 2a 2a 20 66 6f 6c 6c 6f   the .  ** follo
1f790 77 69 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  wing:.  **.  ** 
1f7a0 20 20 2b 20 44 69 73 63 61 72 64 20 74 68 65 20    + Discard the 
1f7b0 63 61 63 68 65 64 20 70 61 67 65 20 28 69 66 20  cached page (if 
1f7c0 72 65 66 63 6f 75 6e 74 3d 3d 30 29 2c 20 6f 72  refcount==0), or
1f7d0 0a 20 20 2a 2a 20 20 20 2b 20 52 65 6c 6f 61 64  .  **   + Reload
1f7e0 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 66 72   page content fr
1f7f0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
1f800 28 69 66 20 72 65 66 63 6f 75 6e 74 3e 30 29 2e  (if refcount>0).
1f810 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
1f820 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  dbSize = pPager-
1f830 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72  >dbOrigSize;.  r
1f840 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 55 6e  c = sqlite3WalUn
1f850 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  do(pPager->pWal,
1f860 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61   pagerUndoCallba
1f870 63 6b 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67  ck, (void *)pPag
1f880 65 72 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73  er);.  pList = s
1f890 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74  qlite3PcacheDirt
1f8a0 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50  yList(pPager->pP
1f8b0 43 61 63 68 65 29 3b 0a 20 20 77 68 69 6c 65 28  Cache);.  while(
1f8c0 20 70 4c 69 73 74 20 26 26 20 72 63 3d 3d 53 51   pList && rc==SQ
1f8d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50  LITE_OK ){.    P
1f8e0 67 48 64 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c  gHdr *pNext = pL
1f8f0 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20  ist->pDirty;.   
1f900 20 72 63 20 3d 20 70 61 67 65 72 55 6e 64 6f 43   rc = pagerUndoC
1f910 61 6c 6c 62 61 63 6b 28 28 76 6f 69 64 20 2a 29  allback((void *)
1f920 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70  pPager, pList->p
1f930 67 6e 6f 29 3b 0a 20 20 20 20 70 4c 69 73 74 20  gno);.    pList 
1f940 3d 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20  = pNext;.  }..  
1f950 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1f960 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1f970 6e 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61  n is a wrapper a
1f980 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 57 61 6c  round sqlite3Wal
1f990 46 72 61 6d 65 73 28 29 2e 20 41 73 20 77 65 6c  Frames(). As wel
1f9a0 6c 20 61 73 20 6c 6f 67 67 69 6e 67 0a 2a 2a 20  l as logging.** 
1f9b0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
1f9c0 74 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65  the list of page
1f9d0 73 20 68 65 61 64 65 64 20 62 79 20 70 4c 69 73  s headed by pLis
1f9e0 74 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20  t (connected by 
1f9f0 70 44 69 72 74 79 29 2c 0a 2a 2a 20 74 68 69 73  pDirty),.** this
1fa00 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 74 69 66 69   function notifi
1fa10 65 73 20 61 6e 79 20 61 63 74 69 76 65 20 62 61  es any active ba
1fa20 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 74  ckup processes t
1fa30 68 61 74 20 74 68 65 20 70 61 67 65 73 20 68 61  hat the pages ha
1fa40 76 65 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 20 0a  ve.** changed. .
1fa50 2a 2a 0a 2a 2a 20 54 68 65 20 6c 69 73 74 20 6f  **.** The list o
1fa60 66 20 70 61 67 65 73 20 70 61 73 73 65 64 20 69  f pages passed i
1fa70 6e 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65  nto this routine
1fa80 20 69 73 20 61 6c 77 61 79 73 20 73 6f 72 74 65   is always sorte
1fa90 64 20 62 79 20 70 61 67 65 20 6e 75 6d 62 65 72  d by page number
1faa0 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 69 66 20 70  ..** Hence, if p
1fab0 61 67 65 20 31 20 61 70 70 65 61 72 73 20 61 6e  age 1 appears an
1fac0 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20 6c 69  ywhere on the li
1fad0 73 74 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 74  st, it will be t
1fae0 68 65 20 66 69 72 73 74 20 70 61 67 65 2e 0a 2a  he first page..*
1faf0 2f 20 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  / .static int pa
1fb00 67 65 72 57 61 6c 46 72 61 6d 65 73 28 0a 20 20  gerWalFrames(.  
1fb10 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
1fb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb30 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
1fb40 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c 69 73  */.  PgHdr *pLis
1fb50 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
1fb60 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
1fb70 66 72 61 6d 65 73 20 74 6f 20 6c 6f 67 20 2a 2f  frames to log */
1fb80 0a 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63 61 74  .  Pgno nTruncat
1fb90 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1fba0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73     /* Database s
1fbb0 69 7a 65 20 61 66 74 65 72 20 74 68 69 73 20 63  ize after this c
1fbc0 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ommit */.  int i
1fbd0 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 20  sCommit         
1fbe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1fbf0 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
1fc00 63 6f 6d 6d 69 74 20 2a 2f 0a 29 7b 0a 20 20 69  commit */.){.  i
1fc10 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1fc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fc30 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
1fc40 0a 20 20 69 6e 74 20 6e 4c 69 73 74 3b 20 20 20  .  int nList;   
1fc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc60 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1fc70 70 61 67 65 73 20 69 6e 20 70 4c 69 73 74 20 2a  pages in pList *
1fc80 2f 0a 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20  /.  PgHdr *p;   
1fc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fca0 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
1fcb0 6e 67 20 6f 76 65 72 20 70 61 67 65 73 20 2a 2f  ng over pages */
1fcc0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
1fcd0 65 72 2d 3e 70 57 61 6c 20 29 3b 0a 20 20 61 73  er->pWal );.  as
1fce0 73 65 72 74 28 20 70 4c 69 73 74 20 29 3b 0a 23  sert( pList );.#
1fcf0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1fd00 55 47 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74  UG.  /* Verify t
1fd10 68 61 74 20 74 68 65 20 70 61 67 65 20 6c 69 73  hat the page lis
1fd20 74 20 69 73 20 69 6e 20 61 63 63 65 6e 64 69 6e  t is in accendin
1fd30 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20 66 6f 72  g order */.  for
1fd40 28 70 3d 70 4c 69 73 74 3b 20 70 20 26 26 20 70  (p=pList; p && p
1fd50 2d 3e 70 44 69 72 74 79 3b 20 70 3d 70 2d 3e 70  ->pDirty; p=p->p
1fd60 44 69 72 74 79 29 7b 0a 20 20 20 20 61 73 73 65  Dirty){.    asse
1fd70 72 74 28 20 70 2d 3e 70 67 6e 6f 20 3c 20 70 2d  rt( p->pgno < p-
1fd80 3e 70 44 69 72 74 79 2d 3e 70 67 6e 6f 20 29 3b  >pDirty->pgno );
1fd90 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61  .  }.#endif..  a
1fda0 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 70 44  ssert( pList->pD
1fdb0 69 72 74 79 3d 3d 30 20 7c 7c 20 69 73 43 6f 6d  irty==0 || isCom
1fdc0 6d 69 74 20 29 3b 0a 20 20 69 66 28 20 69 73 43  mit );.  if( isC
1fdd0 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 2f 2a 20  ommit ){.    /* 
1fde0 49 66 20 61 20 57 41 4c 20 74 72 61 6e 73 61 63  If a WAL transac
1fdf0 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 6f  tion is being co
1fe00 6d 6d 69 74 74 65 64 2c 20 74 68 65 72 65 20 69  mmitted, there i
1fe10 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 77 72  s no point in wr
1fe20 69 74 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 79  iting.    ** any
1fe30 20 70 61 67 65 73 20 77 69 74 68 20 70 61 67 65   pages with page
1fe40 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72   numbers greater
1fe50 20 74 68 61 6e 20 6e 54 72 75 6e 63 61 74 65 20   than nTruncate 
1fe60 69 6e 74 6f 20 74 68 65 20 57 41 4c 20 66 69 6c  into the WAL fil
1fe70 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 79 20 77  e..    ** They w
1fe80 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 72 65 61  ill never be rea
1fe90 64 20 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2e  d by any client.
1fea0 20 53 6f 20 72 65 6d 6f 76 65 20 74 68 65 6d 20   So remove them 
1feb0 66 72 6f 6d 20 74 68 65 20 70 44 69 72 74 79 0a  from the pDirty.
1fec0 20 20 20 20 2a 2a 20 6c 69 73 74 20 68 65 72 65      ** list here
1fed0 2e 20 2a 2f 0a 20 20 20 20 50 67 48 64 72 20 2a  . */.    PgHdr *
1fee0 2a 70 70 4e 65 78 74 20 3d 20 26 70 4c 69 73 74  *ppNext = &pList
1fef0 3b 0a 20 20 20 20 6e 4c 69 73 74 20 3d 20 30 3b  ;.    nList = 0;
1ff00 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74  .    for(p=pList
1ff10 3b 20 28 2a 70 70 4e 65 78 74 20 3d 20 70 29 21  ; (*ppNext = p)!
1ff20 3d 30 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29  =0; p=p->pDirty)
1ff30 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  {.      if( p->p
1ff40 67 6e 6f 3c 3d 6e 54 72 75 6e 63 61 74 65 20 29  gno<=nTruncate )
1ff50 7b 0a 20 20 20 20 20 20 20 20 70 70 4e 65 78 74  {.        ppNext
1ff60 20 3d 20 26 70 2d 3e 70 44 69 72 74 79 3b 0a 20   = &p->pDirty;. 
1ff70 20 20 20 20 20 20 20 6e 4c 69 73 74 2b 2b 3b 0a         nList++;.
1ff80 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1ff90 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 20    assert( pList 
1ffa0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1ffb0 6e 4c 69 73 74 20 3d 20 31 3b 0a 20 20 7d 0a 20  nList = 1;.  }. 
1ffc0 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50   pPager->aStat[P
1ffd0 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45 5d  AGER_STAT_WRITE]
1ffe0 20 2b 3d 20 6e 4c 69 73 74 3b 0a 0a 20 20 69 66   += nList;..  if
1fff0 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31  ( pList->pgno==1
20000 20 29 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63   ) pager_write_c
20010 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 4c 69  hangecounter(pLi
20020 73 74 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  st);.  rc = sqli
20030 74 65 33 57 61 6c 46 72 61 6d 65 73 28 70 50 61  te3WalFrames(pPa
20040 67 65 72 2d 3e 70 57 61 6c 2c 20 0a 20 20 20 20  ger->pWal, .    
20050 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
20060 7a 65 2c 20 70 4c 69 73 74 2c 20 6e 54 72 75 6e  ze, pList, nTrun
20070 63 61 74 65 2c 20 69 73 43 6f 6d 6d 69 74 2c 20  cate, isCommit, 
20080 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46  pPager->walSyncF
20090 6c 61 67 73 0a 20 20 29 3b 0a 20 20 69 66 28 20  lags.  );.  if( 
200a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
200b0 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70   pPager->pBackup
200c0 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c   ){.    for(p=pL
200d0 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69  ist; p; p=p->pDi
200e0 72 74 79 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  rty){.      sqli
200f0 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28  te3BackupUpdate(
20100 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c  pPager->pBackup,
20110 20 70 2d 3e 70 67 6e 6f 2c 20 28 75 38 20 2a 29   p->pgno, (u8 *)
20120 70 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 7d  p->pData);.    }
20130 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  .  }..#ifdef SQL
20140 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
20150 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
20160 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74  3PcacheDirtyList
20170 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
20180 29 3b 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74  );.  for(p=pList
20190 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79  ; p; p=p->pDirty
201a0 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74  ){.    pager_set
201b0 5f 70 61 67 65 68 61 73 68 28 70 29 3b 0a 20 20  _pagehash(p);.  
201c0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  }.#endif..  retu
201d0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
201e0 42 65 67 69 6e 20 61 20 72 65 61 64 20 74 72 61  Begin a read tra
201f0 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  nsaction on the 
20200 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  WAL..**.** This 
20210 72 6f 75 74 69 6e 65 20 75 73 65 64 20 74 6f 20  routine used to 
20220 62 65 20 63 61 6c 6c 65 64 20 22 70 61 67 65 72  be called "pager
20230 4f 70 65 6e 53 6e 61 70 73 68 6f 74 28 29 22 20  OpenSnapshot()" 
20240 62 65 63 61 75 73 65 20 69 74 20 65 73 73 65 6e  because it essen
20250 74 69 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 73 20  tially.** makes 
20260 61 20 73 6e 61 70 73 68 6f 74 20 6f 66 20 74 68  a snapshot of th
20270 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
20280 65 20 63 75 72 72 65 6e 74 20 70 6f 69 6e 74 20  e current point 
20290 69 6e 20 74 69 6d 65 20 61 6e 64 20 70 72 65 73  in time and pres
202a0 65 72 76 65 73 0a 2a 2a 20 74 68 61 74 20 73 6e  erves.** that sn
202b0 61 70 73 68 6f 74 20 66 6f 72 20 75 73 65 20 62  apshot for use b
202c0 79 20 74 68 65 20 72 65 61 64 65 72 20 69 6e 20  y the reader in 
202d0 73 70 69 74 65 20 6f 66 20 63 6f 6e 63 75 72 72  spite of concurr
202e0 65 6e 74 6c 79 20 63 68 61 6e 67 65 73 20 62 79  ently changes by
202f0 0a 2a 2a 20 6f 74 68 65 72 20 77 72 69 74 65 72  .** other writer
20300 73 20 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 65  s or checkpointe
20310 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
20320 74 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64  t pagerBeginRead
20330 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65  Transaction(Page
20340 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
20350 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
20360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20370 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
20380 20 20 69 6e 74 20 63 68 61 6e 67 65 64 20 3d 20    int changed = 
20390 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
203a0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 61 63    /* True if cac
203b0 68 65 20 6d 75 73 74 20 62 65 20 72 65 73 65 74  he must be reset
203c0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
203d0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
203e0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
203f0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
20400 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50  PAGER_OPEN || pP
20410 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
20420 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 0a 20  GER_READER );.. 
20430 20 2f 2a 20 73 71 6c 69 74 65 33 57 61 6c 45 6e   /* sqlite3WalEn
20440 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  dReadTransaction
20450 28 29 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65  () was not calle
20460 64 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f  d for the previo
20470 75 73 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  us.  ** transact
20480 69 6f 6e 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  ion in locking_m
20490 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 2e 20 20  ode=EXCLUSIVE.  
204a0 53 6f 20 63 61 6c 6c 20 69 74 20 6e 6f 77 2e 20  So call it now. 
204b0 20 49 66 20 77 65 0a 20 20 2a 2a 20 61 72 65 20   If we.  ** are 
204c0 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  in locking_mode=
204d0 4e 4f 52 4d 41 4c 20 61 6e 64 20 45 6e 64 52 65  NORMAL and EndRe
204e0 61 64 28 29 20 77 61 73 20 70 72 65 76 69 6f 75  ad() was previou
204f0 73 6c 79 20 63 61 6c 6c 65 64 2c 0a 20 20 2a 2a  sly called,.  **
20500 20 74 68 65 20 64 75 70 6c 69 63 61 74 65 20 63   the duplicate c
20510 61 6c 6c 20 69 73 20 68 61 72 6d 6c 65 73 73 2e  all is harmless.
20520 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57  .  */.  sqlite3W
20530 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63  alEndReadTransac
20540 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61  tion(pPager->pWa
20550 6c 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  l);..  rc = sqli
20560 74 65 33 57 61 6c 42 65 67 69 6e 52 65 61 64 54  te3WalBeginReadT
20570 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
20580 72 2d 3e 70 57 61 6c 2c 20 26 63 68 61 6e 67 65  r->pWal, &change
20590 64 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  d);.  if( rc!=SQ
205a0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 63 68 61 6e 67  LITE_OK || chang
205b0 65 64 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f  ed ){.    pager_
205c0 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
205d0 20 20 20 69 66 28 20 55 53 45 46 45 54 43 48 28     if( USEFETCH(
205e0 70 50 61 67 65 72 29 20 29 20 73 71 6c 69 74 65  pPager) ) sqlite
205f0 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65  3OsUnfetch(pPage
20600 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20  r->fd, 0, 0);.  
20610 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
20620 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
20630 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
20640 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72 74 20   called as part 
20650 6f 66 20 74 68 65 20 74 72 61 6e 73 69 74 69 6f  of the transitio
20660 6e 20 66 72 6f 6d 20 50 41 47 45 52 5f 4f 50 45  n from PAGER_OPE
20670 4e 0a 2a 2a 20 74 6f 20 50 41 47 45 52 5f 52 45  N.** to PAGER_RE
20680 41 44 45 52 20 73 74 61 74 65 20 74 6f 20 64 65  ADER state to de
20690 74 65 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65  termine the size
206a0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
206b0 20 66 69 6c 65 0a 2a 2a 20 69 6e 20 70 61 67 65   file.** in page
206c0 73 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65 20  s (assuming the 
206d0 70 61 67 65 20 73 69 7a 65 20 63 75 72 72 65 6e  page size curren
206e0 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 50 61  tly stored in Pa
206f0 67 65 72 2e 70 61 67 65 53 69 7a 65 29 2e 0a 2a  ger.pageSize)..*
20700 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72  *.** If no error
20710 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f   occurs, SQLITE_
20720 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  OK is returned a
20730 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  nd the size of t
20740 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69  he database.** i
20750 6e 20 70 61 67 65 73 20 69 73 20 73 74 6f 72 65  n pages is store
20760 64 20 69 6e 20 2a 70 6e 50 61 67 65 2e 20 4f 74  d in *pnPage. Ot
20770 68 65 72 77 69 73 65 2c 20 61 6e 20 65 72 72 6f  herwise, an erro
20780 72 20 63 6f 64 65 20 28 70 65 72 68 61 70 73 0a  r code (perhaps.
20790 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  ** SQLITE_IOERR_
207a0 46 53 54 41 54 29 20 69 73 20 72 65 74 75 72 6e  FSTAT) is return
207b0 65 64 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 69  ed and *pnPage i
207c0 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69 65  s left unmodifie
207d0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
207e0 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
207f0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
20800 67 6e 6f 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20  gno *pnPage){.  
20810 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20  Pgno nPage;     
20820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20830 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75  /* Value to retu
20840 72 6e 20 76 69 61 20 2a 70 6e 50 61 67 65 20 2a  rn via *pnPage *
20850 2f 0a 0a 20 20 2f 2a 20 51 75 65 72 79 20 74 68  /..  /* Query th
20860 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d  e WAL sub-system
20870 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
20880 65 20 73 69 7a 65 2e 20 54 68 65 20 57 61 6c 44  e size. The WalD
20890 62 73 69 7a 65 28 29 0a 20 20 2a 2a 20 66 75 6e  bsize().  ** fun
208a0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 7a 65  ction returns ze
208b0 72 6f 20 69 66 20 74 68 65 20 57 41 4c 20 69 73  ro if the WAL is
208c0 20 6e 6f 74 20 6f 70 65 6e 20 28 69 2e 65 2e 20   not open (i.e. 
208d0 50 61 67 65 72 2e 70 57 61 6c 3d 3d 30 29 2c 20  Pager.pWal==0), 
208e0 6f 72 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 64  or.  ** if the d
208f0 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 20  atabase size is 
20900 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 54  not available. T
20910 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
20920 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 76 61   is not.  ** ava
20930 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20  ilable from the 
20940 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 20 69  WAL sub-system i
20950 66 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 69  f the log file i
20960 73 20 65 6d 70 74 79 20 6f 72 0a 20 20 2a 2a 20  s empty or.  ** 
20970 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 76 61 6c 69  contains no vali
20980 64 20 63 6f 6d 6d 69 74 74 65 64 20 74 72 61 6e  d committed tran
20990 73 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  sactions..  */. 
209a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
209b0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
209c0 50 45 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  PEN );.  assert(
209d0 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d   pPager->eLock>=
209e0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
209f0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
20a00 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20  pPager->fd) );. 
20a10 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
20a20 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29 3b 0a  >tempFile==0 );.
20a30 20 20 6e 50 61 67 65 20 3d 20 73 71 6c 69 74 65    nPage = sqlite
20a40 33 57 61 6c 44 62 73 69 7a 65 28 70 50 61 67 65  3WalDbsize(pPage
20a50 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 2f 2a 20  r->pWal);..  /* 
20a60 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  If the number of
20a70 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
20a80 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61 76  tabase is not av
20a90 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68 65  ailable from the
20aa0 0a 20 20 2a 2a 20 57 41 4c 20 73 75 62 2d 73 79  .  ** WAL sub-sy
20ab0 73 74 65 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20  stem, determine 
20ac0 74 68 65 20 70 61 67 65 20 63 6f 75 6e 74 20 62  the page count b
20ad0 61 73 65 64 20 6f 6e 20 74 68 65 20 73 69 7a 65  ased on the size
20ae0 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 64 61 74   of.  ** the dat
20af0 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
20b00 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
20b10 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
20b20 20 6e 6f 74 20 61 6e 0a 20 20 2a 2a 20 69 6e 74   not an.  ** int
20b30 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
20b40 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 2c 20   the page-size, 
20b50 72 6f 75 6e 64 20 75 70 20 74 68 65 20 72 65 73  round up the res
20b60 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ult..  */.  if( 
20b70 6e 50 61 67 65 3d 3d 30 20 26 26 20 41 4c 57 41  nPage==0 && ALWA
20b80 59 53 28 69 73 4f 70 65 6e 28 70 50 61 67 65 72  YS(isOpen(pPager
20b90 2d 3e 66 64 29 29 20 29 7b 0a 20 20 20 20 69 36  ->fd)) ){.    i6
20ba0 34 20 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20  4 n = 0;        
20bb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
20bc0 69 7a 65 20 6f 66 20 64 62 20 66 69 6c 65 20 69  ize of db file i
20bd0 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 69  n bytes */.    i
20be0 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  nt rc = sqlite3O
20bf0 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
20c00 2d 3e 66 64 2c 20 26 6e 29 3b 0a 20 20 20 20 69  ->fd, &n);.    i
20c10 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
20c20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
20c30 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e   rc;.    }.    n
20c40 50 61 67 65 20 3d 20 28 50 67 6e 6f 29 28 28 6e  Page = (Pgno)((n
20c50 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  +pPager->pageSiz
20c60 65 2d 31 29 20 2f 20 70 50 61 67 65 72 2d 3e 70  e-1) / pPager->p
20c70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20  ageSize);.  }.. 
20c80 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 72 65   /* If the curre
20c90 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  nt number of pag
20ca0 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 69  es in the file i
20cb0 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
20cc0 68 65 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72  he.  ** configur
20cd0 65 64 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 72  ed maximum pager
20ce0 20 6e 75 6d 62 65 72 2c 20 69 6e 63 72 65 61 73   number, increas
20cf0 65 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 6c 69  e the allowed li
20d00 6d 69 74 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74  mit so.  ** that
20d10 20 74 68 65 20 66 69 6c 65 20 63 61 6e 20 62 65   the file can be
20d20 20 72 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69 66   read..  */.  if
20d30 28 20 6e 50 61 67 65 3e 70 50 61 67 65 72 2d 3e  ( nPage>pPager->
20d40 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50  mxPgno ){.    pP
20d50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28  ager->mxPgno = (
20d60 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 20 20 7d 0a  Pgno)nPage;.  }.
20d70 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e 50 61  .  *pnPage = nPa
20d80 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ge;.  return SQL
20d90 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64  ITE_OK;.}..#ifnd
20da0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
20db0 41 4c 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69  AL./*.** Check i
20dc0 66 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65  f the *-wal file
20dd0 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64   that correspond
20de0 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
20df0 65 20 6f 70 65 6e 65 64 20 62 79 20 70 50 61 67  e opened by pPag
20e00 65 72 0a 2a 2a 20 65 78 69 73 74 73 20 69 66 20  er.** exists if 
20e10 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
20e20 6e 6f 74 20 65 6d 70 79 2c 20 6f 72 20 76 65 72  not empy, or ver
20e30 69 66 79 20 74 68 61 74 20 74 68 65 20 2a 2d 77  ify that the *-w
20e40 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20  al file does.** 
20e50 6e 6f 74 20 65 78 69 73 74 20 28 62 79 20 64 65  not exist (by de
20e60 6c 65 74 69 6e 67 20 69 74 29 20 69 66 20 74 68  leting it) if th
20e70 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
20e80 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20  is empty..**.** 
20e90 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
20ea0 69 73 20 6e 6f 74 20 65 6d 70 74 79 20 61 6e 64  is not empty and
20eb0 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20   the *-wal file 
20ec0 65 78 69 73 74 73 2c 20 6f 70 65 6e 20 74 68 65  exists, open the
20ed0 20 70 61 67 65 72 0a 2a 2a 20 69 6e 20 57 41 4c   pager.** in WAL
20ee0 20 6d 6f 64 65 2e 20 20 49 66 20 74 68 65 20 64   mode.  If the d
20ef0 61 74 61 62 61 73 65 20 69 73 20 65 6d 70 74 79  atabase is empty
20f00 20 6f 72 20 69 66 20 6e 6f 20 2a 2d 77 61 6c 20   or if no *-wal 
20f10 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 0a  file exists and.
20f20 2a 2a 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f  ** if no error o
20f30 63 63 75 72 73 2c 20 6d 61 6b 65 20 73 75 72 65  ccurs, make sure
20f40 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f   Pager.journalMo
20f50 64 65 20 69 73 20 6e 6f 74 20 73 65 74 20 74 6f  de is not set to
20f60 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  .** PAGER_JOURNA
20f70 4c 4d 4f 44 45 5f 57 41 4c 2e 0a 2a 2a 0a 2a 2a  LMODE_WAL..**.**
20f80 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
20f90 4b 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  K or an error co
20fa0 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  de..**.** The ca
20fb0 6c 6c 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61  ller must hold a
20fc0 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20   SHARED lock on 
20fd0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
20fe0 65 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 0a 2a  e to call this.*
20ff0 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 42 65 63 61  * function. Beca
21000 75 73 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45  use an EXCLUSIVE
21010 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 62 20   lock on the db 
21020 66 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64  file is required
21030 20 74 6f 20 64 65 6c 65 74 65 20 0a 2a 2a 20 61   to delete .** a
21040 20 57 41 4c 20 6f 6e 20 61 20 6e 6f 6e 65 2d 65   WAL on a none-e
21050 6d 70 74 79 20 64 61 74 61 62 61 73 65 2c 20 74  mpty database, t
21060 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 65 72  his ensures ther
21070 65 20 69 73 20 6e 6f 20 72 61 63 65 20 63 6f 6e  e is no race con
21080 64 69 74 69 6f 6e 20 0a 2a 2a 20 62 65 74 77 65  dition .** betwe
21090 65 6e 20 74 68 65 20 78 41 63 63 65 73 73 28 29  en the xAccess()
210a0 20 62 65 6c 6f 77 20 61 6e 64 20 61 6e 20 78 44   below and an xD
210b0 65 6c 65 74 65 28 29 20 62 65 69 6e 67 20 65 78  elete() being ex
210c0 65 63 75 74 65 64 20 62 79 20 73 6f 6d 65 20 0a  ecuted by some .
210d0 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ** other connect
210e0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
210f0 6e 74 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49  nt pagerOpenWalI
21100 66 50 72 65 73 65 6e 74 28 50 61 67 65 72 20 2a  fPresent(Pager *
21110 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
21120 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
21130 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
21140 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
21150 50 45 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  PEN );.  assert(
21160 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d   pPager->eLock>=
21170 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a  SHARED_LOCK );..
21180 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74    if( !pPager->t
21190 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69  empFile ){.    i
211a0 6e 74 20 69 73 57 61 6c 3b 20 20 20 20 20 20 20  nt isWal;       
211b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
211c0 54 72 75 65 20 69 66 20 57 41 4c 20 66 69 6c 65  True if WAL file
211d0 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 72   exists */.    r
211e0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
211f0 65 73 73 28 0a 20 20 20 20 20 20 20 20 70 50 61  ess(.        pPa
21200 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65  ger->pVfs, pPage
21210 72 2d 3e 7a 57 61 6c 2c 20 53 51 4c 49 54 45 5f  r->zWal, SQLITE_
21220 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
21230 69 73 57 61 6c 0a 20 20 20 20 29 3b 0a 20 20 20  isWal.    );.   
21240 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
21250 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
21260 69 73 57 61 6c 20 29 7b 0a 20 20 20 20 20 20 20  isWal ){.       
21270 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20   Pgno nPage;    
21280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21290 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 64 61  * Size of the da
212a0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a  tabase file */..
212b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
212c0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
212d0 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20  er, &nPage);.   
212e0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
212f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
21300 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b   if( nPage==0 ){
21310 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
21320 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
21330 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50  pPager->pVfs, pP
21340 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 30 29 3b 0a  ager->zWal, 0);.
21350 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
21360 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
21370 65 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  e( sqlite3Pcache
21380 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
21390 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b  ->pPCache)==0 );
213a0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
213b0 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
213c0 57 61 6c 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  Wal(pPager, 0);.
213d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
213e0 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72  }else if( pPager
213f0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
21400 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
21410 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  _WAL ){.        
21420 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
21430 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52  ode = PAGER_JOUR
21440 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 3b 0a  NALMODE_DELETE;.
21450 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
21460 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
21470 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50  .#endif../*.** P
21480 6c 61 79 62 61 63 6b 20 73 61 76 65 70 6f 69 6e  layback savepoin
21490 74 20 70 53 61 76 65 70 6f 69 6e 74 2e 20 4f 72  t pSavepoint. Or
214a0 2c 20 69 66 20 70 53 61 76 65 70 6f 69 6e 74 3d  , if pSavepoint=
214b0 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 6c 61 79  =NULL, then play
214c0 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65 6e 74 69  back.** the enti
214d0 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  re master journa
214e0 6c 20 66 69 6c 65 2e 20 54 68 65 20 63 61 73 65  l file. The case
214f0 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c   pSavepoint==NUL
21500 4c 20 6f 63 63 75 72 73 20 77 68 65 6e 20 0a 2a  L occurs when .*
21510 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20  * a ROLLBACK TO 
21520 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76 6f 6b  command is invok
21530 65 64 20 6f 6e 20 61 20 53 41 56 45 50 4f 49 4e  ed on a SAVEPOIN
21540 54 20 74 68 61 74 20 69 73 20 61 20 74 72 61 6e  T that is a tran
21550 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73 61 76 65  saction .** save
21560 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  point..**.** Whe
21570 6e 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20  n pSavepoint is 
21580 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e  not NULL (meanin
21590 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73 61 63 74  g a non-transact
215a0 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73  ion savepoint is
215b0 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f 6c 6c 65   .** being rolle
215c0 64 20 62 61 63 6b 29 2c 20 74 68 65 6e 20 74 68  d back), then th
215d0 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73 69  e rollback consi
215e0 73 74 73 20 6f 66 20 75 70 20 74 6f 20 74 68 72  sts of up to thr
215f0 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a 20 70 65  ee stages,.** pe
21600 72 66 6f 72 6d 65 64 20 69 6e 20 74 68 65 20 6f  rformed in the o
21610 72 64 65 72 20 73 70 65 63 69 66 69 65 64 3a 0a  rder specified:.
21620 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20  **.**   * Pages 
21630 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20  are played back 
21640 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
21650 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61  urnal starting a
21660 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 6f 66  t byte.**     of
21670 66 73 65 74 20 50 61 67 65 72 53 61 76 65 70 6f  fset PagerSavepo
21680 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20  int.iOffset and 
21690 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 0a 2a  continuing to .*
216a0 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70  *     PagerSavep
216b0 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 2c  oint.iHdrOffset,
216c0 20 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f   or to the end o
216d0 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
216e0 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 69  al.**     file i
216f0 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  f PagerSavepoint
21700 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20 7a  .iHdrOffset is z
21710 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49  ero..**.**   * I
21720 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  f PagerSavepoint
21730 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20 6e  .iHdrOffset is n
21740 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 70 61  ot zero, then pa
21750 67 65 73 20 61 72 65 20 70 6c 61 79 65 64 0a 2a  ges are played.*
21760 2a 20 20 20 20 20 62 61 63 6b 20 73 74 61 72 74  *     back start
21770 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ing from the jou
21780 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6d 6d 65  rnal header imme
21790 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
217a0 67 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53  g .**     PagerS
217b0 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
217c0 73 65 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  set to the end o
217d0 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
217e0 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20  al file..**.**  
217f0 20 2a 20 50 61 67 65 73 20 61 72 65 20 74 68 65   * Pages are the
21800 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72  n played back fr
21810 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
21820 61 6c 20 66 69 6c 65 2c 20 73 74 61 72 74 69 6e  al file, startin
21830 67 0a 2a 2a 20 20 20 20 20 77 69 74 68 20 74 68  g.**     with th
21840 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
21850 2e 69 53 75 62 52 65 63 20 61 6e 64 20 63 6f 6e  .iSubRec and con
21860 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 65  tinuing to the e
21870 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20 74 68 65  nd of.**     the
21880 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
21890 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f 75 74 20  *.** Throughout 
218a0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 70 72 6f  the rollback pro
218b0 63 65 73 73 2c 20 65 61 63 68 20 74 69 6d 65 20  cess, each time 
218c0 61 20 70 61 67 65 20 69 73 20 72 6f 6c 6c 65 64  a page is rolled
218d0 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f   back, the.** co
218e0 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
218f0 69 73 20 73 65 74 20 69 6e 20 61 20 62 69 74 76  is set in a bitv
21900 65 63 20 73 74 72 75 63 74 75 72 65 20 28 76 61  ec structure (va
21910 72 69 61 62 6c 65 20 70 44 6f 6e 65 20 69 6e 20  riable pDone in 
21920 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  the.** implement
21930 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e 20 54 68  ation below). Th
21940 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 65 6e  is is used to en
21950 73 75 72 65 20 74 68 61 74 20 61 20 70 61 67 65  sure that a page
21960 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c   is only.** roll
21970 65 64 20 62 61 63 6b 20 74 68 65 20 66 69 72 73  ed back the firs
21980 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63  t time it is enc
21990 6f 75 6e 74 65 72 65 64 20 69 6e 20 65 69 74 68  ountered in eith
219a0 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  er journal..**.*
219b0 2a 20 49 66 20 70 53 61 76 65 70 6f 69 6e 74 20  * If pSavepoint 
219c0 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 61  is NULL, then pa
219d0 67 65 73 20 61 72 65 20 6f 6e 6c 79 20 70 6c 61  ges are only pla
219e0 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  yed back from th
219f0 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61  e main.** journa
21a00 6c 20 66 69 6c 65 2e 20 54 68 65 72 65 20 69 73  l file. There is
21a10 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20 62   no need for a b
21a20 69 74 76 65 63 20 69 6e 20 74 68 69 73 20 63 61  itvec in this ca
21a30 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74  se..**.** In eit
21a40 68 65 72 20 63 61 73 65 2c 20 62 65 66 6f 72 65  her case, before
21a50 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d 6d 65 6e   playback commen
21a60 63 65 73 20 74 68 65 20 50 61 67 65 72 2e 64 62  ces the Pager.db
21a70 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a  Size variable.**
21a80 20 69 73 20 72 65 73 65 74 20 74 6f 20 74 68 65   is reset to the
21a90 20 76 61 6c 75 65 20 74 68 61 74 20 69 74 20 68   value that it h
21aa0 65 6c 64 20 61 74 20 74 68 65 20 73 74 61 72 74  eld at the start
21ab0 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e   of the savepoin
21ac0 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61 6e 73 61  t .** (or transa
21ad0 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61 67 65 20  ction). No page 
21ae0 77 69 74 68 20 61 20 70 61 67 65 2d 6e 75 6d 62  with a page-numb
21af0 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
21b00 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69 73  this value.** is
21b10 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 49 66   played back. If
21b20 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75 6e 74 65   one is encounte
21b30 72 65 64 20 69 74 20 69 73 20 73 69 6d 70 6c 79  red it is simply
21b40 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61   skipped..*/.sta
21b50 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 6c 61  tic int pagerPla
21b60 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 50  ybackSavepoint(P
21b70 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 61  ager *pPager, Pa
21b80 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 53  gerSavepoint *pS
21b90 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 36 34  avepoint){.  i64
21ba0 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
21bb0 20 20 20 20 20 20 2f 2a 20 45 66 66 65 63 74 69        /* Effecti
21bc0 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d  ve size of the m
21bd0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ain journal */. 
21be0 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20   i64 iHdrOff;   
21bf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
21c00 20 6f 66 20 66 69 72 73 74 20 73 65 67 6d 65 6e   of first segmen
21c10 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61  t of main-journa
21c20 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69  l records */.  i
21c30 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
21c40 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72  K;      /* Retur
21c50 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69 74 76  n code */.  Bitv
21c60 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b 20 20  ec *pDone = 0;  
21c70 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20 74       /* Bitvec t
21c80 6f 20 65 6e 73 75 72 65 20 70 61 67 65 73 20 70  o ensure pages p
21c90 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c 79 20  layed back only 
21ca0 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  once */..  asser
21cb0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
21cc0 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29  e!=PAGER_ERROR )
21cd0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
21ce0 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
21cf0 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
21d00 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
21d10 65 20 61 20 62 69 74 76 65 63 20 74 6f 20 75 73  e a bitvec to us
21d20 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73  e to store the s
21d30 65 74 20 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c  et of pages roll
21d40 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28  ed back */.  if(
21d50 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20   pSavepoint ){. 
21d60 20 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74     pDone = sqlit
21d70 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70  e3BitvecCreate(p
21d80 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67  Savepoint->nOrig
21d90 29 3b 0a 20 20 20 20 69 66 28 20 21 70 44 6f 6e  );.    if( !pDon
21da0 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
21db0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
21dc0 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  KPT;.    }.  }..
21dd0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64 61 74    /* Set the dat
21de0 61 62 61 73 65 20 73 69 7a 65 20 62 61 63 6b 20  abase size back 
21df0 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74 20  to the value it 
21e00 77 61 73 20 62 65 66 6f 72 65 20 74 68 65 20 73  was before the s
21e10 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 62  avepoint .  ** b
21e20 65 69 6e 67 20 72 65 76 65 72 74 65 64 20 77 61  eing reverted wa
21e30 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20  s opened..  */. 
21e40 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
21e50 3d 20 70 53 61 76 65 70 6f 69 6e 74 20 3f 20 70  = pSavepoint ? p
21e60 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67  Savepoint->nOrig
21e70 20 3a 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69   : pPager->dbOri
21e80 67 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d  gSize;.  pPager-
21e90 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
21ea0 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
21eb0 69 6c 65 3b 0a 0a 20 20 69 66 28 20 21 70 53 61  ile;..  if( !pSa
21ec0 76 65 70 6f 69 6e 74 20 26 26 20 70 61 67 65 72  vepoint && pager
21ed0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
21ee0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61 67  {.    return pag
21ef0 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 70 50  erRollbackWal(pP
21f00 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ager);.  }..  /*
21f10 20 55 73 65 20 70 50 61 67 65 72 2d 3e 6a 6f 75   Use pPager->jou
21f20 72 6e 61 6c 4f 66 66 20 61 73 20 74 68 65 20 65  rnalOff as the e
21f30 66 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66  ffective size of
21f40 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
21f50 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e  ck.  ** journal.
21f60 20 20 54 68 65 20 61 63 74 75 61 6c 20 66 69 6c    The actual fil
21f70 65 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65  e might be large
21f80 72 20 74 68 61 6e 20 74 68 69 73 20 69 6e 0a 20  r than this in. 
21f90 20 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41   ** PAGER_JOURNA
21fa0 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 6f  LMODE_TRUNCATE o
21fb0 72 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  r PAGER_JOURNALM
21fc0 4f 44 45 5f 50 45 52 53 49 53 54 2e 20 20 42 75  ODE_PERSIST.  Bu
21fd0 74 20 61 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20  t anything.  ** 
21fe0 70 61 73 74 20 70 50 61 67 65 72 2d 3e 6a 6f 75  past pPager->jou
21ff0 72 6e 61 6c 4f 66 66 20 69 73 20 6f 66 66 2d 6c  rnalOff is off-l
22000 69 6d 69 74 73 20 74 6f 20 75 73 2e 0a 20 20 2a  imits to us..  *
22010 2f 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65 72  /.  szJ = pPager
22020 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
22030 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65  assert( pagerUse
22040 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 7c  Wal(pPager)==0 |
22050 7c 20 73 7a 4a 3d 3d 30 20 29 3b 0a 0a 20 20 2f  | szJ==0 );..  /
22060 2a 20 42 65 67 69 6e 20 62 79 20 72 6f 6c 6c 69  * Begin by rolli
22070 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20  ng back records 
22080 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
22090 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61  urnal starting a
220a0 74 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76 65  t.  ** PagerSave
220b0 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e  point.iOffset an
220c0 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20  d continuing to 
220d0 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c  the next journal
220e0 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 54 68   header..  ** Th
220f0 65 72 65 20 6d 69 67 68 74 20 62 65 20 72 65 63  ere might be rec
22100 6f 72 64 73 20 69 6e 20 74 68 65 20 6d 61 69 6e  ords in the main
22110 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 68 61   journal that ha
22120 76 65 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72  ve a page number
22130 0a 20 20 2a 2a 20 67 72 65 61 74 65 72 20 74 68  .  ** greater th
22140 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  an the current d
22150 61 74 61 62 61 73 65 20 73 69 7a 65 20 28 70 50  atabase size (pP
22160 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 20 62 75  ager->dbSize) bu
22170 74 20 74 68 6f 73 65 0a 20 20 2a 2a 20 77 69 6c  t those.  ** wil
22180 6c 20 62 65 20 73 6b 69 70 70 65 64 20 61 75 74  l be skipped aut
22190 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 20 50 61 67  omatically.  Pag
221a0 65 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  es are added to 
221b0 70 44 6f 6e 65 20 61 73 20 74 68 65 79 0a 20 20  pDone as they.  
221c0 2a 2a 20 61 72 65 20 70 6c 61 79 65 64 20 62 61  ** are played ba
221d0 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ck..  */.  if( p
221e0 53 61 76 65 70 6f 69 6e 74 20 26 26 20 21 70 61  Savepoint && !pa
221f0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
22200 29 20 29 7b 0a 20 20 20 20 69 48 64 72 4f 66 66  ) ){.    iHdrOff
22210 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69   = pSavepoint->i
22220 48 64 72 4f 66 66 73 65 74 20 3f 20 70 53 61 76  HdrOffset ? pSav
22230 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73  epoint->iHdrOffs
22240 65 74 20 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50  et : szJ;.    pP
22250 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
22260 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69   = pSavepoint->i
22270 4f 66 66 73 65 74 3b 0a 20 20 20 20 77 68 69 6c  Offset;.    whil
22280 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
22290 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
222a0 6e 61 6c 4f 66 66 3c 69 48 64 72 4f 66 66 20 29  nalOff<iHdrOff )
222b0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
222c0 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
222d0 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50  page(pPager, &pP
222e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
222f0 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a  , pDone, 1, 1);.
22300 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
22310 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
22320 45 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  E );.  }else{.  
22330 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
22340 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  lOff = 0;.  }.. 
22350 20 2f 2a 20 43 6f 6e 74 69 6e 75 65 20 72 6f 6c   /* Continue rol
22360 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64  ling back record
22370 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69  s out of the mai
22380 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69  n journal starti
22390 6e 67 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 66  ng at.  ** the f
223a0 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
223b0 64 65 72 20 73 65 65 6e 20 61 6e 64 20 63 6f 6e  der seen and con
223c0 74 69 6e 75 69 6e 67 20 75 6e 74 69 6c 20 74 68  tinuing until th
223d0 65 20 65 66 66 65 63 74 69 76 65 20 65 6e 64 0a  e effective end.
223e0 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 61 69 6e    ** of the main
223f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
22400 43 6f 6e 74 69 6e 75 65 20 74 6f 20 73 6b 69 70  Continue to skip
22410 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61   out-of-range pa
22420 67 65 73 20 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e  ges and.  ** con
22430 74 69 6e 75 65 20 61 64 64 69 6e 67 20 70 61 67  tinue adding pag
22440 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  es rolled back t
22450 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20  o pDone..  */.  
22460 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
22470 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
22480 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29  journalOff<szJ )
22490 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20 20  {.    u32 ii;   
224a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
224b0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
224c0 75 33 32 20 6e 4a 52 65 63 20 3d 20 30 3b 20 20  u32 nJRec = 0;  
224d0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
224e0 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64 73 20  Journal Records 
224f0 2a 2f 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79  */.    u32 dummy
22500 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a  ;.    rc = readJ
22510 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
22520 2c 20 30 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63  , 0, szJ, &nJRec
22530 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 61  , &dummy);.    a
22540 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
22550 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20 20 20 2f  E_DONE );..    /
22560 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 22 70 50  *.    ** The "pP
22570 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
22580 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
22590 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d  pPager)==pPager-
225a0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22 0a 20 20 20  >journalOff".   
225b0 20 2a 2a 20 74 65 73 74 20 69 73 20 72 65 6c 61   ** test is rela
225c0 74 65 64 20 74 6f 20 74 69 63 6b 65 74 20 23 32  ted to ticket #2
225d0 35 36 35 2e 20 20 53 65 65 20 74 68 65 20 64 69  565.  See the di
225e0 73 63 75 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a  scussion in the.
225f0 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61      ** pager_pla
22600 79 62 61 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e  yback() function
22610 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
22620 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20  information..   
22630 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4a 52 65   */.    if( nJRe
22640 63 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70 50  c==0 .     && pP
22650 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
22660 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
22670 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d  pPager)==pPager-
22680 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20  >journalOff.    
22690 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d  ){.      nJRec =
226a0 20 28 75 33 32 29 28 28 73 7a 4a 20 2d 20 70 50   (u32)((szJ - pP
226b0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
226c0 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  )/JOURNAL_PG_SZ(
226d0 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a  pPager));.    }.
226e0 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 72 63      for(ii=0; rc
226f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
22700 69 3c 6e 4a 52 65 63 20 26 26 20 70 50 61 67 65  i<nJRec && pPage
22710 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a  r->journalOff<sz
22720 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  J; ii++){.      
22730 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
22740 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
22750 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f  ger, &pPager->jo
22760 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c  urnalOff, pDone,
22770 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20   1, 1);.    }.  
22780 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
22790 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d  LITE_DONE );.  }
227a0 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
227b0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
227c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 3d  er->journalOff>=
227d0 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e  szJ );..  /* Fin
227e0 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61 63 6b 20  ally,  rollback 
227f0 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20 73  pages from the s
22800 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20 50 61 67  ub-journal.  Pag
22810 65 20 74 68 61 74 20 77 65 72 65 0a 20 20 2a 2a  e that were.  **
22820 20 70 72 65 76 69 6f 75 73 6c 79 20 72 6f 6c 6c   previously roll
22830 65 64 20 62 61 63 6b 20 6f 75 74 20 6f 66 20 74  ed back out of t
22840 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
22850 28 61 6e 64 20 61 72 65 20 68 65 6e 63 65 20 69  (and are hence i
22860 6e 20 70 44 6f 6e 65 29 0a 20 20 2a 2a 20 77 69  n pDone).  ** wi
22870 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 2e 20 20  ll be skipped.  
22880 4f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67  Out-of-range pag
22890 65 73 20 61 72 65 20 61 6c 73 6f 20 73 6b 69 70  es are also skip
228a0 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ped..  */.  if( 
228b0 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20  pSavepoint ){.  
228c0 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20 20    u32 ii;       
228d0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
228e0 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 36 34 20  nter */.    i64 
228f0 6f 66 66 73 65 74 20 3d 20 28 69 36 34 29 70 53  offset = (i64)pS
22900 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65  avepoint->iSubRe
22910 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67  c*(4+pPager->pag
22920 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20 69 66 28  eSize);..    if(
22930 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
22940 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63  ger) ){.      rc
22950 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 53 61 76   = sqlite3WalSav
22960 65 70 6f 69 6e 74 55 6e 64 6f 28 70 50 61 67 65  epointUndo(pPage
22970 72 2d 3e 70 57 61 6c 2c 20 70 53 61 76 65 70 6f  r->pWal, pSavepo
22980 69 6e 74 2d 3e 61 57 61 6c 44 61 74 61 29 3b 0a  int->aWalData);.
22990 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69      }.    for(ii
229a0 3d 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75  =pSavepoint->iSu
229b0 62 52 65 63 3b 20 72 63 3d 3d 53 51 4c 49 54 45  bRec; rc==SQLITE
229c0 5f 4f 4b 20 26 26 20 69 69 3c 70 50 61 67 65 72  _OK && ii<pPager
229d0 2d 3e 6e 53 75 62 52 65 63 3b 20 69 69 2b 2b 29  ->nSubRec; ii++)
229e0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
229f0 6f 66 66 73 65 74 3d 3d 28 69 36 34 29 69 69 2a  offset==(i64)ii*
22a00 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  (4+pPager->pageS
22a10 69 7a 65 29 20 29 3b 0a 20 20 20 20 20 20 72 63  ize) );.      rc
22a20 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
22a30 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
22a40 72 2c 20 26 6f 66 66 73 65 74 2c 20 70 44 6f 6e  r, &offset, pDon
22a50 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  e, 0, 1);.    }.
22a60 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
22a70 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
22a80 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74   }..  sqlite3Bit
22a90 76 65 63 44 65 73 74 72 6f 79 28 70 44 6f 6e 65  vecDestroy(pDone
22aa0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
22ab0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
22ac0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
22ad0 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 0a 20 20 72   = szJ;.  }..  r
22ae0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
22af0 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61  ** Change the ma
22b00 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
22b10 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20  in-memory pages 
22b20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64  that are allowed
22b30 0a 2a 2a 20 62 65 66 6f 72 65 20 61 74 74 65 6d  .** before attem
22b40 70 74 69 6e 67 20 74 6f 20 72 65 63 79 63 6c 65  pting to recycle
22b50 20 63 6c 65 61 6e 20 61 6e 64 20 75 6e 75 73 65   clean and unuse
22b60 64 20 70 61 67 65 73 2e 0a 2a 2f 0a 76 6f 69 64  d pages..*/.void
22b70 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
22b80 43 61 63 68 65 73 69 7a 65 28 50 61 67 65 72 20  Cachesize(Pager 
22b90 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50  *pPager, int mxP
22ba0 61 67 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 50  age){.  sqlite3P
22bb0 63 61 63 68 65 53 65 74 43 61 63 68 65 73 69 7a  cacheSetCachesiz
22bc0 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
22bd0 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f  e, mxPage);.}../
22be0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
22bf0 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
22c00 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  f in-memory page
22c10 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77  s that are allow
22c20 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 61 74 74  ed.** before att
22c30 65 6d 70 74 69 6e 67 20 74 6f 20 73 70 69 6c 6c  empting to spill
22c40 20 70 61 67 65 73 20 74 6f 20 6a 6f 75 72 6e 61   pages to journa
22c50 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  l..*/.int sqlite
22c60 33 50 61 67 65 72 53 65 74 53 70 69 6c 6c 73 69  3PagerSetSpillsi
22c70 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
22c80 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
22c90 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50   return sqlite3P
22ca0 63 61 63 68 65 53 65 74 53 70 69 6c 6c 73 69 7a  cacheSetSpillsiz
22cb0 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
22cc0 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f  e, mxPage);.}../
22cd0 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 53 51 4c 49  *.** Invoke SQLI
22ce0 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49  TE_FCNTL_MMAP_SI
22cf0 5a 45 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  ZE based on the 
22d00 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66  current value of
22d10 20 73 7a 4d 6d 61 70 2e 0a 2a 2f 0a 73 74 61 74   szMmap..*/.stat
22d20 69 63 20 76 6f 69 64 20 70 61 67 65 72 46 69 78  ic void pagerFix
22d30 4d 61 70 6c 69 6d 69 74 28 50 61 67 65 72 20 2a  Maplimit(Pager *
22d40 70 50 61 67 65 72 29 7b 0a 23 69 66 20 53 51 4c  pPager){.#if SQL
22d50 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
22d60 45 3e 30 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  E>0.  sqlite3_fi
22d70 6c 65 20 2a 66 64 20 3d 20 70 50 61 67 65 72 2d  le *fd = pPager-
22d80 3e 66 64 3b 0a 20 20 69 66 28 20 69 73 4f 70 65  >fd;.  if( isOpe
22d90 6e 28 66 64 29 20 26 26 20 66 64 2d 3e 70 4d 65  n(fd) && fd->pMe
22da0 74 68 6f 64 73 2d 3e 69 56 65 72 73 69 6f 6e 3e  thods->iVersion>
22db0 3d 33 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =3 ){.    sqlite
22dc0 33 5f 69 6e 74 36 34 20 73 7a 3b 0a 20 20 20 20  3_int64 sz;.    
22dd0 73 7a 20 3d 20 70 50 61 67 65 72 2d 3e 73 7a 4d  sz = pPager->szM
22de0 6d 61 70 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  map;.    pPager-
22df0 3e 62 55 73 65 46 65 74 63 68 20 3d 20 28 73 7a  >bUseFetch = (sz
22e00 3e 30 29 3b 0a 20 20 20 20 73 65 74 47 65 74 74  >0);.    setGett
22e10 65 72 4d 65 74 68 6f 64 28 70 50 61 67 65 72 29  erMethod(pPager)
22e20 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46  ;.    sqlite3OsF
22e30 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70  ileControlHint(p
22e40 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54  Pager->fd, SQLIT
22e50 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a  E_FCNTL_MMAP_SIZ
22e60 45 2c 20 26 73 7a 29 3b 0a 20 20 7d 0a 23 65 6e  E, &sz);.  }.#en
22e70 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  dif.}../*.** Cha
22e80 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  nge the maximum 
22e90 73 69 7a 65 20 6f 66 20 61 6e 79 20 6d 65 6d 6f  size of any memo
22ea0 72 79 20 6d 61 70 70 69 6e 67 20 6d 61 64 65 20  ry mapping made 
22eb0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
22ec0 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  file..*/.void sq
22ed0 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61  lite3PagerSetMma
22ee0 70 4c 69 6d 69 74 28 50 61 67 65 72 20 2a 70 50  pLimit(Pager *pP
22ef0 61 67 65 72 2c 20 73 71 6c 69 74 65 33 5f 69 6e  ager, sqlite3_in
22f00 74 36 34 20 73 7a 4d 6d 61 70 29 7b 0a 20 20 70  t64 szMmap){.  p
22f10 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 20 3d 20  Pager->szMmap = 
22f20 73 7a 4d 6d 61 70 3b 0a 20 20 70 61 67 65 72 46  szMmap;.  pagerF
22f30 69 78 4d 61 70 6c 69 6d 69 74 28 70 50 61 67 65  ixMaplimit(pPage
22f40 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  r);.}../*.** Fre
22f50 65 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79  e as much memory
22f60 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66 72 6f   as possible fro
22f70 6d 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a  m the pager..*/.
22f80 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
22f90 72 53 68 72 69 6e 6b 28 50 61 67 65 72 20 2a 70  rShrink(Pager *p
22fa0 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  Pager){.  sqlite
22fb0 33 50 63 61 63 68 65 53 68 72 69 6e 6b 28 70 50  3PcacheShrink(pP
22fc0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
22fd0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20  }../*.** Adjust 
22fe0 73 65 74 74 69 6e 67 73 20 6f 66 20 74 68 65 20  settings of the 
22ff0 70 61 67 65 72 20 74 6f 20 74 68 6f 73 65 20 73  pager to those s
23000 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20  pecified in the 
23010 70 67 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65  pgFlags paramete
23020 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 6c 65  r..**.** The "le
23030 76 65 6c 22 20 69 6e 20 70 67 46 6c 61 67 73 20  vel" in pgFlags 
23040 26 20 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e  & PAGER_SYNCHRON
23050 4f 55 53 5f 4d 41 53 4b 20 73 65 74 73 20 74 68  OUS_MASK sets th
23060 65 20 72 6f 62 75 73 74 6e 65 73 73 0a 2a 2a 20  e robustness.** 
23070 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
23080 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f  to damage due to
23090 20 4f 53 20 63 72 61 73 68 65 73 20 6f 72 20 70   OS crashes or p
230a0 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20 62 79  ower failures by
230b0 0a 2a 2a 20 63 68 61 6e 67 69 6e 67 20 74 68 65  .** changing the
230c0 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73   number of syncs
230d0 28 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67  ()s when writing
230e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a   the journals..*
230f0 2a 20 54 68 65 72 65 20 61 72 65 20 66 6f 75 72  * There are four
23100 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20   levels:.**.**  
23110 20 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69    OFF       sqli
23120 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e  te3OsSync() is n
23130 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68  ever called.  Th
23140 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c  is is the defaul
23150 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
23160 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20    for temporary 
23170 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69  and transient fi
23180 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f  les..**.**    NO
23190 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72  RMAL    The jour
231a0 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e  nal is synced on
231b0 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73  ce before writes
231c0 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a   begin on the.**
231d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
231e0 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 69 73  tabase.  This is
231f0 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61   normally adequa
23200 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62  te protection, b
23210 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ut.**           
23220 20 20 20 69 74 20 69 73 20 74 68 65 6f 72 65 74     it is theoret
23230 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c  ically possible,
23240 20 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c   though very unl
23250 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20  ikely,.**       
23260 20 20 20 20 20 20 20 74 68 61 74 20 61 6e 20 69         that an i
23270 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20  nopertune power 
23280 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65  failure could le
23290 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a  ave the journal.
232a0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
232b0 69 6e 20 61 20 73 74 61 74 65 20 77 68 69 63 68  in a state which
232c0 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d   would cause dam
232d0 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
232e0 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ase.**          
232f0 20 20 20 20 77 68 65 6e 20 69 74 20 69 73 20 72      when it is r
23300 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  olled back..**.*
23310 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54  *    FULL      T
23320 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
23330 6e 63 65 64 20 74 77 69 63 65 20 62 65 66 6f 72  nced twice befor
23340 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f  e writes begin o
23350 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
23360 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28        database (
23370 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69  with some additi
23380 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
23390 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c   - the nRec fiel
233a0 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
233b0 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c    of the journal
233c0 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20   header - being 
233d0 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65  written in betwe
233e0 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20  en the two.**   
233f0 20 20 20 20 20 20 20 20 20 20 20 73 79 6e 63 73             syncs
23400 29 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d 65  ).  If we assume
23410 20 74 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a   that writing a.
23420 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
23430 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74  single disk sect
23440 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68  or is atomic, th
23450 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f  en this mode pro
23460 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20  vides.**        
23470 20 20 20 20 20 20 61 73 73 75 72 61 6e 63 65 20        assurance 
23480 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
23490 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72   will not be cor
234a0 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a  rupted to the.**
234b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f                po
234c0 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64  int of causing d
234d0 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  amage to the dat
234e0 61 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c  abase during rol
234f0 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  lback..**.**    
23500 45 58 54 52 41 20 20 20 20 20 54 68 69 73 20 69  EXTRA     This i
23510 73 20 6c 69 6b 65 20 46 55 4c 4c 20 65 78 63 65  s like FULL exce
23520 70 74 20 74 68 61 74 20 69 73 20 61 6c 73 6f 20  pt that is also 
23530 73 79 6e 63 73 20 74 68 65 20 64 69 72 65 63 74  syncs the direct
23540 6f 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ory.**          
23550 20 20 20 20 74 68 61 74 20 63 6f 6e 74 61 69 6e      that contain
23560 73 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  s the rollback j
23570 6f 75 72 6e 61 6c 20 61 66 74 65 72 20 74 68 65  ournal after the
23580 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 20 20 20   rollback.**    
23590 20 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61            journa
235a0 6c 20 69 73 20 75 6e 6c 69 6e 6b 65 64 2e 0a 2a  l is unlinked..*
235b0 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65 20 69  *.** The above i
235c0 73 20 66 6f 72 20 61 20 72 6f 6c 6c 62 61 63 6b  s for a rollback
235d0 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e 20 20  -journal mode.  
235e0 46 6f 72 20 57 41 4c 20 6d 6f 64 65 2c 20 4f 46  For WAL mode, OF
235f0 46 20 63 6f 6e 74 69 6e 75 65 73 0a 2a 2a 20 74  F continues.** t
23600 6f 20 6d 65 61 6e 20 74 68 61 74 20 6e 6f 20 73  o mean that no s
23610 79 6e 63 73 20 65 76 65 72 20 6f 63 63 75 72 2e  yncs ever occur.
23620 20 20 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74    NORMAL means t
23630 68 61 74 20 74 68 65 20 57 41 4c 20 69 73 20 73  hat the WAL is s
23640 79 6e 63 65 64 0a 2a 2a 20 70 72 69 6f 72 20 74  ynced.** prior t
23650 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 63  o the start of c
23660 68 65 63 6b 70 6f 69 6e 74 20 61 6e 64 20 74 68  heckpoint and th
23670 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  at the database 
23680 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 0a 2a  file is synced.*
23690 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73  * at the conclus
236a0 69 6f 6e 20 6f 66 20 74 68 65 20 63 68 65 63 6b  ion of the check
236b0 70 6f 69 6e 74 20 69 66 20 74 68 65 20 65 6e 74  point if the ent
236c0 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  ire content of t
236d0 68 65 20 57 41 4c 0a 2a 2a 20 77 61 73 20 77 72  he WAL.** was wr
236e0 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20  itten back into 
236f0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 42  the database.  B
23700 75 74 20 6e 6f 20 73 79 6e 63 20 6f 70 65 72 61  ut no sync opera
23710 74 69 6f 6e 73 20 6f 63 63 75 72 20 66 6f 72 0a  tions occur for.
23720 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 63  ** an ordinary c
23730 6f 6d 6d 69 74 20 69 6e 20 4e 4f 52 4d 41 4c 20  ommit in NORMAL 
23740 6d 6f 64 65 20 77 69 74 68 20 57 41 4c 2e 20 20  mode with WAL.  
23750 46 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74 20  FULL means that 
23760 74 68 65 20 57 41 4c 0a 2a 2a 20 66 69 6c 65 20  the WAL.** file 
23770 69 73 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77  is synced follow
23780 69 6e 67 20 65 61 63 68 20 63 6f 6d 6d 69 74 20  ing each commit 
23790 6f 70 65 72 61 74 69 6f 6e 2c 20 69 6e 20 61 64  operation, in ad
237a0 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 0a 2a 2a  dition to the.**
237b0 20 73 79 6e 63 73 20 61 73 73 6f 63 69 61 74 65   syncs associate
237c0 64 20 77 69 74 68 20 4e 4f 52 4d 41 4c 2e 20 20  d with NORMAL.  
237d0 54 68 65 72 65 20 69 73 20 6e 6f 20 64 69 66 66  There is no diff
237e0 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 46  erence between F
237f0 55 4c 4c 0a 2a 2a 20 61 6e 64 20 45 58 54 52 41  ULL.** and EXTRA
23800 20 66 6f 72 20 57 41 4c 20 6d 6f 64 65 2e 0a 2a   for WAL mode..*
23810 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 63 6f 6e 66  *.** Do not conf
23820 75 73 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d  use synchronous=
23830 46 55 4c 4c 20 77 69 74 68 20 53 51 4c 49 54 45  FULL with SQLITE
23840 5f 53 59 4e 43 5f 46 55 4c 4c 2e 20 20 54 68 65  _SYNC_FULL.  The
23850 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  .** SQLITE_SYNC_
23860 46 55 4c 4c 20 6d 61 63 72 6f 20 6d 65 61 6e 73  FULL macro means
23870 20 74 6f 20 75 73 65 20 74 68 65 20 4d 61 63 4f   to use the MacO
23880 53 58 2d 73 74 79 6c 65 20 66 75 6c 6c 2d 66 73  SX-style full-fs
23890 79 6e 63 0a 2a 2a 20 75 73 69 6e 67 20 66 63 6e  ync.** using fcn
238a0 74 6c 28 46 5f 46 55 4c 4c 46 53 59 4e 43 29 2e  tl(F_FULLFSYNC).
238b0 20 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f    SQLITE_SYNC_NO
238c0 52 4d 41 4c 20 6d 65 61 6e 73 20 74 6f 20 64 6f  RMAL means to do
238d0 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61 72 79 20   an.** ordinary 
238e0 66 73 79 6e 63 28 29 20 63 61 6c 6c 2e 20 20 54  fsync() call.  T
238f0 68 65 72 65 20 69 73 20 6e 6f 20 64 69 66 66 65  here is no diffe
23900 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 53 51  rence between SQ
23910 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 2a  LITE_SYNC_FULL.*
23920 2a 20 61 6e 64 20 53 51 4c 49 54 45 5f 53 59 4e  * and SQLITE_SYN
23930 43 5f 4e 4f 52 4d 41 4c 20 6f 6e 20 70 6c 61 74  C_NORMAL on plat
23940 66 6f 72 6d 73 20 6f 74 68 65 72 20 74 68 61 6e  forms other than
23950 20 4d 61 63 4f 53 58 2e 20 20 42 75 74 20 74 68   MacOSX.  But th
23960 65 0a 2a 2a 20 73 79 6e 63 68 72 6f 6e 6f 75 73  e.** synchronous
23970 3d 46 55 4c 4c 20 76 65 72 73 75 73 20 73 79 6e  =FULL versus syn
23980 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 20  chronous=NORMAL 
23990 73 65 74 74 69 6e 67 20 64 65 74 65 72 6d 69 6e  setting determin
239a0 65 73 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 78  es when.** the x
239b0 53 79 6e 63 20 70 72 69 6d 69 74 69 76 65 20 69  Sync primitive i
239c0 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 69 73 20  s called and is 
239d0 72 65 6c 65 76 61 6e 74 20 74 6f 20 61 6c 6c 20  relevant to all 
239e0 70 6c 61 74 66 6f 72 6d 73 2e 0a 2a 2a 0a 2a 2a  platforms..**.**
239f0 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20   Numeric values 
23a00 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
23a10 74 68 65 73 65 20 73 74 61 74 65 73 20 61 72 65  these states are
23a20 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d   OFF==1, NORMAL=
23a30 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33  2,.** and FULL=3
23a40 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
23a50 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
23a60 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69  RAGMAS.void sqli
23a70 74 65 33 50 61 67 65 72 53 65 74 46 6c 61 67 73  te3PagerSetFlags
23a80 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
23a90 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  r,        /* The
23aa0 20 70 61 67 65 72 20 74 6f 20 73 65 74 20 73 61   pager to set sa
23ab0 66 65 74 79 20 6c 65 76 65 6c 20 66 6f 72 20 2a  fety level for *
23ac0 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 67 46  /.  unsigned pgF
23ad0 6c 61 67 73 20 20 20 20 20 20 2f 2a 20 56 61 72  lags      /* Var
23ae0 69 6f 75 73 20 66 6c 61 67 73 20 2a 2f 0a 29 7b  ious flags */.){
23af0 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 65 76 65  .  unsigned leve
23b00 6c 20 3d 20 70 67 46 6c 61 67 73 20 26 20 50 41  l = pgFlags & PA
23b10 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f  GER_SYNCHRONOUS_
23b20 4d 41 53 4b 3b 0a 20 20 69 66 28 20 70 50 61 67  MASK;.  if( pPag
23b30 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
23b40 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79      pPager->noSy
23b50 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  nc = 1;.    pPag
23b60 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 30  er->fullSync = 0
23b70 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78  ;.    pPager->ex
23b80 74 72 61 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d  traSync = 0;.  }
23b90 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
23ba0 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c 65 76 65  ->noSync =  leve
23bb0 6c 3d 3d 50 41 47 45 52 5f 53 59 4e 43 48 52 4f  l==PAGER_SYNCHRO
23bc0 4e 4f 55 53 5f 4f 46 46 20 3f 31 3a 30 3b 0a 20  NOUS_OFF ?1:0;. 
23bd0 20 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53     pPager->fullS
23be0 79 6e 63 20 3d 20 6c 65 76 65 6c 3e 3d 50 41 47  ync = level>=PAG
23bf0 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 46  ER_SYNCHRONOUS_F
23c00 55 4c 4c 20 3f 31 3a 30 3b 0a 20 20 20 20 70 50  ULL ?1:0;.    pP
23c10 61 67 65 72 2d 3e 65 78 74 72 61 53 79 6e 63 20  ager->extraSync 
23c20 3d 20 6c 65 76 65 6c 3d 3d 50 41 47 45 52 5f 53  = level==PAGER_S
23c30 59 4e 43 48 52 4f 4e 4f 55 53 5f 45 58 54 52 41  YNCHRONOUS_EXTRA
23c40 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 69 66 28   ?1:0;.  }.  if(
23c50 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
23c60 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
23c70 79 6e 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20  yncFlags = 0;.  
23c80 7d 65 6c 73 65 20 69 66 28 20 70 67 46 6c 61 67  }else if( pgFlag
23c90 73 20 26 20 50 41 47 45 52 5f 46 55 4c 4c 46 53  s & PAGER_FULLFS
23ca0 59 4e 43 20 29 7b 0a 20 20 20 20 70 50 61 67 65  YNC ){.    pPage
23cb0 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53  r->syncFlags = S
23cc0 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b  QLITE_SYNC_FULL;
23cd0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
23ce0 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20  ager->syncFlags 
23cf0 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  = SQLITE_SYNC_NO
23d00 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 70 50 61 67  RMAL;.  }.  pPag
23d10 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73  er->walSyncFlags
23d20 20 3d 20 28 70 50 61 67 65 72 2d 3e 73 79 6e 63   = (pPager->sync
23d30 46 6c 61 67 73 3c 3c 32 29 3b 0a 20 20 69 66 28  Flags<<2);.  if(
23d40 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
23d50 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  c ){.    pPager-
23d60 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20 7c 3d  >walSyncFlags |=
23d70 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
23d80 67 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70  gs;.  }.  if( (p
23d90 67 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f 43  gFlags & PAGER_C
23da0 4b 50 54 5f 46 55 4c 4c 46 53 59 4e 43 29 20 26  KPT_FULLFSYNC) &
23db0 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  & !pPager->noSyn
23dc0 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  c ){.    pPager-
23dd0 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20 7c 3d  >walSyncFlags |=
23de0 20 28 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55   (SQLITE_SYNC_FU
23df0 4c 4c 3c 3c 32 29 3b 0a 20 20 7d 0a 20 20 69 66  LL<<2);.  }.  if
23e00 28 20 70 67 46 6c 61 67 73 20 26 20 50 41 47 45  ( pgFlags & PAGE
23e10 52 5f 43 41 43 48 45 53 50 49 4c 4c 20 29 7b 0a  R_CACHESPILL ){.
23e20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
23e30 74 53 70 69 6c 6c 20 26 3d 20 7e 53 50 49 4c 4c  tSpill &= ~SPILL
23e40 46 4c 41 47 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73  FLAG_OFF;.  }els
23e50 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  e{.    pPager->d
23e60 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20 53 50 49  oNotSpill |= SPI
23e70 4c 4c 46 4c 41 47 5f 4f 46 46 3b 0a 20 20 7d 0a  LLFLAG_OFF;.  }.
23e80 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
23e90 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c  The following gl
23ea0 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73  obal variable is
23eb0 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65   incremented whe
23ec0 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72 61 72  never the librar
23ed0 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f  y.** attempts to
23ee0 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   open a temporar
23ef0 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e  y file.  This in
23f00 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
23f10 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67  d for.** testing
23f20 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e   and analysis on
23f30 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20  ly.  .*/.#ifdef 
23f40 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
23f50 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70  sqlite3_opentemp
23f60 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  _count = 0;.#end
23f70 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  if../*.** Open a
23f80 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
23f90 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  .**.** Write the
23fa0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
23fb0 20 69 6e 74 6f 20 2a 70 46 69 6c 65 2e 20 52 65   into *pFile. Re
23fc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
23fd0 6e 20 73 75 63 63 65 73 73 20 0a 2a 2a 20 6f 72  n success .** or
23fe0 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f   some other erro
23ff0 72 20 63 6f 64 65 20 69 66 20 77 65 20 66 61 69  r code if we fai
24000 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61  l. The OS will a
24010 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a  utomatically .**
24020 20 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70   delete the temp
24030 6f 72 61 72 79 20 66 69 6c 65 20 77 68 65 6e 20  orary file when 
24040 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a  it is closed..**
24050 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 70 61  .** The flags pa
24060 73 73 65 64 20 74 6f 20 74 68 65 20 56 46 53 20  ssed to the VFS 
24070 6c 61 79 65 72 20 78 4f 70 65 6e 28 29 20 63 61  layer xOpen() ca
24080 6c 6c 20 61 72 65 20 74 68 6f 73 65 20 73 70 65  ll are those spe
24090 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 70 61 72  cified.** by par
240a0 61 6d 65 74 65 72 20 76 66 73 46 6c 61 67 73 20  ameter vfsFlags 
240b0 4f 52 65 64 20 77 69 74 68 20 74 68 65 20 66 6f  ORed with the fo
240c0 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
240d0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
240e0 45 41 44 57 52 49 54 45 0a 2a 2a 20 20 20 20 20  EADWRITE.**     
240f0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
24100 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  TE.**     SQLITE
24110 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 0a  _OPEN_EXCLUSIVE.
24120 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50  **     SQLITE_OP
24130 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
24140 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
24150 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20  agerOpentemp(.  
24160 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
24170 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
24180 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73  er object */.  s
24190 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
241a0 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65 20 74 68  le,  /* Write th
241b0 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
241c0 72 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  r here */.  int 
241d0 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20  vfsFlags        
241e0 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65    /* Flags passe
241f0 64 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65  d through to the
24200 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74   VFS */.){.  int
24210 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
24220 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
24230 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  e */..#ifdef SQL
24240 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74  ITE_TEST.  sqlit
24250 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
24260 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f  t++;  /* Used fo
24270 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  r testing and an
24280 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23  alysis only */.#
24290 65 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c 61 67  endif..  vfsFlag
242a0 73 20 7c 3d 20 20 0a 23 69 66 20 53 51 4c 49 54  s |=  .#if SQLIT
242b0 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52  E_ENABLE_DATA_PR
242c0 4f 54 45 43 54 49 4f 4e 0a 20 20 20 20 20 20 20  OTECTION.       
242d0 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 76 66       (pPager->vf
242e0 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50  sFlags&SQLITE_OP
242f0 45 4e 5f 46 49 4c 45 50 52 4f 54 45 43 54 49 4f  EN_FILEPROTECTIO
24300 4e 5f 4d 41 53 4b 29 7c 0a 23 65 6e 64 69 66 0a  N_MASK)|.#endif.
24310 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
24320 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
24330 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
24340 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20  CREATE |.       
24350 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
24360 5f 45 58 43 4c 55 53 49 56 45 20 7c 20 53 51 4c  _EXCLUSIVE | SQL
24370 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
24380 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20 3d 20 73  NCLOSE;.  rc = s
24390 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 50 61  qlite3OsOpen(pPa
243a0 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70 46  ger->pVfs, 0, pF
243b0 69 6c 65 2c 20 76 66 73 46 6c 61 67 73 2c 20 30  ile, vfsFlags, 0
243c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  );.  assert( rc!
243d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73  =SQLITE_OK || is
243e0 4f 70 65 6e 28 70 46 69 6c 65 29 20 29 3b 0a 20  Open(pFile) );. 
243f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
24400 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73  *.** Set the bus
24410 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69  y handler functi
24420 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  on..**.** The pa
24430 67 65 72 20 69 6e 76 6f 6b 65 73 20 74 68 65 20  ger invokes the 
24440 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 66 20  busy-handler if 
24450 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20  sqlite3OsLock() 
24460 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49  returns .** SQLI
24470 54 45 5f 42 55 53 59 20 77 68 65 6e 20 74 72 79  TE_BUSY when try
24480 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20 66  ing to upgrade f
24490 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74 6f 20 61  rom no-lock to a
244a0 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 0a 2a 2a   SHARED lock,.**
244b0 20 6f 72 20 77 68 65 6e 20 74 72 79 69 6e 67 20   or when trying 
244c0 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20  to upgrade from 
244d0 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
244e0 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  to an EXCLUSIVE 
244f0 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20 64 6f 65  .** lock. It doe
24500 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b 65 20 74  s *not* invoke t
24510 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
24520 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66  when upgrading f
24530 72 6f 6d 0a 2a 2a 20 53 48 41 52 45 44 20 74 6f  rom.** SHARED to
24540 20 52 45 53 45 52 56 45 44 2c 20 6f 72 20 77 68   RESERVED, or wh
24550 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f  en upgrading fro
24560 6d 20 53 48 41 52 45 44 20 74 6f 20 45 58 43 4c  m SHARED to EXCL
24570 55 53 49 56 45 0a 2a 2a 20 28 77 68 69 63 68 20  USIVE.** (which 
24580 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 68 6f  occurs during ho
24590 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
245a0 63 6b 29 2e 20 53 75 6d 6d 61 72 79 3a 0a 2a 2a  ck). Summary:.**
245b0 0a 2a 2a 20 20 20 54 72 61 6e 73 69 74 69 6f 6e  .**   Transition
245c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245d0 20 20 20 20 20 20 20 20 7c 20 49 6e 76 6f 6b 65          | Invoke
245e0 73 20 78 42 75 73 79 48 61 6e 64 6c 65 72 0a 2a  s xBusyHandler.*
245f0 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
24600 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24610 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24620 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
24630 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20 20 20    NO_LOCK       
24640 2d 3e 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20  -> SHARED_LOCK  
24650 20 20 20 20 7c 20 59 65 73 0a 2a 2a 20 20 20 53      | Yes.**   S
24660 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20  HARED_LOCK   -> 
24670 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20  RESERVED_LOCK   
24680 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48 41 52 45   | No.**   SHARE
24690 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45 58 43 4c  D_LOCK   -> EXCL
246a0 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e  USIVE_LOCK   | N
246b0 6f 0a 2a 2a 20 20 20 52 45 53 45 52 56 45 44 5f  o.**   RESERVED_
246c0 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c 55 53 49 56  LOCK -> EXCLUSIV
246d0 45 5f 4c 4f 43 4b 20 20 20 7c 20 59 65 73 0a 2a  E_LOCK   | Yes.*
246e0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 75 73 79  *.** If the busy
246f0 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63  -handler callbac
24700 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  k returns non-ze
24710 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 20  ro, the lock is 
24720 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20 49 66 20  .** retried. If 
24730 69 74 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2c  it returns zero,
24740 20 74 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45   then the SQLITE
24750 5f 42 55 53 59 20 65 72 72 6f 72 20 69 73 0a 2a  _BUSY error is.*
24760 2a 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  * returned to th
24770 65 20 63 61 6c 6c 65 72 20 6f 66 20 74 68 65 20  e caller of the 
24780 70 61 67 65 72 20 41 50 49 20 66 75 6e 63 74 69  pager API functi
24790 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
247a0 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79 48  te3PagerSetBusyH
247b0 61 6e 64 6c 65 72 28 0a 20 20 50 61 67 65 72 20  andler(.  Pager 
247c0 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
247d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
247e0 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  * Pager object *
247f0 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79 48  /.  int (*xBusyH
24800 61 6e 64 6c 65 72 29 28 76 6f 69 64 20 2a 29 2c  andler)(void *),
24810 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
24820 74 65 72 20 74 6f 20 62 75 73 79 2d 68 61 6e 64  ter to busy-hand
24830 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ler function */.
24840 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e    void *pBusyHan
24850 64 6c 65 72 41 72 67 20 20 20 20 20 20 20 20 20  dlerArg         
24860 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65         /* Argume
24870 6e 74 20 74 6f 20 70 61 73 73 20 74 6f 20 78 42  nt to pass to xB
24880 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 29 7b  usyHandler */.){
24890 0a 20 20 76 6f 69 64 20 2a 2a 61 70 3b 0a 20 20  .  void **ap;.  
248a0 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
248b0 64 6c 65 72 20 3d 20 78 42 75 73 79 48 61 6e 64  dler = xBusyHand
248c0 6c 65 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  ler;.  pPager->p
248d0 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d  BusyHandlerArg =
248e0 20 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67   pBusyHandlerArg
248f0 3b 0a 20 20 61 70 20 3d 20 28 76 6f 69 64 20 2a  ;.  ap = (void *
24900 2a 29 26 70 50 61 67 65 72 2d 3e 78 42 75 73 79  *)&pPager->xBusy
24910 48 61 6e 64 6c 65 72 3b 0a 20 20 61 73 73 65 72  Handler;.  asser
24920 74 28 20 28 28 69 6e 74 28 2a 29 28 76 6f 69 64  t( ((int(*)(void
24930 20 2a 29 29 28 61 70 5b 30 5d 29 29 3d 3d 78 42   *))(ap[0]))==xB
24940 75 73 79 48 61 6e 64 6c 65 72 20 29 3b 0a 20 20  usyHandler );.  
24950 61 73 73 65 72 74 28 20 61 70 5b 31 5d 3d 3d 70  assert( ap[1]==p
24960 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 29  BusyHandlerArg )
24970 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  ;.  sqlite3OsFil
24980 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61  eControlHint(pPa
24990 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f  ger->fd, SQLITE_
249a0 46 43 4e 54 4c 5f 42 55 53 59 48 41 4e 44 4c 45  FCNTL_BUSYHANDLE
249b0 52 2c 20 28 76 6f 69 64 20 2a 29 61 70 29 3b 0a  R, (void *)ap);.
249c0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
249d0 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 75 73  the page size us
249e0 65 64 20 62 79 20 74 68 65 20 50 61 67 65 72 20  ed by the Pager 
249f0 6f 62 6a 65 63 74 2e 20 54 68 65 20 6e 65 77 20  object. The new 
24a00 70 61 67 65 20 73 69 7a 65 20 0a 2a 2a 20 69 73  page size .** is
24a10 20 70 61 73 73 65 64 20 69 6e 20 2a 70 50 61 67   passed in *pPag
24a20 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eSize..**.** If 
24a30 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
24a40 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20  the error state 
24a50 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
24a60 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  on is called, it
24a70 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  .** is a no-op. 
24a80 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
24a90 65 64 20 69 73 20 74 68 65 20 65 72 72 6f 72 20  ed is the error 
24aa0 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  state error code
24ab0 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e 65 20 6f   (i.e. .** one o
24ac0 66 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20  f SQLITE_IOERR, 
24ad0 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  an SQLITE_IOERR_
24ae0 78 78 78 20 73 75 62 2d 63 6f 64 65 20 6f 72 20  xxx sub-code or 
24af0 53 51 4c 49 54 45 5f 46 55 4c 4c 29 2e 0a 2a 2a  SQLITE_FULL)..**
24b00 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
24b10 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  f all of the fol
24b20 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
24b30 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6e  .**.**   * the n
24b40 65 77 20 70 61 67 65 20 73 69 7a 65 20 28 76 61  ew page size (va
24b50 6c 75 65 20 6f 66 20 2a 70 50 61 67 65 53 69 7a  lue of *pPageSiz
24b60 65 29 20 69 73 20 76 61 6c 69 64 20 28 61 20 70  e) is valid (a p
24b70 6f 77 65 72 20 0a 2a 2a 20 20 20 20 20 6f 66 20  ower .**     of 
24b80 74 77 6f 20 62 65 74 77 65 65 6e 20 35 31 32 20  two between 512 
24b90 61 6e 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50  and SQLITE_MAX_P
24ba0 41 47 45 5f 53 49 5a 45 2c 20 69 6e 63 6c 75 73  AGE_SIZE, inclus
24bb0 69 76 65 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20  ive), and.**.** 
24bc0 20 20 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f    * there are no
24bd0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
24be0 65 20 72 65 66 65 72 65 6e 63 65 73 2c 20 61 6e  e references, an
24bf0 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20  d.**.**   * the 
24c00 64 61 74 61 62 61 73 65 20 69 73 20 65 69 74 68  database is eith
24c10 65 72 20 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d  er not an in-mem
24c20 6f 72 79 20 64 61 74 61 62 61 73 65 20 6f 72 20  ory database or 
24c30 69 74 20 69 73 0a 2a 2a 20 20 20 20 20 61 6e 20  it is.**     an 
24c40 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
24c50 73 65 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c  se that currentl
24c60 79 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 7a 65  y consists of ze
24c70 72 6f 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20  ro pages..**.** 
24c80 74 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 6f  then the pager o
24c90 62 6a 65 63 74 20 70 61 67 65 20 73 69 7a 65 20  bject page size 
24ca0 69 73 20 73 65 74 20 74 6f 20 2a 70 50 61 67 65  is set to *pPage
24cb0 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  Size..**.** If t
24cc0 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
24cd0 63 68 61 6e 67 65 64 2c 20 74 68 65 6e 20 74 68  changed, then th
24ce0 69 73 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 73  is function uses
24cf0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 6c   sqlite3PagerMal
24d00 6c 6f 63 28 29 20 0a 2a 2a 20 74 6f 20 6f 62 74  loc() .** to obt
24d10 61 69 6e 20 61 20 6e 65 77 20 50 61 67 65 72 2e  ain a new Pager.
24d20 70 54 6d 70 53 70 61 63 65 20 62 75 66 66 65 72  pTmpSpace buffer
24d30 2e 20 49 66 20 74 68 69 73 20 61 6c 6c 6f 63 61  . If this alloca
24d40 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 0a 2a 2a  tion attempt .**
24d50 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e   fails, SQLITE_N
24d60 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64  OMEM is returned
24d70 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 73 69   and the page si
24d80 7a 65 20 72 65 6d 61 69 6e 73 20 75 6e 63 68 61  ze remains uncha
24d90 6e 67 65 64 2e 20 0a 2a 2a 20 49 6e 20 61 6c 6c  nged. .** In all
24da0 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20 53 51   other cases, SQ
24db0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
24dc0 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ned..**.** If th
24dd0 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e  e page size is n
24de0 6f 74 20 63 68 61 6e 67 65 64 2c 20 65 69 74 68  ot changed, eith
24df0 65 72 20 62 65 63 61 75 73 65 20 6f 6e 65 20 6f  er because one o
24e00 66 20 74 68 65 20 65 6e 75 6d 65 72 61 74 65 64  f the enumerated
24e10 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61  .** conditions a
24e20 62 6f 76 65 20 69 73 20 6e 6f 74 20 74 72 75 65  bove is not true
24e30 2c 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  , the pager was 
24e40 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 77  in error state w
24e50 68 65 6e 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63  hen this.** func
24e60 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2c  tion was called,
24e70 20 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20   or because the 
24e80 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
24e90 6e 20 61 74 74 65 6d 70 74 20 66 61 69 6c 65 64  n attempt failed
24ea0 2c 20 0a 2a 2a 20 74 68 65 6e 20 2a 70 50 61 67  , .** then *pPag
24eb0 65 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  eSize is set to 
24ec0 74 68 65 20 6f 6c 64 2c 20 72 65 74 61 69 6e 65  the old, retaine
24ed0 64 20 70 61 67 65 20 73 69 7a 65 20 62 65 66 6f  d page size befo
24ee0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
24ef0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
24f00 72 53 65 74 50 61 67 65 73 69 7a 65 28 50 61 67  rSetPagesize(Pag
24f10 65 72 20 2a 70 50 61 67 65 72 2c 20 75 33 32 20  er *pPager, u32 
24f20 2a 70 50 61 67 65 53 69 7a 65 2c 20 69 6e 74 20  *pPageSize, int 
24f30 6e 52 65 73 65 72 76 65 29 7b 0a 20 20 69 6e 74  nReserve){.  int
24f40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
24f50 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74  ..  /* It is not
24f60 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 6f 20   possible to do 
24f70 61 20 66 75 6c 6c 20 61 73 73 65 72 74 5f 70 61  a full assert_pa
24f80 67 65 72 5f 73 74 61 74 65 28 29 20 68 65 72 65  ger_state() here
24f90 2c 20 61 73 20 74 68 69 73 0a 20 20 2a 2a 20 66  , as this.  ** f
24fa0 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63  unction may be c
24fb0 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69  alled from withi
24fc0 6e 20 50 61 67 65 72 4f 70 65 6e 28 29 2c 20 62  n PagerOpen(), b
24fd0 65 66 6f 72 65 20 74 68 65 20 73 74 61 74 65 0a  efore the state.
24fe0 20 20 2a 2a 20 6f 66 20 74 68 65 20 50 61 67 65    ** of the Page
24ff0 72 20 6f 62 6a 65 63 74 20 69 73 20 69 6e 74 65  r object is inte
25000 72 6e 61 6c 6c 79 20 63 6f 6e 73 69 73 74 65 6e  rnally consisten
25010 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 74 20  t..  **.  ** At 
25020 6f 6e 65 20 70 6f 69 6e 74 20 74 68 69 73 20 66  one point this f
25030 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 65 64  unction returned
25040 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65   an error if the
25050 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 0a 20   pager was in . 
25060 20 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f 52 20   ** PAGER_ERROR 
25070 73 74 61 74 65 2e 20 42 75 74 20 73 69 6e 63 65  state. But since
25080 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61   PAGER_ERROR sta
25090 74 65 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  te guarantees th
250a0 61 74 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73  at.  ** there is
250b0 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75   at least one ou
250c0 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 72  tstanding page r
250d0 65 66 65 72 65 6e 63 65 2c 20 74 68 69 73 20 66  eference, this f
250e0 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  unction.  ** is 
250f0 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 68 61 74  a no-op for that
25100 20 63 61 73 65 20 61 6e 79 68 6f 77 2e 0a 20 20   case anyhow..  
25110 2a 2f 0a 0a 20 20 75 33 32 20 70 61 67 65 53 69  */..  u32 pageSi
25120 7a 65 20 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b  ze = *pPageSize;
25130 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65 53  .  assert( pageS
25140 69 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53  ize==0 || (pageS
25150 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65  ize>=512 && page
25160 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  Size<=SQLITE_MAX
25170 5f 50 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20  _PAGE_SIZE) );. 
25180 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e 6d 65   if( (pPager->me
25190 6d 44 62 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  mDb==0 || pPager
251a0 2d 3e 64 62 53 69 7a 65 3d 3d 30 29 0a 20 20 20  ->dbSize==0).   
251b0 26 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  && sqlite3Pcache
251c0 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
251d0 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 0a 20 20  >pPCache)==0 .  
251e0 20 26 26 20 70 61 67 65 53 69 7a 65 20 26 26 20   && pageSize && 
251f0 70 61 67 65 53 69 7a 65 21 3d 28 75 33 32 29 70  pageSize!=(u32)p
25200 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
25210 0a 20 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  .  ){.    char *
25220 70 4e 65 77 20 3d 20 4e 55 4c 4c 3b 20 20 20 20  pNew = NULL;    
25230 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
25240 74 65 6d 70 20 73 70 61 63 65 20 2a 2f 0a 20 20  temp space */.  
25250 20 20 69 36 34 20 6e 42 79 74 65 20 3d 20 30 3b    i64 nByte = 0;
25260 0a 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ..    if( pPager
25270 2d 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f 4f  ->eState>PAGER_O
25280 50 45 4e 20 26 26 20 69 73 4f 70 65 6e 28 70 50  PEN && isOpen(pP
25290 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
252a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
252b0 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
252c0 2d 3e 66 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20  ->fd, &nByte);. 
252d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
252e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
252f0 20 20 20 20 70 4e 65 77 20 3d 20 28 63 68 61 72      pNew = (char
25300 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 4d 61   *)sqlite3PageMa
25310 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65 29 3b 0a  lloc(pageSize);.
25320 20 20 20 20 20 20 69 66 28 20 21 70 4e 65 77 20        if( !pNew 
25330 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ) rc = SQLITE_NO
25340 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  MEM_BKPT;.    }.
25350 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
25360 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
25370 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
25380 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  er);.      rc = 
25390 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74  sqlite3PcacheSet
253a0 50 61 67 65 53 69 7a 65 28 70 50 61 67 65 72 2d  PageSize(pPager-
253b0 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65 53 69  >pPCache, pageSi
253c0 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ze);.    }.    i
253d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
253e0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
253f0 33 50 61 67 65 46 72 65 65 28 70 50 61 67 65 72  3PageFree(pPager
25400 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20  ->pTmpSpace);.  
25410 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70      pPager->pTmp
25420 53 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20  Space = pNew;.  
25430 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
25440 7a 65 20 3d 20 28 50 67 6e 6f 29 28 28 6e 42 79  ze = (Pgno)((nBy
25450 74 65 2b 70 61 67 65 53 69 7a 65 2d 31 29 2f 70  te+pageSize-1)/p
25460 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
25470 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
25480 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20   = pageSize;.   
25490 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
254a0 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70 4e  lite3PageFree(pN
254b0 65 77 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ew);.    }.  }..
254c0 20 20 2a 70 50 61 67 65 53 69 7a 65 20 3d 20 70    *pPageSize = p
254d0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
254e0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
254f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
25500 6e 52 65 73 65 72 76 65 3c 30 20 29 20 6e 52 65  nReserve<0 ) nRe
25510 73 65 72 76 65 20 3d 20 70 50 61 67 65 72 2d 3e  serve = pPager->
25520 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73  nReserve;.    as
25530 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d  sert( nReserve>=
25540 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c 31 30  0 && nReserve<10
25550 30 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  00 );.    pPager
25560 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28 69 31  ->nReserve = (i1
25570 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20  6)nReserve;.    
25580 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28  pagerReportSize(
25590 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 61 67  pPager);.    pag
255a0 65 72 46 69 78 4d 61 70 6c 69 6d 69 74 28 70 50  erFixMaplimit(pP
255b0 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ager);.  }.  ret
255c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
255d0 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
255e0 72 20 74 6f 20 74 68 65 20 22 74 65 6d 70 6f 72  r to the "tempor
255f0 61 72 79 20 70 61 67 65 22 20 62 75 66 66 65 72  ary page" buffer
25600 20 68 65 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79   held internally
25610 0a 2a 2a 20 62 79 20 74 68 65 20 70 61 67 65 72  .** by the pager
25620 2e 20 20 54 68 69 73 20 69 73 20 61 20 62 75 66  .  This is a buf
25630 66 65 72 20 74 68 61 74 20 69 73 20 62 69 67 20  fer that is big 
25640 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74  enough to hold t
25650 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e  he.** entire con
25660 74 65 6e 74 20 6f 66 20 61 20 64 61 74 61 62 61  tent of a databa
25670 73 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 62  se page.  This b
25680 75 66 66 65 72 20 69 73 20 75 73 65 64 20 69 6e  uffer is used in
25690 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69  ternally.** duri
256a0 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20  ng rollback and 
256b0 77 69 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74  will be overwrit
256c0 74 65 6e 20 77 68 65 6e 65 76 65 72 20 61 20 72  ten whenever a r
256d0 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72  ollback.** occur
256e0 73 2e 20 20 42 75 74 20 6f 74 68 65 72 20 6d 6f  s.  But other mo
256f0 64 75 6c 65 73 20 61 72 65 20 66 72 65 65 20 74  dules are free t
25700 6f 20 75 73 65 20 69 74 20 74 6f 6f 2c 20 61 73  o use it too, as
25710 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72   long as.** no r
25720 6f 6c 6c 62 61 63 6b 73 20 61 72 65 20 68 61 70  ollbacks are hap
25730 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20  pening..*/.void 
25740 2a 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d  *sqlite3PagerTem
25750 70 53 70 61 63 65 28 50 61 67 65 72 20 2a 70 50  pSpace(Pager *pP
25760 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
25770 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
25780 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65  e;.}../*.** Atte
25790 6d 70 74 20 74 6f 20 73 65 74 20 74 68 65 20 6d  mpt to set the m
257a0 61 78 69 6d 75 6d 20 64 61 74 61 62 61 73 65 20  aximum database 
257b0 70 61 67 65 20 63 6f 75 6e 74 20 69 66 20 6d 78  page count if mx
257c0 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65  Page is positive
257d0 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68  . .** Make no ch
257e0 61 6e 67 65 73 20 69 66 20 6d 78 50 61 67 65 20  anges if mxPage 
257f0 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74  is zero or negat
25800 69 76 65 2e 20 20 41 6e 64 20 6e 65 76 65 72 20  ive.  And never 
25810 72 65 64 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61  reduce the.** ma
25820 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
25830 20 62 65 6c 6f 77 20 74 68 65 20 63 75 72 72 65   below the curre
25840 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  nt size of the d
25850 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52  atabase..**.** R
25860 65 67 61 72 64 6c 65 73 73 20 6f 66 20 6d 78 50  egardless of mxP
25870 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20  age, return the 
25880 63 75 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20  current maximum 
25890 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69  page count..*/.i
258a0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  nt sqlite3PagerM
258b0 61 78 50 61 67 65 43 6f 75 6e 74 28 50 61 67 65  axPageCount(Page
258c0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d  r *pPager, int m
258d0 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78  xPage){.  if( mx
258e0 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 70 50  Page>0 ){.    pP
258f0 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d  ager->mxPgno = m
25900 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20 61 73 73  xPage;.  }.  ass
25910 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
25920 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate!=PAGER_OPEN 
25930 29 3b 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 65  );      /* Calle
25940 64 20 6f 6e 6c 79 20 62 79 20 4f 50 5f 4d 61 78  d only by OP_Max
25950 50 67 63 6e 74 20 2a 2f 0a 20 20 2f 2a 20 61 73  Pgcnt */.  /* as
25960 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 78  sert( pPager->mx
25970 50 67 6e 6f 3e 3d 70 50 61 67 65 72 2d 3e 64 62  Pgno>=pPager->db
25980 53 69 7a 65 20 29 3b 20 2a 2f 0a 20 20 2f 2a 20  Size ); */.  /* 
25990 4f 50 5f 4d 61 78 50 67 63 6e 74 20 65 6e 73 75  OP_MaxPgcnt ensu
259a0 72 65 73 20 74 68 61 74 20 74 68 65 20 70 61 72  res that the par
259b0 61 6d 65 74 65 72 20 70 61 73 73 65 64 20 74 6f  ameter passed to
259c0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
259d0 73 20 6e 6f 74 0a 20 20 2a 2a 20 6c 65 73 73 20  s not.  ** less 
259e0 74 68 61 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e  than the total n
259f0 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70  umber of valid p
25a00 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
25a10 62 61 73 65 2e 20 42 75 74 20 74 68 69 73 0a 20  base. But this. 
25a20 20 2a 2a 20 6d 61 79 20 62 65 20 6c 65 73 73 20   ** may be less 
25a30 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a  than Pager.dbSiz
25a40 65 2c 20 61 6e 64 20 73 6f 20 74 68 65 20 61 73  e, and so the as
25a50 73 65 72 74 28 29 20 61 62 6f 76 65 20 69 73 20  sert() above is 
25a60 6e 6f 74 20 76 61 6c 69 64 20 2a 2f 0a 20 20 72  not valid */.  r
25a70 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78  eturn pPager->mx
25a80 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Pgno;.}../*.** T
25a90 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74  he following set
25aa0 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65   of routines are
25ab0 20 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65   used to disable
25ac0 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a   the simulated.*
25ad0 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68  * I/O error mech
25ae0 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f  anism.  These ro
25af0 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20  utines are used 
25b00 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74  to avoid simulat
25b10 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20  ed.** errors in 
25b20 70 6c 61 63 65 73 20 77 68 65 72 65 20 77 65 20  places where we 
25b30 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75  do not care abou
25b40 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20  t errors..**.** 
25b50 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f  Unless -DSQLITE_
25b60 54 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20  TEST=1 is used, 
25b70 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61  these routines a
25b80 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a  re all no-ops.**
25b90 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f   and generate no
25ba0 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66   code..*/.#ifdef
25bb0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74   SQLITE_TEST.ext
25bc0 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
25bd0 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
25be0 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c  ;.extern int sql
25bf0 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69  ite3_io_error_hi
25c00 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  t;.static int sa
25c10 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69  ved_cnt;.void di
25c20 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
25c30 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b  io_errors(void){
25c40 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73  .  saved_cnt = s
25c50 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
25c60 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74  pending;.  sqlit
25c70 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
25c80 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64  ing = -1;.}.void
25c90 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
25ca0 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64  d_io_errors(void
25cb0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f  ){.  sqlite3_io_
25cc0 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20  error_pending = 
25cd0 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c  saved_cnt;.}.#el
25ce0 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61  se.# define disa
25cf0 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
25d00 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69  _errors().# defi
25d10 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  ne enable_simula
25d20 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a  ted_io_errors().
25d30 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
25d40 61 64 20 74 68 65 20 66 69 72 73 74 20 4e 20 62  ad the first N b
25d50 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65  ytes from the be
25d60 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66  ginning of the f
25d70 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a  ile into memory.
25d80 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20 70 6f  ** that pDest po
25d90 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20  ints to. .**.** 
25da0 49 66 20 74 68 65 20 70 61 67 65 72 20 77 61 73  If the pager was
25db0 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74 72 61   opened on a tra
25dc0 6e 73 69 65 6e 74 20 66 69 6c 65 20 28 7a 46 69  nsient file (zFi
25dd0 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a  lename==""), or.
25de0 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 66  ** opened on a f
25df0 69 6c 65 20 6c 65 73 73 20 74 68 61 6e 20 4e 20  ile less than N 
25e00 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74  bytes in size, t
25e10 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  he output buffer
25e20 20 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20 61 6e   is.** zeroed an
25e30 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
25e40 72 6e 65 64 2e 20 54 68 65 20 72 61 74 69 6f 6e  rned. The ration
25e50 61 6c 65 20 66 6f 72 20 74 68 69 73 20 69 73 20  ale for this is 
25e60 74 68 61 74 20 74 68 69 73 20 0a 2a 2a 20 66 75  that this .** fu
25e70 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
25e80 6f 20 72 65 61 64 20 64 61 74 61 62 61 73 65 20  o read database 
25e90 68 65 61 64 65 72 73 2c 20 61 6e 64 20 61 20 6e  headers, and a n
25ea0 65 77 20 74 72 61 6e 73 69 65 6e 74 20 6f 72 0a  ew transient or.
25eb0 2a 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20 64 61  ** zero sized da
25ec0 74 61 62 61 73 65 20 68 61 73 20 61 20 68 65 61  tabase has a hea
25ed0 64 65 72 20 74 68 61 6e 20 63 6f 6e 73 69 73 74  der than consist
25ee0 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 7a 65  s entirely of ze
25ef0 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  roes..**.** If a
25f00 6e 79 20 49 4f 20 65 72 72 6f 72 20 61 70 61 72  ny IO error apar
25f10 74 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f 49 4f  t from SQLITE_IO
25f20 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 69  ERR_SHORT_READ i
25f30 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 0a 2a  s encountered,.*
25f40 2a 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  * the error code
25f50 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20   is returned to 
25f60 74 68 65 20 63 61 6c 6c 65 72 20 61 6e 64 20 74  the caller and t
25f70 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
25f80 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62 75 66  he.** output buf
25f90 66 65 72 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a  fer undefined..*
25fa0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
25fb0 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72  erReadFileheader
25fc0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
25fd0 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20  int N, unsigned 
25fe0 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20  char *pDest){.  
25ff0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
26000 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44 65  OK;.  memset(pDe
26010 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73  st, 0, N);.  ass
26020 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
26030 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65  er->fd) || pPage
26040 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a  r->tempFile );..
26050 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
26060 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  e is only called
26070 20 62 79 20 62 74 72 65 65 20 69 6d 6d 65 64 69   by btree immedi
26080 61 74 65 6c 79 20 61 66 74 65 72 20 63 72 65 61  ately after crea
26090 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 50 61  ting.  ** the Pa
260a0 67 65 72 20 6f 62 6a 65 63 74 2e 20 20 54 68 65  ger object.  The
260b0 72 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  re has not been 
260c0 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74  an opportunity t
260d0 6f 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20 2a  o transition.  *
260e0 2a 20 74 6f 20 57 41 4c 20 6d 6f 64 65 20 79 65  * to WAL mode ye
260f0 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  t..  */.  assert
26100 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
26110 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28  Pager) );..  if(
26120 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
26130 66 64 29 20 29 7b 0a 20 20 20 20 49 4f 54 52 41  fd) ){.    IOTRA
26140 43 45 28 28 22 44 42 48 44 52 20 25 70 20 30 20  CE(("DBHDR %p 0 
26150 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e  %d\n", pPager, N
26160 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  )).    rc = sqli
26170 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
26180 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20  ->fd, pDest, N, 
26190 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  0);.    if( rc==
261a0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
261b0 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
261c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
261d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
261e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
261f0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
26200 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ay only be calle
26210 64 20 77 68 65 6e 20 61 20 72 65 61 64 2d 74 72  d when a read-tr
26220 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65  ansaction is ope
26230 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65  n on.** the page
26240 72 2e 20 49 74 20 72 65 74 75 72 6e 73 20 74 68  r. It returns th
26250 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
26260 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
26270 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 48  atabase..**.** H
26280 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 66  owever, if the f
26290 69 6c 65 20 69 73 20 62 65 74 77 65 65 6e 20 31  ile is between 1
262a0 20 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a 65 3e   and <page-size>
262b0 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20   bytes in size, 
262c0 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 69 73  then .** this is
262d0 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 31 20   considered a 1 
262e0 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f  page file..*/.vo
262f0 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  id sqlite3PagerP
26300 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a  agecount(Pager *
26310 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50  pPager, int *pnP
26320 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  age){.  assert( 
26330 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
26340 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a  PAGER_READER );.
26350 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
26360 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
26370 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
26380 29 3b 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 28  );.  *pnPage = (
26390 69 6e 74 29 70 50 61 67 65 72 2d 3e 64 62 53 69  int)pPager->dbSi
263a0 7a 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72  ze;.}.../*.** Tr
263b0 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f  y to obtain a lo
263c0 63 6b 20 6f 66 20 74 79 70 65 20 6c 6f 63 6b 74  ck of type lockt
263d0 79 70 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ype on the datab
263e0 61 73 65 20 66 69 6c 65 2e 20 49 66 0a 2a 2a 20  ase file. If.** 
263f0 61 20 73 69 6d 69 6c 61 72 20 6f 72 20 67 72 65  a similar or gre
26400 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 61 6c 72  ater lock is alr
26410 65 61 64 79 20 68 65 6c 64 2c 20 74 68 69 73 20  eady held, this 
26420 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
26430 2d 6f 70 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e  -op.** (returnin
26440 67 20 53 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65  g SQLITE_OK imme
26450 64 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20  diately)..**.** 
26460 4f 74 68 65 72 77 69 73 65 2c 20 61 74 74 65 6d  Otherwise, attem
26470 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  pt to obtain the
26480 20 6c 6f 63 6b 20 75 73 69 6e 67 20 73 71 6c 69   lock using sqli
26490 74 65 33 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e 76  te3OsLock(). Inv
264a0 6f 6b 65 20 0a 2a 2a 20 74 68 65 20 62 75 73 79  oke .** the busy
264b0 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65   callback if the
264c0 20 6c 6f 63 6b 20 69 73 20 63 75 72 72 65 6e 74   lock is current
264d0 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  ly not available
264e0 2e 20 52 65 70 65 61 74 20 0a 2a 2a 20 75 6e 74  . Repeat .** unt
264f0 69 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  il the busy call
26500 62 61 63 6b 20 72 65 74 75 72 6e 73 20 66 61 6c  back returns fal
26510 73 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20  se or until the 
26520 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f  attempt to .** o
26530 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 73  btain the lock s
26540 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52  ucceeds..**.** R
26550 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
26560 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 61  on success and a
26570 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
26580 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e  we cannot obtain
26590 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 20 49 66  .** the lock. If
265a0 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74   the lock is obt
265b0 61 69 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c  ained successful
265c0 6c 79 2c 20 73 65 74 20 74 68 65 20 50 61 67 65  ly, set the Page
265d0 72 2e 73 74 61 74 65 20 0a 2a 2a 20 76 61 72 69  r.state .** vari
265e0 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65  able to locktype
265f0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
26600 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
26610 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
26620 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
26630 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  r, int locktype)
26640 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
26650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26660 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
26670 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a  rn code */..  /*
26680 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 69 73   Check that this
26690 20 69 73 20 65 69 74 68 65 72 20 61 20 6e 6f 2d   is either a no-
266a0 6f 70 20 28 62 65 63 61 75 73 65 20 74 68 65 20  op (because the 
266b0 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 69  requested lock i
266c0 73 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20  s .  ** already 
266d0 68 65 6c 64 29 2c 20 6f 72 20 6f 6e 65 20 6f 66  held), or one of
266e0 20 74 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 73   the transitions
266f0 20 74 68 61 74 20 74 68 65 20 62 75 73 79 2d 68   that the busy-h
26700 61 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61 79 20  andler.  ** may 
26710 62 65 20 69 6e 76 6f 6b 65 64 20 64 75 72 69 6e  be invoked durin
26720 67 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  g, according to 
26730 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76  the comment abov
26740 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61  e.  ** sqlite3Pa
26750 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65  gerSetBusyhandle
26760 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  r()..  */.  asse
26770 72 74 28 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f  rt( (pPager->eLo
26780 63 6b 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a 20 20  ck>=locktype).  
26790 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d       || (pPager-
267a0 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20  >eLock==NO_LOCK 
267b0 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  && locktype==SHA
267c0 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20  RED_LOCK).      
267d0 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f   || (pPager->eLo
267e0 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck==RESERVED_LOC
267f0 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 45  K && locktype==E
26800 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20  XCLUSIVE_LOCK). 
26810 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20   );..  do {.    
26820 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62  rc = pagerLockDb
26830 28 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70  (pPager, locktyp
26840 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63  e);.  }while( rc
26850 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
26860 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61   pPager->xBusyHa
26870 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42  ndler(pPager->pB
26880 75 73 79 48 61 6e 64 6c 65 72 41 72 67 29 20 29  usyHandlerArg) )
26890 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
268a0 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e  ../*.** Function
268b0 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
268c0 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72  onstraint(pPager
268d0 29 20 63 68 65 63 6b 73 20 74 68 61 74 20 6f 6e  ) checks that on
268e0 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c  e of the .** fol
268f0 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65 20 66  lowing is true f
26900 6f 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67  or all dirty pag
26910 65 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  es currently in 
26920 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 3a 0a  the page-cache:.
26930 2a 2a 0a 2a 2a 20 20 20 61 29 20 54 68 65 20 70  **.**   a) The p
26940 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 6c 65  age number is le
26950 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
26960 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20   to the size of 
26970 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 63 75 72  the .**      cur
26980 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 69 6d  rent database im
26990 61 67 65 2c 20 69 6e 20 70 61 67 65 73 2c 20 4f  age, in pages, O
269a0 52 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 69 66 20  R.**.**   b) if 
269b0 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
269c0 20 77 65 72 65 20 77 72 69 74 74 65 6e 20 61 74   were written at
269d0 20 74 68 69 73 20 74 69 6d 65 2c 20 69 74 20 77   this time, it w
269e0 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  ould not.**     
269f0 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f   be necessary to
26a00 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65   write the curre
26a10 6e 74 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 74  nt content out t
26a20 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
26a30 6c 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 64 65  l.**      (as de
26a40 74 65 72 6d 69 6e 65 64 20 62 79 20 66 75 6e 63  termined by func
26a50 74 69 6f 6e 20 73 75 62 6a 52 65 71 75 69 72 65  tion subjRequire
26a60 73 50 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a 2a 20  sPage())..**.** 
26a70 49 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  If the condition
26a80 20 61 73 73 65 72 74 65 64 20 62 79 20 74 68 69   asserted by thi
26a90 73 20 66 75 6e 63 74 69 6f 6e 20 77 65 72 65 20  s function were 
26aa0 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64 20 74 68  not true, and th
26ab0 65 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65 20  e.** dirty page 
26ac0 77 65 72 65 20 74 6f 20 62 65 20 64 69 73 63 61  were to be disca
26ad0 72 64 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61  rded from the ca
26ae0 63 68 65 20 76 69 61 20 74 68 65 20 70 61 67 65  che via the page
26af0 72 53 74 72 65 73 73 28 29 0a 2a 2a 20 72 6f 75  rStress().** rou
26b00 74 69 6e 65 2c 20 70 61 67 65 72 53 74 72 65 73  tine, pagerStres
26b10 73 28 29 20 77 6f 75 6c 64 20 6e 6f 74 20 77 72  s() would not wr
26b20 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
26b30 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 6f 0a  page content to.
26b40 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
26b50 66 69 6c 65 2e 20 49 66 20 61 20 73 61 76 65 70  file. If a savep
26b60 6f 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  oint transaction
26b70 20 77 65 72 65 20 72 6f 6c 6c 65 64 20 62 61 63   were rolled bac
26b80 6b 20 61 66 74 65 72 0a 2a 2a 20 74 68 69 73 20  k after.** this 
26b90 68 61 70 70 65 6e 65 64 2c 20 74 68 65 20 63 6f  happened, the co
26ba0 72 72 65 63 74 20 62 65 68 61 76 69 6f 72 20 77  rrect behavior w
26bb0 6f 75 6c 64 20 62 65 20 74 6f 20 72 65 73 74 6f  ould be to resto
26bc0 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  re the current.*
26bd0 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * content of the
26be0 20 70 61 67 65 2e 20 48 6f 77 65 76 65 72 2c 20   page. However, 
26bf0 73 69 6e 63 65 20 74 68 69 73 20 63 6f 6e 74 65  since this conte
26c00 6e 74 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e  nt is not presen
26c10 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 74  t in either.** t
26c20 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26c30 20 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20   or the portion 
26c40 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  of the rollback 
26c50 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20  journal and .** 
26c60 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  sub-journal roll
26c70 65 64 20 62 61 63 6b 20 74 68 65 20 63 6f 6e 74  ed back the cont
26c80 65 6e 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ent could not be
26c90 20 72 65 73 74 6f 72 65 64 20 61 6e 64 20 74 68   restored and th
26ca0 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d  e.** database im
26cb0 61 67 65 20 77 6f 75 6c 64 20 62 65 63 6f 6d 65  age would become
26cc0 20 63 6f 72 72 75 70 74 2e 20 49 74 20 69 73 20   corrupt. It is 
26cd0 74 68 65 72 65 66 6f 72 65 20 66 6f 72 74 75 6e  therefore fortun
26ce0 61 74 65 20 74 68 61 74 20 0a 2a 2a 20 74 68 69  ate that .** thi
26cf0 73 20 63 69 72 63 75 6d 73 74 61 6e 63 65 20 63  s circumstance c
26d00 61 6e 6e 6f 74 20 61 72 69 73 65 2e 0a 2a 2f 0a  annot arise..*/.
26d10 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
26d20 54 45 5f 44 45 42 55 47 29 0a 73 74 61 74 69 63  TE_DEBUG).static
26d30 20 76 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e   void assertTrun
26d40 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62  cateConstraintCb
26d50 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
26d60 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61  assert( pPg->fla
26d70 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29  gs&PGHDR_DIRTY )
26d80 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73 75 62  ;.  assert( !sub
26d90 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50  jRequiresPage(pP
26da0 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c  g) || pPg->pgno<
26db0 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62  =pPg->pPager->db
26dc0 53 69 7a 65 20 29 3b 0a 7d 0a 73 74 61 74 69 63  Size );.}.static
26dd0 20 76 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e   void assertTrun
26de0 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 50  cateConstraint(P
26df0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
26e00 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 74   sqlite3PcacheIt
26e10 65 72 61 74 65 44 69 72 74 79 28 70 50 61 67 65  erateDirty(pPage
26e20 72 2d 3e 70 50 43 61 63 68 65 2c 20 61 73 73 65  r->pPCache, asse
26e30 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
26e40 61 69 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c 73 65  aintCb);.}.#else
26e50 0a 23 20 64 65 66 69 6e 65 20 61 73 73 65 72 74  .# define assert
26e60 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
26e70 6e 74 28 70 50 61 67 65 72 29 0a 23 65 6e 64 69  nt(pPager).#endi
26e80 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74  f../*.** Truncat
26e90 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
26ea0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6d  database file im
26eb0 61 67 65 20 74 6f 20 6e 50 61 67 65 20 70 61 67  age to nPage pag
26ec0 65 73 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e  es. This .** fun
26ed0 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61  ction does not a
26ee0 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79 20 74  ctually modify t
26ef0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26f00 20 6f 6e 20 64 69 73 6b 2e 20 49 74 20 0a 2a 2a   on disk. It .**
26f10 20 6a 75 73 74 20 73 65 74 73 20 74 68 65 20 69   just sets the i
26f20 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66  nternal state of
26f30 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
26f40 74 20 73 6f 20 74 68 61 74 20 74 68 65 20 0a 2a  t so that the .*
26f50 2a 20 74 72 75 6e 63 61 74 69 6f 6e 20 77 69 6c  * truncation wil
26f60 6c 20 62 65 20 64 6f 6e 65 20 77 68 65 6e 20 74  l be done when t
26f70 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
26f80 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
26f90 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ted..**.** This 
26fa0 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
26fb0 20 63 61 6c 6c 65 64 20 72 69 67 68 74 20 62 65   called right be
26fc0 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20  fore committing 
26fd0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  a transaction..*
26fe0 2a 20 4f 6e 63 65 20 74 68 69 73 20 66 75 6e 63  * Once this func
26ff0 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63 61  tion has been ca
27000 6c 6c 65 64 2c 20 74 68 65 20 74 72 61 6e 73 61  lled, the transa
27010 63 74 69 6f 6e 20 6d 75 73 74 20 65 69 74 68 65  ction must eithe
27020 72 20 62 65 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62  r be.** rolled b
27030 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74 74 65 64  ack or committed
27040 2e 20 49 74 20 69 73 20 6e 6f 74 20 73 61 66 65  . It is not safe
27050 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66 75   to call this fu
27060 6e 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 74 68  nction and.** th
27070 65 6e 20 63 6f 6e 74 69 6e 75 65 20 77 72 69 74  en continue writ
27080 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
27090 61 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ase..*/.void sql
270a0 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
270b0 65 49 6d 61 67 65 28 50 61 67 65 72 20 2a 70 50  eImage(Pager *pP
270c0 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65  ager, Pgno nPage
270d0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ){.  assert( pPa
270e0 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61  ger->dbSize>=nPa
270f0 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
27100 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
27110 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
27120 48 45 4d 4f 44 20 29 3b 0a 20 20 70 50 61 67 65  HEMOD );.  pPage
27130 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67  r->dbSize = nPag
27140 65 3b 0a 0a 20 20 2f 2a 20 41 74 20 6f 6e 65 20  e;..  /* At one 
27150 70 6f 69 6e 74 20 74 68 65 20 63 6f 64 65 20 68  point the code h
27160 65 72 65 20 63 61 6c 6c 65 64 20 61 73 73 65 72  ere called asser
27170 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
27180 69 6e 74 28 29 20 74 6f 0a 20 20 2a 2a 20 65 6e  int() to.  ** en
27190 73 75 72 65 20 74 68 61 74 20 61 6c 6c 20 70 61  sure that all pa
271a0 67 65 73 20 62 65 69 6e 67 20 74 72 75 6e 63 61  ges being trunca
271b0 74 65 64 20 61 77 61 79 20 62 79 20 74 68 69 73  ted away by this
271c0 20 6f 70 65 72 61 74 69 6f 6e 20 61 72 65 2c 0a   operation are,.
271d0 20 20 2a 2a 20 69 66 20 6f 6e 65 20 6f 72 20 6d    ** if one or m
271e0 6f 72 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61  ore savepoints a
271f0 72 65 20 6f 70 65 6e 2c 20 70 72 65 73 65 6e 74  re open, present
27200 20 69 6e 20 74 68 65 20 73 61 76 65 70 6f 69 6e   in the savepoin
27210 74 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  t .  ** journal 
27220 73 6f 20 74 68 61 74 20 74 68 65 79 20 63 61 6e  so that they can
27230 20 62 65 20 72 65 73 74 6f 72 65 64 20 69 66 20   be restored if 
27240 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73  the savepoint is
27250 20 72 6f 6c 6c 65 64 0a 20 20 2a 2a 20 62 61 63   rolled.  ** bac
27260 6b 2e 20 54 68 69 73 20 69 73 20 6e 6f 20 6c 6f  k. This is no lo
27270 6e 67 65 72 20 6e 65 63 65 73 73 61 72 79 20 61  nger necessary a
27280 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
27290 69 73 20 6e 6f 77 20 6f 6e 6c 79 0a 20 20 2a 2a  is now only.  **
272a0 20 63 61 6c 6c 65 64 20 72 69 67 68 74 20 62 65   called right be
272b0 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20  fore committing 
272c0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 53  a transaction. S
272d0 6f 20 61 6c 74 68 6f 75 67 68 20 74 68 65 20 0a  o although the .
272e0 20 20 2a 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    ** Pager objec
272f0 74 20 6d 61 79 20 73 74 69 6c 6c 20 68 61 76 65  t may still have
27300 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
27310 20 28 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69   (Pager.nSavepoi
27320 6e 74 21 3d 30 29 2c 20 0a 20 20 2a 2a 20 74 68  nt!=0), .  ** th
27330 65 79 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c  ey cannot be rol
27340 6c 65 64 20 62 61 63 6b 2e 20 53 6f 20 74 68 65  led back. So the
27350 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
27360 6f 6e 73 74 72 61 69 6e 74 28 29 20 63 61 6c 6c  onstraint() call
27370 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67  .  ** is no long
27380 65 72 20 63 6f 72 72 65 63 74 2e 20 2a 2f 0a 7d  er correct. */.}
27390 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
273a0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
273b0 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69   before attempti
273c0 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ng a hot-journal
273d0 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 74 0a 2a 2a   rollback. It.**
273e0 20 73 79 6e 63 73 20 74 68 65 20 6a 6f 75 72 6e   syncs the journ
273f0 61 6c 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2c  al file to disk,
27400 20 74 68 65 6e 20 73 65 74 73 20 70 50 61 67 65   then sets pPage
27410 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f  r->journalHdr to
27420 20 74 68 65 0a 2a 2a 20 73 69 7a 65 20 6f 66 20   the.** size of 
27430 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
27440 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 67   so that the pag
27450 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f  er_playback() ro
27460 75 74 69 6e 65 20 6b 6e 6f 77 73 0a 2a 2a 20 74  utine knows.** t
27470 68 61 74 20 74 68 65 20 65 6e 74 69 72 65 20 6a  hat the entire j
27480 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20  ournal file has 
27490 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a  been synced..**.
274a0 2a 2a 20 53 79 6e 63 69 6e 67 20 61 20 68 6f 74  ** Syncing a hot
274b0 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 64 69 73 6b  -journal to disk
274c0 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69   before attempti
274d0 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61  ng to roll it ba
274e0 63 6b 20 65 6e 73 75 72 65 73 20 0a 2a 2a 20 74  ck ensures .** t
274f0 68 61 74 20 69 66 20 61 20 70 6f 77 65 72 2d 66  hat if a power-f
27500 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 64 75  ailure occurs du
27510 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63  ring the rollbac
27520 6b 2c 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  k, the process t
27530 68 61 74 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20  hat.** attempts 
27540 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69  rollback followi
27550 6e 67 20 73 79 73 74 65 6d 20 72 65 63 6f 76 65  ng system recove
27560 72 79 20 73 65 65 73 20 74 68 65 20 73 61 6d 65  ry sees the same
27570 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 6e 74   journal.** cont
27580 65 6e 74 20 61 73 20 74 68 69 73 20 70 72 6f 63  ent as this proc
27590 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76  ess..**.** If ev
275a0 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61 73  erything goes as
275b0 20 70 6c 61 6e 6e 65 64 2c 20 53 51 4c 49 54 45   planned, SQLITE
275c0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
275d0 20 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20   Otherwise, .** 
275e0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
275f0 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
27600 69 6e 74 20 70 61 67 65 72 53 79 6e 63 48 6f 74  int pagerSyncHot
27610 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
27620 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
27630 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
27640 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  if( !pPager->noS
27650 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ync ){.    rc = 
27660 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
27670 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54  ager->jfd, SQLIT
27680 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a  E_SYNC_NORMAL);.
27690 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
276a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
276b0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
276c0 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
276d0 64 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72  d, &pPager->jour
276e0 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72  nalHdr);.  }.  r
276f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
27700 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
27710 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 4f 62  _SIZE>0./*.** Ob
27720 74 61 69 6e 20 61 20 72 65 66 65 72 65 6e 63 65  tain a reference
27730 20 74 6f 20 61 20 6d 65 6d 6f 72 79 20 6d 61 70   to a memory map
27740 70 65 64 20 70 61 67 65 20 6f 62 6a 65 63 74 20  ped page object 
27750 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65 72 20  for page number 
27760 70 67 6e 6f 2e 20 0a 2a 2a 20 54 68 65 20 6e 65  pgno. .** The ne
27770 77 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 75 73  w object will us
27780 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20 70 44  e the pointer pD
27790 61 74 61 2c 20 6f 62 74 61 69 6e 65 64 20 66 72  ata, obtained fr
277a0 6f 6d 20 78 46 65 74 63 68 28 29 2e 0a 2a 2a 20  om xFetch()..** 
277b0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73  If successful, s
277c0 65 74 20 2a 70 70 50 61 67 65 20 74 6f 20 70 6f  et *ppPage to po
277d0 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 70  int to the new p
277e0 61 67 65 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a  age reference.**
277f0 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
27800 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65  TE_OK. Otherwise
27810 2c 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69  , return an SQLi
27820 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  te error code an
27830 64 20 73 65 74 0a 2a 2a 20 2a 70 70 50 61 67 65  d set.** *ppPage
27840 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20   to zero..**.** 
27850 50 61 67 65 20 72 65 66 65 72 65 6e 63 65 73 20  Page references 
27860 6f 62 74 61 69 6e 65 64 20 62 79 20 63 61 6c 6c  obtained by call
27870 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
27880 6e 20 73 68 6f 75 6c 64 20 62 65 20 72 65 6c 65  n should be rele
27890 61 73 65 64 0a 2a 2a 20 62 79 20 63 61 6c 6c 69  ased.** by calli
278a0 6e 67 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d  ng pagerReleaseM
278b0 61 70 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61  apPage()..*/.sta
278c0 74 69 63 20 69 6e 74 20 70 61 67 65 72 41 63 71  tic int pagerAcq
278d0 75 69 72 65 4d 61 70 50 61 67 65 28 0a 20 20 50  uireMapPage(.  P
278e0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
278f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27900 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  * Pager object *
27910 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
27920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27930 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
27940 65 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 44  er */.  void *pD
27950 61 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20  ata,            
27960 20 20 20 20 20 20 20 20 2f 2a 20 78 46 65 74 63          /* xFetc
27970 68 28 29 27 64 20 64 61 74 61 20 66 6f 72 20 74  h()'d data for t
27980 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67  his page */.  Pg
27990 48 64 72 20 2a 2a 70 70 50 61 67 65 20 20 20 20  Hdr **ppPage    
279a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
279b0 20 4f 55 54 3a 20 41 63 71 75 69 72 65 64 20 70   OUT: Acquired p
279c0 61 67 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b  age object */.){
279d0 0a 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20  .  PgHdr *p;    
279e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
279f0 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70     /* Memory map
27a00 70 65 64 20 70 61 67 65 20 74 6f 20 72 65 74 75  ped page to retu
27a10 72 6e 20 2a 2f 0a 20 20 0a 20 20 69 66 28 20 70  rn */.  .  if( p
27a20 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65  Pager->pMmapFree
27a30 6c 69 73 74 20 29 7b 0a 20 20 20 20 2a 70 70 50  list ){.    *ppP
27a40 61 67 65 20 3d 20 70 20 3d 20 70 50 61 67 65 72  age = p = pPager
27a50 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b  ->pMmapFreelist;
27a60 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4d 6d  .    pPager->pMm
27a70 61 70 46 72 65 65 6c 69 73 74 20 3d 20 70 2d 3e  apFreelist = p->
27a80 70 44 69 72 74 79 3b 0a 20 20 20 20 70 2d 3e 70  pDirty;.    p->p
27a90 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 61  Dirty = 0;.    a
27aa0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
27ab0 45 78 74 72 61 3e 3d 38 20 29 3b 0a 20 20 20 20  Extra>=8 );.    
27ac0 6d 65 6d 73 65 74 28 70 2d 3e 70 45 78 74 72 61  memset(p->pExtra
27ad0 2c 20 30 2c 20 38 29 3b 0a 20 20 7d 65 6c 73 65  , 0, 8);.  }else
27ae0 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20  {.    *ppPage = 
27af0 70 20 3d 20 28 50 67 48 64 72 20 2a 29 73 71 6c  p = (PgHdr *)sql
27b00 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
27b10 69 7a 65 6f 66 28 50 67 48 64 72 29 20 2b 20 70  izeof(PgHdr) + p
27b20 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a  Pager->nExtra);.
27b30 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a      if( p==0 ){.
27b40 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55        sqlite3OsU
27b50 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66  nfetch(pPager->f
27b60 64 2c 20 28 69 36 34 29 28 70 67 6e 6f 2d 31 29  d, (i64)(pgno-1)
27b70 20 2a 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   * pPager->pageS
27b80 69 7a 65 2c 20 70 44 61 74 61 29 3b 0a 20 20 20  ize, pData);.   
27b90 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
27ba0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
27bb0 20 7d 0a 20 20 20 20 70 2d 3e 70 45 78 74 72 61   }.    p->pExtra
27bc0 20 3d 20 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d   = (void *)&p[1]
27bd0 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d  ;.    p->flags =
27be0 20 50 47 48 44 52 5f 4d 4d 41 50 3b 0a 20 20 20   PGHDR_MMAP;.   
27bf0 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20   p->nRef = 1;.  
27c00 20 20 70 2d 3e 70 50 61 67 65 72 20 3d 20 70 50    p->pPager = pP
27c10 61 67 65 72 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  ager;.  }..  ass
27c20 65 72 74 28 20 70 2d 3e 70 45 78 74 72 61 3d 3d  ert( p->pExtra==
27c30 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d 20 29 3b  (void *)&p[1] );
27c40 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50  .  assert( p->pP
27c50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  age==0 );.  asse
27c60 72 74 28 20 70 2d 3e 66 6c 61 67 73 3d 3d 50 47  rt( p->flags==PG
27c70 48 44 52 5f 4d 4d 41 50 20 29 3b 0a 20 20 61 73  HDR_MMAP );.  as
27c80 73 65 72 74 28 20 70 2d 3e 70 50 61 67 65 72 3d  sert( p->pPager=
27c90 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73  =pPager );.  ass
27ca0 65 72 74 28 20 70 2d 3e 6e 52 65 66 3d 3d 31 20  ert( p->nRef==1 
27cb0 29 3b 0a 0a 20 20 70 2d 3e 70 67 6e 6f 20 3d 20  );..  p->pgno = 
27cc0 70 67 6e 6f 3b 0a 20 20 70 2d 3e 70 44 61 74 61  pgno;.  p->pData
27cd0 20 3d 20 70 44 61 74 61 3b 0a 20 20 70 50 61 67   = pData;.  pPag
27ce0 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2b 2b 3b 0a  er->nMmapOut++;.
27cf0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
27d00 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _OK;.}.#endif../
27d10 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 72  *.** Release a r
27d20 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65  eference to page
27d30 20 70 50 67 2e 20 70 50 67 20 6d 75 73 74 20 68   pPg. pPg must h
27d40 61 76 65 20 62 65 65 6e 20 72 65 74 75 72 6e 65  ave been returne
27d50 64 20 62 79 20 61 6e 20 0a 2a 2a 20 65 61 72 6c  d by an .** earl
27d60 69 65 72 20 63 61 6c 6c 20 74 6f 20 70 61 67 65  ier call to page
27d70 72 41 63 71 75 69 72 65 4d 61 70 50 61 67 65 28  rAcquireMapPage(
27d80 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
27d90 64 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61  d pagerReleaseMa
27da0 70 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  pPage(PgHdr *pPg
27db0 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
27dc0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
27dd0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61  ;.  pPager->nMma
27de0 70 4f 75 74 2d 2d 3b 0a 20 20 70 50 67 2d 3e 70  pOut--;.  pPg->p
27df0 44 69 72 74 79 20 3d 20 70 50 61 67 65 72 2d 3e  Dirty = pPager->
27e00 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 0a 20  pMmapFreelist;. 
27e10 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72   pPager->pMmapFr
27e20 65 65 6c 69 73 74 20 3d 20 70 50 67 3b 0a 0a 20  eelist = pPg;.. 
27e30 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
27e40 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69  >fd->pMethods->i
27e50 56 65 72 73 69 6f 6e 3e 3d 33 20 29 3b 0a 20 20  Version>=3 );.  
27e60 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68  sqlite3OsUnfetch
27e70 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36  (pPager->fd, (i6
27e80 34 29 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 2a  4)(pPg->pgno-1)*
27e90 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
27ea0 2c 20 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 7d  , pPg->pData);.}
27eb0 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c  ../*.** Free all
27ec0 20 50 67 48 64 72 20 6f 62 6a 65 63 74 73 20 73   PgHdr objects s
27ed0 74 6f 72 65 64 20 69 6e 20 74 68 65 20 50 61 67  tored in the Pag
27ee0 65 72 2e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74  er.pMmapFreelist
27ef0 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
27f00 20 76 6f 69 64 20 70 61 67 65 72 46 72 65 65 4d   void pagerFreeM
27f10 61 70 48 64 72 73 28 50 61 67 65 72 20 2a 70 50  apHdrs(Pager *pP
27f20 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
27f30 70 3b 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78  p;.  PgHdr *pNex
27f40 74 3b 0a 20 20 66 6f 72 28 70 3d 70 50 61 67 65  t;.  for(p=pPage
27f50 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74  r->pMmapFreelist
27f60 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20  ; p; p=pNext){. 
27f70 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 44     pNext = p->pD
27f80 69 72 74 79 3b 0a 20 20 20 20 73 71 6c 69 74 65  irty;.    sqlite
27f90 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d  3_free(p);.  }.}
27fa0 0a 0a 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74  ../* Verify that
27fb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
27fc0 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 20 64 65  le has not be de
27fd0 6c 65 74 65 64 20 6f 72 20 72 65 6e 61 6d 65 64  leted or renamed
27fe0 20 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20 75 6e 64   out from.** und
27ff0 65 72 20 74 68 65 20 70 61 67 65 72 2e 20 20 52  er the pager.  R
28000 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
28010 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
28020 69 73 20 73 74 69 6c 6c 20 77 68 65 72 65 20 69  is still where i
28030 74 20 6f 75 67 68 74 0a 2a 2a 20 74 6f 20 62 65  t ought.** to be
28040 20 6f 6e 20 64 69 73 6b 2e 20 20 52 65 74 75 72   on disk.  Retur
28050 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 28 53 51 4c 49  n non-zero (SQLI
28060 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f  TE_READONLY_DBMO
28070 56 45 44 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  VED or some othe
28080 72 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20  r error.** code 
28090 66 72 6f 6d 20 73 71 6c 69 74 65 33 4f 73 41 63  from sqlite3OsAc
280a0 63 65 73 73 28 29 29 20 69 66 20 74 68 65 20 64  cess()) if the d
280b0 61 74 61 62 61 73 65 20 68 61 73 20 67 6f 6e 65  atabase has gone
280c0 20 6d 69 73 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61   missing..*/.sta
280d0 74 69 63 20 69 6e 74 20 64 61 74 61 62 61 73 65  tic int database
280e0 49 73 55 6e 6d 6f 76 65 64 28 50 61 67 65 72 20  IsUnmoved(Pager 
280f0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
28100 62 48 61 73 4d 6f 76 65 64 20 3d 20 30 3b 0a 20  bHasMoved = 0;. 
28110 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
28120 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
28130 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
28140 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65  _OK;.  if( pPage
28150 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 20 29 20 72  r->dbSize==0 ) r
28160 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
28170 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
28180 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  r->zFilename && 
28190 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
281a0 65 5b 30 5d 20 29 3b 0a 20 20 72 63 20 3d 20 73  e[0] );.  rc = s
281b0 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
281c0 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  rol(pPager->fd, 
281d0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 48 41 53  SQLITE_FCNTL_HAS
281e0 5f 4d 4f 56 45 44 2c 20 26 62 48 61 73 4d 6f 76  _MOVED, &bHasMov
281f0 65 64 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ed);.  if( rc==S
28200 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29  QLITE_NOTFOUND )
28210 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
28220 48 41 53 5f 4d 4f 56 45 44 20 66 69 6c 65 2d 63  HAS_MOVED file-c
28230 6f 6e 74 72 6f 6c 20 69 73 20 75 6e 69 6d 70 6c  ontrol is unimpl
28240 65 6d 65 6e 74 65 64 2c 20 61 73 73 75 6d 65 20  emented, assume 
28250 74 68 61 74 20 74 68 65 20 66 69 6c 65 0a 20 20  that the file.  
28260 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65 65    ** has not bee
28270 6e 20 6d 6f 76 65 64 2e 20 20 54 68 61 74 20 69  n moved.  That i
28280 73 20 74 68 65 20 68 69 73 74 6f 72 69 63 61 6c  s the historical
28290 20 62 65 68 61 76 69 6f 72 20 6f 66 20 53 51 4c   behavior of SQL
282a0 69 74 65 3a 20 70 72 69 6f 72 20 74 6f 0a 20 20  ite: prior to.  
282b0 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 38    ** version 3.8
282c0 2e 33 2c 20 69 74 20 6e 65 76 65 72 20 63 68 65  .3, it never che
282d0 63 6b 65 64 20 2a 2f 0a 20 20 20 20 72 63 20 3d  cked */.    rc =
282e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
282f0 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
28300 54 45 5f 4f 4b 20 26 26 20 62 48 61 73 4d 6f 76  TE_OK && bHasMov
28310 65 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  ed ){.    rc = S
28320 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44  QLITE_READONLY_D
28330 42 4d 4f 56 45 44 3b 0a 20 20 7d 0a 20 20 72 65  BMOVED;.  }.  re
28340 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
28350 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20  ** Shutdown the 
28360 70 61 67 65 20 63 61 63 68 65 2e 20 20 46 72 65  page cache.  Fre
28370 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64  e all memory and
28380 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73   close all files
28390 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61  ..**.** If a tra
283a0 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20  nsaction was in 
283b0 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68  progress when th
283c0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
283d0 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72  lled, that.** tr
283e0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
283f0 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f  led back.  All o
28400 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73  utstanding pages
28410 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64   are invalidated
28420 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65  .** and their me
28430 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20 20  mory is freed.  
28440 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75  Any attempt to u
28450 73 65 20 61 20 70 61 67 65 20 61 73 73 6f 63 69  se a page associ
28460 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69  ated.** with thi
28470 73 20 70 61 67 65 20 63 61 63 68 65 20 61 66 74  s page cache aft
28480 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
28490 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69   returns will li
284a0 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69  kely.** result i
284b0 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a  n a coredump..**
284c0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
284d0 6e 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64  n always succeed
284e0 73 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  s. If a transact
284f0 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e  ion is active an
28500 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d   attempt.** is m
28510 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62  ade to roll it b
28520 61 63 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ack. If an error
28530 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74   occurs during t
28540 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20  he rollback .** 
28550 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61  a hot journal ma
28560 79 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65  y be left in the
28570 20 66 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20   filesystem but 
28580 6e 6f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  no error is retu
28590 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63  rned.** to the c
285a0 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  aller..*/.int sq
285b0 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
285c0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 73  Pager *pPager, s
285d0 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 75  qlite3 *db){.  u
285e0 38 20 2a 70 54 6d 70 20 3d 20 28 75 38 2a 29 70  8 *pTmp = (u8*)p
285f0 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
28600 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 20 7c  ;.  assert( db |
28610 7c 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  | pagerUseWal(pP
28620 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73  ager)==0 );.  as
28630 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
28640 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
28650 20 29 3b 0a 20 20 64 69 73 61 62 6c 65 5f 73 69   );.  disable_si
28660 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
28670 73 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65  s();.  sqlite3Be
28680 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
28690 29 3b 0a 20 20 70 61 67 65 72 46 72 65 65 4d 61  );.  pagerFreeMa
286a0 70 48 64 72 73 28 70 50 61 67 65 72 29 3b 0a 20  pHdrs(pPager);. 
286b0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 43   /* pPager->errC
286c0 6f 64 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  ode = 0; */.  pP
286d0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
286e0 6f 64 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  ode = 0;.#ifndef
286f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
28700 0a 20 20 7b 0a 20 20 20 20 75 38 20 2a 61 20 3d  .  {.    u8 *a =
28710 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
28720 64 62 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 57  db || pPager->pW
28730 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  al==0 );.    if(
28740 20 64 62 20 26 26 20 30 3d 3d 28 64 62 2d 3e 66   db && 0==(db->f
28750 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4e 6f  lags & SQLITE_No
28760 43 6b 70 74 4f 6e 43 6c 6f 73 65 29 20 0a 20 20  CkptOnClose) .  
28770 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d     && SQLITE_OK=
28780 3d 64 61 74 61 62 61 73 65 49 73 55 6e 6d 6f 76  =databaseIsUnmov
28790 65 64 28 70 50 61 67 65 72 29 0a 20 20 20 20 29  ed(pPager).    )
287a0 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 54 6d 70  {.      a = pTmp
287b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
287c0 74 65 33 57 61 6c 43 6c 6f 73 65 28 70 50 61 67  te3WalClose(pPag
287d0 65 72 2d 3e 70 57 61 6c 2c 20 64 62 2c 20 70 50  er->pWal, db, pP
287e0 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61  ager->walSyncFla
287f0 67 73 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  gs, pPager->page
28800 53 69 7a 65 2c 61 29 3b 0a 20 20 20 20 70 50 61  Size,a);.    pPa
28810 67 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a 20  ger->pWal = 0;. 
28820 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 61 67 65   }.#endif.  page
28830 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
28840 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
28850 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b      pager_unlock
28860 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73  (pPager);.  }els
28870 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 69 74 20  e{.    /* If it 
28880 69 73 20 6f 70 65 6e 2c 20 73 79 6e 63 20 74 68  is open, sync th
28890 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62  e journal file b
288a0 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 55 6e  efore calling Un
288b0 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 2e  lockAndRollback.
288c0 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20  .    ** If this 
288d0 69 73 20 6e 6f 74 20 64 6f 6e 65 2c 20 74 68 65  is not done, the
288e0 6e 20 61 6e 20 75 6e 73 79 6e 63 65 64 20 70 6f  n an unsynced po
288f0 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f 70 65  rtion of the ope
28900 6e 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a  n journal .    *
28910 2a 20 66 69 6c 65 20 6d 61 79 20 62 65 20 70 6c  * file may be pl
28920 61 79 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74  ayed back into t
28930 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20  he database. If 
28940 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  a power failure 
28950 6f 63 63 75 72 73 20 0a 20 20 20 20 2a 2a 20 77  occurs .    ** w
28960 68 69 6c 65 20 74 68 69 73 20 69 73 20 68 61 70  hile this is hap
28970 70 65 6e 69 6e 67 2c 20 74 68 65 20 64 61 74 61  pening, the data
28980 62 61 73 65 20 63 6f 75 6c 64 20 62 65 63 6f 6d  base could becom
28990 65 20 63 6f 72 72 75 70 74 2e 0a 20 20 20 20 2a  e corrupt..    *
289a0 2a 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 20 65  *.    ** If an e
289b0 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
289c0 65 20 74 72 79 69 6e 67 20 74 6f 20 73 79 6e 63  e trying to sync
289d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 68   the journal, sh
289e0 69 66 74 20 74 68 65 20 70 61 67 65 72 0a 20 20  ift the pager.  
289f0 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 45 52    ** into the ER
28a00 52 4f 52 20 73 74 61 74 65 2e 20 54 68 69 73 20  ROR state. This 
28a10 63 61 75 73 65 73 20 55 6e 6c 6f 63 6b 41 6e 64  causes UnlockAnd
28a20 52 6f 6c 6c 62 61 63 6b 20 74 6f 20 75 6e 6c 6f  Rollback to unlo
28a30 63 6b 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  ck the.    ** da
28a40 74 61 62 61 73 65 20 61 6e 64 20 63 6c 6f 73 65  tabase and close
28a50 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
28a60 65 20 77 69 74 68 6f 75 74 20 61 74 74 65 6d 70  e without attemp
28a70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 0a  ting to roll it.
28a80 20 20 20 20 2a 2a 20 62 61 63 6b 20 6f 72 20 66      ** back or f
28a90 69 6e 61 6c 69 7a 65 20 69 74 2e 20 54 68 65 20  inalize it. The 
28aa0 6e 65 78 74 20 64 61 74 61 62 61 73 65 20 75 73  next database us
28ab0 65 72 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20  er will have to 
28ac0 64 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 20  do hot-journal. 
28ad0 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 62     ** rollback b
28ae0 65 66 6f 72 65 20 61 63 63 65 73 73 69 6e 67 20  efore accessing 
28af0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
28b00 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
28b10 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
28b20 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 70  >jfd) ){.      p
28b30 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
28b40 72 2c 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a  r, pagerSyncHotJ
28b50 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 29 3b  ournal(pPager));
28b60 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72  .    }.    pager
28b70 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63  UnlockAndRollbac
28b80 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  k(pPager);.  }. 
28b90 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
28ba0 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e 61  nMalloc();.  ena
28bb0 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
28bc0 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 50 41 47  _errors();.  PAG
28bd0 45 52 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  ERTRACE(("CLOSE 
28be0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
28bf0 50 61 67 65 72 29 29 29 3b 0a 20 20 49 4f 54 52  Pager)));.  IOTR
28c00 41 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e  ACE(("CLOSE %p\n
28c10 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 73 71  ", pPager)).  sq
28c20 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
28c30 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 73 71 6c  ger->jfd);.  sql
28c40 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
28c50 65 72 2d 3e 66 64 29 3b 0a 20 20 73 71 6c 69 74  er->fd);.  sqlit
28c60 65 33 50 61 67 65 46 72 65 65 28 70 54 6d 70 29  e3PageFree(pTmp)
28c70 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
28c80 65 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70  eClose(pPager->p
28c90 50 43 61 63 68 65 29 3b 0a 0a 23 69 66 64 65 66  PCache);..#ifdef
28ca0 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
28cb0 43 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  C.  if( pPager->
28cc0 78 43 6f 64 65 63 46 72 65 65 20 29 20 70 50 61  xCodecFree ) pPa
28cd0 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 28  ger->xCodecFree(
28ce0 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b  pPager->pCodec);
28cf0 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
28d00 74 28 20 21 70 50 61 67 65 72 2d 3e 61 53 61 76  t( !pPager->aSav
28d10 65 70 6f 69 6e 74 20 26 26 20 21 70 50 61 67 65  epoint && !pPage
28d20 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b  r->pInJournal );
28d30 0a 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70  .  assert( !isOp
28d40 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
28d50 26 26 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  && !isOpen(pPage
28d60 72 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a 20 20 73  r->sjfd) );..  s
28d70 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
28d80 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  er);.  return SQ
28d90 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20  LITE_OK;.}..#if 
28da0 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29  !defined(NDEBUG)
28db0 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
28dc0 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52  TE_TEST)./*.** R
28dd0 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e  eturn the page n
28de0 75 6d 62 65 72 20 66 6f 72 20 70 61 67 65 20 70  umber for page p
28df0 50 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69  Pg..*/.Pgno sqli
28e00 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
28e10 65 72 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  er(DbPage *pPg){
28e20 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70  .  return pPg->p
28e30 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  gno;.}.#endif../
28e40 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74  *.** Increment t
28e50 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
28e60 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e  nt for page pPg.
28e70 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
28e80 50 61 67 65 72 52 65 66 28 44 62 50 61 67 65 20  PagerRef(DbPage 
28e90 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69 74 65 33  *pPg){.  sqlite3
28ea0 50 63 61 63 68 65 52 65 66 28 70 50 67 29 3b 0a  PcacheRef(pPg);.
28eb0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68  }../*.** Sync th
28ec0 65 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f 74  e journal. In ot
28ed0 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20  her words, make 
28ee0 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67  sure all the pag
28ef0 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20  es that have.** 
28f00 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
28f10 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65  the journal have
28f20 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65   actually reache
28f30 64 20 74 68 65 20 73 75 72 66 61 63 65 20 6f 66  d the surface of
28f40 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64   the.** disk and
28f50 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64   can be restored
28f60 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   in the event of
28f70 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
28f80 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  ollback..**.** I
28f90 66 20 74 68 65 20 50 61 67 65 72 2e 6e 6f 53 79  f the Pager.noSy
28fa0 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  nc flag is set, 
28fb0 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
28fc0 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
28fd0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  * Otherwise, the
28fe0 20 61 63 74 69 6f 6e 73 20 72 65 71 75 69 72 65   actions require
28ff0 64 20 64 65 70 65 6e 64 20 6f 6e 20 74 68 65 20  d depend on the 
29000 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 61 6e 64  journal-mode and
29010 20 74 68 65 20 0a 2a 2a 20 64 65 76 69 63 65 20   the .** device 
29020 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  characteristics 
29030 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  of the file-syst
29040 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  em, as follows:.
29050 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65  **.**   * If the
29060 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
29070 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f   an in-memory jo
29080 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f 20 61  urnal file, no a
29090 63 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20 20  ction need.**   
290a0 20 20 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a    be taken..**.*
290b0 2a 20 20 20 2a 20 4f 74 68 65 72 77 69 73 65 2c  *   * Otherwise,
290c0 20 69 66 20 74 68 65 20 64 65 76 69 63 65 20 64   if the device d
290d0 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20  oes not support 
290e0 74 68 65 20 53 41 46 45 5f 41 50 50 45 4e 44 20  the SAFE_APPEND 
290f0 70 72 6f 70 65 72 74 79 2c 0a 2a 2a 20 20 20 20  property,.**    
29100 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66   then the nRec f
29110 69 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f 73 74  ield of the most
29120 20 72 65 63 65 6e 74 6c 79 20 77 72 69 74 74 65   recently writte
29130 6e 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  n journal header
29140 0a 2a 2a 20 20 20 20 20 69 73 20 75 70 64 61 74  .**     is updat
29150 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  ed to contain th
29160 65 20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f 75 72  e number of jour
29170 6e 61 6c 20 72 65 63 6f 72 64 73 20 74 68 61 74  nal records that
29180 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 62 65 65   have.**     bee
29190 6e 20 77 72 69 74 74 65 6e 20 66 6f 6c 6c 6f 77  n written follow
291a0 69 6e 67 20 69 74 2e 20 49 66 20 74 68 65 20 70  ing it. If the p
291b0 61 67 65 72 20 69 73 20 6f 70 65 72 61 74 69 6e  ager is operatin
291c0 67 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a  g in full-sync.*
291d0 2a 20 20 20 20 20 6d 6f 64 65 2c 20 74 68 65 6e  *     mode, then
291e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
291f0 65 20 69 73 20 73 79 6e 63 65 64 20 62 65 66 6f  e is synced befo
29200 72 65 20 74 68 69 73 20 66 69 65 6c 64 20 69 73  re this field is
29210 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   updated..**.** 
29220 20 20 2a 20 49 66 20 74 68 65 20 64 65 76 69 63    * If the devic
29230 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f  e does not suppo
29240 72 74 20 74 68 65 20 53 45 51 55 45 4e 54 49 41  rt the SEQUENTIA
29250 4c 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 6e  L property, then
29260 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c   .**     journal
29270 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 2e   file is synced.
29280 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70 73  .**.** Or, in ps
29290 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a  eudo-code:.**.**
292a0 20 20 20 69 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d     if( NOT <in-m
292b0 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e 20 29  emory journal> )
292c0 7b 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54  {.**     if( NOT
292d0 20 53 41 46 45 5f 41 50 50 45 4e 44 20 29 7b 0a   SAFE_APPEND ){.
292e0 2a 2a 20 20 20 20 20 20 20 69 66 28 20 3c 66 75  **       if( <fu
292f0 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e 20 29 20  ll-sync mode> ) 
29300 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66  xSync(<journal f
29310 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20 20 20 20  ile>);.**       
29320 3c 75 70 64 61 74 65 20 6e 52 65 63 20 66 69 65  <update nRec fie
29330 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a  ld>.**     } .**
29340 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53 45 51       if( NOT SEQ
29350 55 45 4e 54 49 41 4c 20 29 20 78 53 79 6e 63 28  UENTIAL ) xSync(
29360 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b  <journal file>);
29370 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 49 66  .**   }.**.** If
29380 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69   successful, thi
29390 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73  s routine clears
293a0 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
293b0 53 59 4e 43 20 66 6c 61 67 20 6f 66 20 65 76 65  SYNC flag of eve
293c0 72 79 20 0a 2a 2a 20 70 61 67 65 20 63 75 72 72  ry .** page curr
293d0 65 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d 65  ently held in me
293e0 6d 6f 72 79 20 62 65 66 6f 72 65 20 72 65 74 75  mory before retu
293f0 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e  rning SQLITE_OK.
29400 20 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72   If an IO.** err
29410 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
29420 64 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65  d, then the IO e
29430 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
29440 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
29450 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ler..*/.static i
29460 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50  nt syncJournal(P
29470 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
29480 74 20 6e 65 77 48 64 72 29 7b 0a 20 20 69 6e 74  t newHdr){.  int
29490 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
294a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
294b0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
294c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
294d0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
294e0 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a  WRITER_CACHEMOD.
294f0 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
29500 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
29510 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29  WRITER_DBMOD.  )
29520 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
29530 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
29540 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
29550 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
29560 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 72  (pPager) );..  r
29570 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
29580 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70 50  ExclusiveLock(pP
29590 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21  ager);.  if( rc!
295a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
295b0 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 21  urn rc;..  if( !
295c0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
295d0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  {.    assert( !p
295e0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
295f0 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65  );.    if( isOpe
29600 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26  n(pPager->jfd) &
29610 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
29620 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55  lMode!=PAGER_JOU
29630 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
29640 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69  ){.      const i
29650 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33  nt iDc = sqlite3
29660 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
29670 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
29680 66 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  fd);.      asser
29690 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
296a0 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 20 20 20  ->jfd) );..     
296b0 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c   if( 0==(iDc&SQL
296c0 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
296d0 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20  PPEND) ){.      
296e0 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
296f0 64 65 61 6c 73 20 77 69 74 68 20 61 6e 20 6f 62  deals with an ob
29700 73 63 75 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49  scure problem. I
29710 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65  f the last conne
29720 63 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ction.        **
29730 20 74 68 61 74 20 77 72 6f 74 65 20 74 6f 20 74   that wrote to t
29740 68 69 73 20 64 61 74 61 62 61 73 65 20 77 61 73  his database was
29750 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 70 65   operating in pe
29760 72 73 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c  rsistent-journal
29770 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65  .        ** mode
29780 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
29790 61 6c 20 66 69 6c 65 20 6d 61 79 20 61 74 20 74  al file may at t
297a0 68 69 73 20 70 6f 69 6e 74 20 61 63 74 75 61 6c  his point actual
297b0 6c 79 20 62 65 20 6c 61 72 67 65 72 0a 20 20 20  ly be larger.   
297c0 20 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67       ** than Pag
297d0 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79  er.journalOff by
297e0 74 65 73 2e 20 49 66 20 74 68 65 20 6e 65 78 74  tes. If the next
297f0 20 74 68 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f   thing in the jo
29800 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a  urnal.        **
29810 20 66 69 6c 65 20 68 61 70 70 65 6e 73 20 74 6f   file happens to
29820 20 62 65 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65   be a journal-he
29830 61 64 65 72 20 28 77 72 69 74 74 65 6e 20 61 73  ader (written as
29840 20 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20 20   part of the.   
29850 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73       ** previous
29860 20 63 6f 6e 6e 65 63 74 69 6f 6e 27 73 20 74 72   connection's tr
29870 61 6e 73 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20  ansaction), and 
29880 61 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72  a crash or power
29890 2d 66 61 69 6c 75 72 65 20 0a 20 20 20 20 20 20  -failure .      
298a0 20 20 2a 2a 20 6f 63 63 75 72 73 20 61 66 74 65    ** occurs afte
298b0 72 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65  r nRec is update
298c0 64 20 62 75 74 20 62 65 66 6f 72 65 20 74 68 69  d but before thi
298d0 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69  s connection wri
298e0 74 65 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  tes .        ** 
298f0 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 74 6f  anything else to
29900 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
29910 65 20 28 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f  e (or commits/ro
29920 6c 6c 73 20 62 61 63 6b 20 69 74 73 20 0a 20 20  lls back its .  
29930 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63        ** transac
29940 74 69 6f 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69  tion), then SQLi
29950 74 65 20 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f  te may become co
29960 6e 66 75 73 65 64 20 77 68 65 6e 20 64 6f 69 6e  nfused when doin
29970 67 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  g the .        *
29980 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  * hot-journal ro
29990 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67  llback following
299a0 20 72 65 63 6f 76 65 72 79 2e 20 49 74 20 6d 61   recovery. It ma
299b0 79 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a  y roll back all.
299c0 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68          ** of th
299d0 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64  is connections d
299e0 61 74 61 2c 20 74 68 65 6e 20 70 72 6f 63 65 65  ata, then procee
299f0 64 20 74 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63  d to rolling bac
29a00 6b 20 74 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20  k the old,.     
29a10 20 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74     ** out-of-dat
29a20 65 20 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c  e data that foll
29a30 6f 77 73 20 69 74 2e 20 44 61 74 61 62 61 73 65  ows it. Database
29a40 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20   corruption..   
29a50 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
29a60 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  ** To work aroun
29a70 64 20 74 68 69 73 2c 20 69 66 20 74 68 65 20 6a  d this, if the j
29a80 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73  ournal file does
29a90 20 61 70 70 65 61 72 20 74 6f 20 63 6f 6e 74 61   appear to conta
29aa0 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  in.        ** a 
29ab0 76 61 6c 69 64 20 68 65 61 64 65 72 20 66 6f 6c  valid header fol
29ac0 6c 6f 77 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75  lowing Pager.jou
29ad0 72 6e 61 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72  rnalOff, then wr
29ae0 69 74 65 20 61 20 30 78 30 30 0a 20 20 20 20 20  ite a 0x00.     
29af0 20 20 20 2a 2a 20 62 79 74 65 20 74 6f 20 74 68     ** byte to th
29b00 65 20 73 74 61 72 74 20 6f 66 20 69 74 20 74 6f  e start of it to
29b10 20 70 72 65 76 65 6e 74 20 69 74 20 66 72 6f 6d   prevent it from
29b20 20 62 65 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65   being recognize
29b30 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  d..        **.  
29b40 20 20 20 20 20 20 2a 2a 20 56 61 72 69 61 62 6c        ** Variabl
29b50 65 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74  e iNextHdrOffset
29b60 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f   is set to the o
29b70 66 66 73 65 74 20 61 74 20 77 68 69 63 68 20 74  ffset at which t
29b80 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  his.        ** p
29b90 72 6f 62 6c 65 6d 61 74 69 63 20 68 65 61 64 65  roblematic heade
29ba0 72 20 77 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66  r will occur, if
29bb0 20 69 74 20 65 78 69 73 74 73 2e 20 61 4d 61 67   it exists. aMag
29bc0 69 63 20 69 73 20 75 73 65 64 20 0a 20 20 20 20  ic is used .    
29bd0 20 20 20 20 2a 2a 20 61 73 20 61 20 74 65 6d 70      ** as a temp
29be0 6f 72 61 72 79 20 62 75 66 66 65 72 20 74 6f 20  orary buffer to 
29bf0 69 6e 73 70 65 63 74 20 74 68 65 20 66 69 72 73  inspect the firs
29c00 74 20 63 6f 75 70 6c 65 20 6f 66 20 62 79 74 65  t couple of byte
29c10 73 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  s of.        ** 
29c20 74 68 65 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f  the potential jo
29c30 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20  urnal header..  
29c40 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
29c50 20 69 36 34 20 69 4e 65 78 74 48 64 72 4f 66 66   i64 iNextHdrOff
29c60 73 65 74 3b 0a 20 20 20 20 20 20 20 20 75 38 20  set;.        u8 
29c70 61 4d 61 67 69 63 5b 38 5d 3b 0a 20 20 20 20 20  aMagic[8];.     
29c80 20 20 20 75 38 20 7a 48 65 61 64 65 72 5b 73 69     u8 zHeader[si
29c90 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
29ca0 69 63 29 2b 34 5d 3b 0a 0a 20 20 20 20 20 20 20  ic)+4];..       
29cb0 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c   memcpy(zHeader,
29cc0 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
29cd0 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
29ce0 61 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20 20  agic));.        
29cf0 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
29d00 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
29d10 61 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61 67 65  alMagic)], pPage
29d20 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20  r->nRec);..     
29d30 20 20 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65     iNextHdrOffse
29d40 74 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66  t = journalHdrOf
29d50 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  fset(pPager);.  
29d60 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
29d70 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
29d80 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 38 2c  >jfd, aMagic, 8,
29d90 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29   iNextHdrOffset)
29da0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
29db0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30  ==SQLITE_OK && 0
29dc0 3d 3d 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  ==memcmp(aMagic,
29dd0 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
29de0 38 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  8) ){.          
29df0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
29e00 7a 65 72 6f 62 79 74 65 20 3d 20 30 3b 0a 20 20  zerobyte = 0;.  
29e10 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
29e20 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
29e30 65 72 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f 62 79  er->jfd, &zeroby
29e40 74 65 2c 20 31 2c 20 69 4e 65 78 74 48 64 72 4f  te, 1, iNextHdrO
29e50 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20  ffset);.        
29e60 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
29e70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  !=SQLITE_OK && r
29e80 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c!=SQLITE_IOERR_
29e90 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
29ea0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
29eb0 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  c;.        }..  
29ec0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
29ed0 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e  he nRec value in
29ee0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
29ef0 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20 69  ile header. If i
29f00 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c  n.        ** ful
29f10 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f  l-synchronous mo
29f20 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75  de, sync the jou
29f30 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73  rnal first. This
29f40 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20   ensures that.  
29f50 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74        ** all dat
29f60 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74  a has really hit
29f70 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65   the disk before
29f80 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64   nRec is updated
29f90 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20   to mark.       
29fa0 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64   ** it as a cand
29fb0 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61  idate for rollba
29fc0 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ck..        **. 
29fd0 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69         ** This i
29fe0 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 69  s not required i
29ff0 66 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  f the persistent
2a000 20 6d 65 64 69 61 20 73 75 70 70 6f 72 74 73 20   media supports 
2a010 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 53  the.        ** S
2a020 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65  AFE_APPEND prope
2a030 72 74 79 2e 20 42 65 63 61 75 73 65 20 69 6e 20  rty. Because in 
2a040 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20  this case it is 
2a050 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a 20 20  not possible .  
2a060 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 67 61 72        ** for gar
2a070 62 61 67 65 20 64 61 74 61 20 74 6f 20 62 65 20  bage data to be 
2a080 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
2a090 66 69 6c 65 2c 20 74 68 65 20 6e 52 65 63 20 66  file, the nRec f
2a0a0 69 65 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ield.        ** 
2a0b0 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
2a0c0 68 20 30 78 46 46 46 46 46 46 46 46 20 77 68 65  h 0xFFFFFFFF whe
2a0d0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  n the journal he
2a0e0 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 0a  ader is written.
2a0f0 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e          ** and n
2a100 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65  ever needs to be
2a110 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20   updated..      
2a120 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
2a130 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
2a140 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c  c && 0==(iDc&SQL
2a150 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
2a160 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  TIAL) ){.       
2a170 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
2a180 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20  SYNC journal of 
2a190 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
2a1a0 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20  Pager)));.      
2a1b0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53      IOTRACE(("JS
2a1c0 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  YNC %p\n", pPage
2a1d0 72 29 29 0a 20 20 20 20 20 20 20 20 20 20 72 63  r)).          rc
2a1e0 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
2a1f0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
2a200 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29  ager->syncFlags)
2a210 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2a220 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
2a230 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2a240 20 20 20 7d 0a 20 20 20 20 20 20 20 20 49 4f 54     }.        IOT
2a250 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25  RACE(("JHDR %p %
2a260 6c 6c 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20  lld\n", pPager, 
2a270 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
2a280 64 72 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63  dr));.        rc
2a290 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
2a2a0 65 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e(.            p
2a2b0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61  Pager->jfd, zHea
2a2c0 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61  der, sizeof(zHea
2a2d0 64 65 72 29 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  der), pPager->jo
2a2e0 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 20  urnalHdr.       
2a2f0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
2a300 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
2a310 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2a320 20 7d 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d   }.      if( 0==
2a330 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41  (iDc&SQLITE_IOCA
2a340 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b  P_SEQUENTIAL) ){
2a350 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52  .        PAGERTR
2a360 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e  ACE(("SYNC journ
2a370 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47  al of %d\n", PAG
2a380 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
2a390 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
2a3a0 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70  ("JSYNC %p\n", p
2a3b0 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20  Pager)).        
2a3c0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
2a3d0 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
2a3e0 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
2a3f0 73 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28 70  s| .          (p
2a400 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
2a410 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  ==SQLITE_SYNC_FU
2a420 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44  LL?SQLITE_SYNC_D
2a430 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20  ATAONLY:0).     
2a440 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
2a450 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2a460 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
2a470 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 50 61 67     }..      pPag
2a480 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
2a490 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2a4a0 4f 66 66 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  Off;.      if( n
2a4b0 65 77 48 64 72 20 26 26 20 30 3d 3d 28 69 44 63  ewHdr && 0==(iDc
2a4c0 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41  &SQLITE_IOCAP_SA
2a4d0 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20  FE_APPEND) ){.  
2a4e0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52        pPager->nR
2a4f0 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ec = 0;.        
2a500 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61  rc = writeJourna
2a510 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
2a520 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2a530 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
2a540 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
2a550 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
2a560 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
2a570 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
2a580 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d  alOff;.    }.  }
2a590 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20 74 68  ..  /* Unless th
2a5a0 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f  e pager is in no
2a5b0 53 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a  Sync mode, the j
2a5c0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 61 73 20  ournal file was 
2a5d0 6a 75 73 74 20 0a 20 20 2a 2a 20 73 75 63 63 65  just .  ** succe
2a5e0 73 73 66 75 6c 6c 79 20 73 79 6e 63 65 64 2e 20  ssfully synced. 
2a5f0 45 69 74 68 65 72 20 77 61 79 2c 20 63 6c 65 61  Either way, clea
2a600 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  r the PGHDR_NEED
2a610 5f 53 59 4e 43 20 66 6c 61 67 20 6f 6e 20 0a 20  _SYNC flag on . 
2a620 20 2a 2a 20 61 6c 6c 20 70 61 67 65 73 2e 0a 20   ** all pages.. 
2a630 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61   */.  sqlite3Pca
2a640 63 68 65 43 6c 65 61 72 53 79 6e 63 46 6c 61 67  cheClearSyncFlag
2a650 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  s(pPager->pPCach
2a660 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 53  e);.  pPager->eS
2a670 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49  tate = PAGER_WRI
2a680 54 45 52 5f 44 42 4d 4f 44 3b 0a 20 20 61 73 73  TER_DBMOD;.  ass
2a690 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
2a6a0 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
2a6b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
2a6c0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
2a6d0 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  The argument is 
2a6e0 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 20 6c  the first in a l
2a6f0 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 64 69  inked list of di
2a700 72 74 79 20 70 61 67 65 73 20 63 6f 6e 6e 65 63  rty pages connec
2a710 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 50 67  ted.** by the Pg
2a720 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74  Hdr.pDirty point
2a730 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  er. This functio
2a740 6e 20 77 72 69 74 65 73 20 65 61 63 68 20 6f 6e  n writes each on
2a750 65 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d  e of the.** in-m
2a760 65 6d 6f 72 79 20 70 61 67 65 73 20 69 6e 20 74  emory pages in t
2a770 68 65 20 6c 69 73 74 20 74 6f 20 74 68 65 20 64  he list to the d
2a780 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
2a790 65 20 61 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a  e argument may.*
2a7a0 2a 20 62 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65  * be NULL, repre
2a7b0 73 65 6e 74 69 6e 67 20 61 6e 20 65 6d 70 74 79  senting an empty
2a7c0 20 6c 69 73 74 2e 20 49 6e 20 74 68 69 73 20 63   list. In this c
2a7d0 61 73 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ase this functio
2a7e0 6e 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e  n is.** a no-op.
2a7f0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72  .**.** The pager
2a800 20 6d 75 73 74 20 68 6f 6c 64 20 61 74 20 6c 65   must hold at le
2a810 61 73 74 20 61 20 52 45 53 45 52 56 45 44 20 6c  ast a RESERVED l
2a820 6f 63 6b 20 77 68 65 6e 20 74 68 69 73 20 66 75  ock when this fu
2a830 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c  nction.** is cal
2a840 6c 65 64 2e 20 42 65 66 6f 72 65 20 77 72 69 74  led. Before writ
2a850 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 74 6f 20  ing anything to 
2a860 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2a870 65 2c 20 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20  e, this lock.** 
2a880 69 73 20 75 70 67 72 61 64 65 64 20 74 6f 20 61  is upgraded to a
2a890 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
2a8a0 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 63 61  . If the lock ca
2a8b0 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64  nnot be obtained
2a8c0 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59  ,.** SQLITE_BUSY
2a8d0 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
2a8e0 20 6e 6f 20 64 61 74 61 20 69 73 20 77 72 69 74   no data is writ
2a8f0 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62  ten to the datab
2a900 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a  ase file..** .**
2a910 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
2a920 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 70 61 67   a temp-file pag
2a930 65 72 20 61 6e 64 20 74 68 65 20 61 63 74 75 61  er and the actua
2a940 6c 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 69  l file-system fi
2a950 6c 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74  le.** is not yet
2a960 20 6f 70 65 6e 2c 20 69 74 20 69 73 20 63 72 65   open, it is cre
2a970 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20  ated and opened 
2a980 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20  before any data 
2a990 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f  is .** written o
2a9a0 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74  ut..**.** Once t
2a9b0 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e  he lock has been
2a9c0 20 75 70 67 72 61 64 65 64 20 61 6e 64 2c 20 69   upgraded and, i
2a9d0 66 20 6e 65 63 65 73 73 61 72 79 2c 20 74 68 65  f necessary, the
2a9e0 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a   file opened,.**
2a9f0 20 74 68 65 20 70 61 67 65 73 20 61 72 65 20 77   the pages are w
2aa00 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68  ritten out to th
2aa10 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2aa20 69 6e 20 6c 69 73 74 20 6f 72 64 65 72 2e 20 57  in list order. W
2aa30 72 69 74 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65  riting.** a page
2aa40 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 69   is skipped if i
2aa50 74 20 6d 65 65 74 73 20 65 69 74 68 65 72 20 6f  t meets either o
2aa60 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
2aa70 63 72 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20  criteria:.**.** 
2aa80 20 20 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d    * The page num
2aa90 62 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74  ber is greater t
2aaa0 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65  han Pager.dbSize
2aab0 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20  , or.**   * The 
2aac0 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45  PGHDR_DONT_WRITE
2aad0 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20   flag is set on 
2aae0 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  the page..**.** 
2aaf0 49 66 20 77 72 69 74 69 6e 67 20 6f 75 74 20 61  If writing out a
2ab00 20 70 61 67 65 20 63 61 75 73 65 73 20 74 68 65   page causes the
2ab10 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
2ab20 6f 20 67 72 6f 77 2c 20 50 61 67 65 72 2e 64 62  o grow, Pager.db
2ab30 46 69 6c 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75  FileSize.** is u
2ab40 70 64 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67  pdated according
2ab50 6c 79 2e 20 49 66 20 70 61 67 65 20 31 20 69 73  ly. If page 1 is
2ab60 20 77 72 69 74 74 65 6e 20 6f 75 74 2c 20 74 68   written out, th
2ab70 65 6e 20 74 68 65 20 76 61 6c 75 65 20 63 61 63  en the value cac
2ab80 68 65 64 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e  hed.** in Pager.
2ab90 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20  dbFileVers[] is 
2aba0 75 70 64 61 74 65 64 20 74 6f 20 6d 61 74 63 68  updated to match
2abb0 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20 73   the new value s
2abc0 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20  tored in.** the 
2abd0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
2abe0 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69  *.** If everythi
2abf0 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ng is successful
2ac00 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
2ac10 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
2ac20 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75  O error .** occu
2ac30 72 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20  rs, an IO error 
2ac40 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
2ac50 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 45 58 43  . Or, if the EXC
2ac60 4c 55 53 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e  LUSIVE lock cann
2ac70 6f 74 0a 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65  ot.** be obtaine
2ac80 64 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  d, SQLITE_BUSY i
2ac90 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
2aca0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
2acb0 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50  write_pagelist(P
2acc0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
2acd0 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  Hdr *pList){.  i
2ace0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2acf0 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
2ad00 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2ad10 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73  de */..  /* This
2ad20 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
2ad30 79 20 63 61 6c 6c 65 64 20 66 6f 72 20 72 6f 6c  y called for rol
2ad40 6c 62 61 63 6b 20 70 61 67 65 72 73 20 69 6e 20  lback pagers in 
2ad50 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 73 74 61  WRITER_DBMOD sta
2ad60 74 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  te. */.  assert(
2ad70 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
2ad80 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
2ad90 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  t( pPager->tempF
2ada0 69 6c 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ile || pPager->e
2adb0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
2adc0 54 45 52 5f 44 42 4d 4f 44 20 29 3b 0a 20 20 61  TER_DBMOD );.  a
2add0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
2ade0 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
2adf0 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
2ae00 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
2ae10 3e 66 64 29 20 7c 7c 20 70 4c 69 73 74 2d 3e 70  >fd) || pList->p
2ae20 44 69 72 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 2f  Dirty==0 );..  /
2ae30 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73  * If the file is
2ae40 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 68 61 73   a temp-file has
2ae50 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70   not yet been op
2ae60 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f  ened, open it no
2ae70 77 2e 20 49 74 0a 20 20 2a 2a 20 69 73 20 6e 6f  w. It.  ** is no
2ae80 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 72  t possible for r
2ae90 63 20 74 6f 20 62 65 20 6f 74 68 65 72 20 74 68  c to be other th
2aea0 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  an SQLITE_OK if 
2aeb0 74 68 69 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a  this branch.  **
2aec0 20 69 73 20 74 61 6b 65 6e 2c 20 61 73 20 70 61   is taken, as pa
2aed0 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
2aee0 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f  () is a no-op fo
2aef0 72 20 74 65 6d 70 2d 66 69 6c 65 73 2e 0a 20 20  r temp-files..  
2af00 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e  */.  if( !isOpen
2af10 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
2af20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2af30 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20  er->tempFile && 
2af40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
2af50 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f  .    rc = pagerO
2af60 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20  pentemp(pPager, 
2af70 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
2af80 65 72 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20  er->vfsFlags);. 
2af90 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20   }..  /* Before 
2afa0 74 68 65 20 66 69 72 73 74 20 77 72 69 74 65 2c  the first write,
2afb0 20 67 69 76 65 20 74 68 65 20 56 46 53 20 61 20   give the VFS a 
2afc0 68 69 6e 74 20 6f 66 20 77 68 61 74 20 74 68 65  hint of what the
2afd0 20 66 69 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65   final.  ** file
2afe0 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 2e 0a 20   size will be.. 
2aff0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 72 63   */.  assert( rc
2b000 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69  !=SQLITE_OK || i
2b010 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
2b020 29 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ) );.  if( rc==S
2b030 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 26 26 20  QLITE_OK .   && 
2b040 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69  pPager->dbHintSi
2b050 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ze<pPager->dbSiz
2b060 65 0a 20 20 20 26 26 20 28 70 4c 69 73 74 2d 3e  e.   && (pList->
2b070 70 44 69 72 74 79 20 7c 7c 20 70 4c 69 73 74 2d  pDirty || pList-
2b080 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62  >pgno>pPager->db
2b090 48 69 6e 74 53 69 7a 65 29 0a 20 20 29 7b 0a 20  HintSize).  ){. 
2b0a0 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
2b0b0 20 73 7a 46 69 6c 65 20 3d 20 70 50 61 67 65 72   szFile = pPager
2b0c0 2d 3e 70 61 67 65 53 69 7a 65 20 2a 20 28 73 71  ->pageSize * (sq
2b0d0 6c 69 74 65 33 5f 69 6e 74 36 34 29 70 50 61 67  lite3_int64)pPag
2b0e0 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
2b0f0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
2b100 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d  trolHint(pPager-
2b110 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  >fd, SQLITE_FCNT
2b120 4c 5f 53 49 5a 45 5f 48 49 4e 54 2c 20 26 73 7a  L_SIZE_HINT, &sz
2b130 46 69 6c 65 29 3b 0a 20 20 20 20 70 50 61 67 65  File);.    pPage
2b140 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d 20  r->dbHintSize = 
2b150 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
2b160 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72 63    }..  while( rc
2b170 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
2b180 4c 69 73 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f  List ){.    Pgno
2b190 20 70 67 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e 70   pgno = pList->p
2b1a0 67 6e 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  gno;..    /* If 
2b1b0 74 68 65 72 65 20 61 72 65 20 64 69 72 74 79 20  there are dirty 
2b1c0 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61 67  pages in the pag
2b1d0 65 20 63 61 63 68 65 20 77 69 74 68 20 70 61 67  e cache with pag
2b1e0 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65  e numbers greate
2b1f0 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61  r.    ** than Pa
2b200 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73  ger.dbSize, this
2b210 20 6d 65 61 6e 73 20 73 71 6c 69 74 65 33 50 61   means sqlite3Pa
2b220 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65  gerTruncateImage
2b230 28 29 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f  () was called to
2b240 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65  .    ** make the
2b250 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70   file smaller (p
2b260 72 65 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74  resumably by aut
2b270 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20  o-vacuum code). 
2b280 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20  Do not write.   
2b290 20 2a 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67   ** any such pag
2b2a0 65 73 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a  es to the file..
2b2b0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c      **.    ** Al
2b2c0 73 6f 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74 65  so, do not write
2b2d0 20 6f 75 74 20 61 6e 79 20 70 61 67 65 20 74 68   out any page th
2b2e0 61 74 20 68 61 73 20 74 68 65 20 50 47 48 44 52  at has the PGHDR
2b2f0 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67  _DONT_WRITE flag
2b300 0a 20 20 20 20 2a 2a 20 73 65 74 20 28 73 65 74  .    ** set (set
2b310 20 62 79 20 73 71 6c 69 74 65 33 50 61 67 65 72   by sqlite3Pager
2b320 44 6f 6e 74 57 72 69 74 65 28 29 29 2e 0a 20 20  DontWrite())..  
2b330 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e    */.    if( pgn
2b340 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  o<=pPager->dbSiz
2b350 65 20 26 26 20 30 3d 3d 28 70 4c 69 73 74 2d 3e  e && 0==(pList->
2b360 66 6c 61 67 73 26 50 47 48 44 52 5f 44 4f 4e 54  flags&PGHDR_DONT
2b370 5f 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20 20  _WRITE) ){.     
2b380 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28 70   i64 offset = (p
2b390 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
2b3a0 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20 20  er->pageSize;   
2b3b0 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 77 72 69  /* Offset to wri
2b3c0 74 65 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72  te */.      char
2b3d0 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 20   *pData;        
2b3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b3f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
2b400 74 61 20 74 6f 20 77 72 69 74 65 20 2a 2f 20 20  ta to write */  
2b410 20 20 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74    ..      assert
2b420 28 20 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26  ( (pList->flags&
2b430 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
2b440 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
2b450 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20   pList->pgno==1 
2b460 29 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68  ) pager_write_ch
2b470 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 4c 69 73  angecounter(pLis
2b480 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e  t);..      /* En
2b490 63 6f 64 65 20 74 68 65 20 64 61 74 61 62 61 73  code the databas
2b4a0 65 20 2a 2f 0a 20 20 20 20 20 20 43 4f 44 45 43  e */.      CODEC
2b4b0 32 28 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d  2(pPager, pList-
2b4c0 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 36 2c  >pData, pgno, 6,
2b4d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2b4e0 4f 4d 45 4d 5f 42 4b 50 54 2c 20 70 44 61 74 61  OMEM_BKPT, pData
2b4f0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69  );..      /* Wri
2b500 74 65 20 6f 75 74 20 74 68 65 20 70 61 67 65 20  te out the page 
2b510 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20 20 20 72  data. */.      r
2b520 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
2b530 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  te(pPager->fd, p
2b540 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
2b550 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b  geSize, offset);
2b560 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 61  ..      /* If pa
2b570 67 65 20 31 20 77 61 73 20 6a 75 73 74 20 77 72  ge 1 was just wr
2b580 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20 50 61  itten, update Pa
2b590 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 20 74  ger.dbFileVers t
2b5a0 6f 20 6d 61 74 63 68 0a 20 20 20 20 20 20 2a 2a  o match.      **
2b5b0 20 74 68 65 20 76 61 6c 75 65 20 6e 6f 77 20 73   the value now s
2b5c0 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74  tored in the dat
2b5d0 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 77  abase file. If w
2b5e0 72 69 74 69 6e 67 20 74 68 69 73 20 0a 20 20 20  riting this .   
2b5f0 20 20 20 2a 2a 20 70 61 67 65 20 63 61 75 73 65     ** page cause
2b600 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  d the database f
2b610 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 75 70 64  ile to grow, upd
2b620 61 74 65 20 64 62 46 69 6c 65 53 69 7a 65 2e 20  ate dbFileSize. 
2b630 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2b640 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20  if( pgno==1 ){. 
2b650 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
2b660 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
2b670 73 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c 20 73  s, &pData[24], s
2b680 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62  izeof(pPager->db
2b690 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20  FileVers));.    
2b6a0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 67    }.      if( pg
2b6b0 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  no>pPager->dbFil
2b6c0 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
2b6d0 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53   pPager->dbFileS
2b6e0 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20  ize = pgno;.    
2b6f0 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
2b700 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54  ->aStat[PAGER_ST
2b710 41 54 5f 57 52 49 54 45 5d 2b 2b 3b 0a 0a 20 20  AT_WRITE]++;..  
2b720 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 61 6e      /* Update an
2b730 79 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73  y backup objects
2b740 20 63 6f 70 79 69 6e 67 20 74 68 65 20 63 6f 6e   copying the con
2b750 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61  tents of this pa
2b760 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71  ger. */.      sq
2b770 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74  lite3BackupUpdat
2b780 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75  e(pPager->pBacku
2b790 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 70 4c  p, pgno, (u8*)pL
2b7a0 69 73 74 2d 3e 70 44 61 74 61 29 3b 0a 0a 20 20  ist->pData);..  
2b7b0 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
2b7c0 22 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25  "STORE %d page %
2b7d0 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c  d hash(%08x)\n",
2b7e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2b7f0 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
2b800 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72  er), pgno, pager
2b810 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29  _pagehash(pList)
2b820 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  ));.      IOTRAC
2b830 45 28 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c  E(("PGOUT %p %d\
2b840 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f  n", pPager, pgno
2b850 29 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f  ));.      PAGER_
2b860 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67  INCR(sqlite3_pag
2b870 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74  er_writedb_count
2b880 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2b890 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
2b8a0 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65  "NOSTORE %d page
2b8b0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
2b8c0 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b  pPager), pgno));
2b8d0 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72  .    }.    pager
2b8e0 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 4c  _set_pagehash(pL
2b8f0 69 73 74 29 3b 0a 20 20 20 20 70 4c 69 73 74 20  ist);.    pList 
2b900 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b  = pList->pDirty;
2b910 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
2b920 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75  c;.}../*.** Ensu
2b930 72 65 20 74 68 61 74 20 74 68 65 20 73 75 62 2d  re that the sub-
2b940 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2b950 6f 70 65 6e 2e 20 49 66 20 69 74 20 69 73 20 61  open. If it is a
2b960 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 69  lready open, thi
2b970 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  s .** function i
2b980 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
2b990 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
2b9a0 74 75 72 6e 65 64 20 69 66 20 65 76 65 72 79 74  turned if everyt
2b9b0 68 69 6e 67 20 67 6f 65 73 20 61 63 63 6f 72 64  hing goes accord
2b9c0 69 6e 67 20 74 6f 20 70 6c 61 6e 2e 20 41 6e 20  ing to plan. An 
2b9d0 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  .** SQLITE_IOERR
2b9e0 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20  _XXX error code 
2b9f0 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61  is returned if a
2ba00 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
2ba10 4f 73 4f 70 65 6e 28 29 20 0a 2a 2a 20 66 61 69  OsOpen() .** fai
2ba20 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
2ba30 74 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c  t openSubJournal
2ba40 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
2ba50 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2ba60 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 69 73  TE_OK;.  if( !is
2ba70 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66  Open(pPager->sjf
2ba80 64 29 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  d) ){.    const 
2ba90 69 6e 74 20 66 6c 61 67 73 20 3d 20 20 53 51 4c  int flags =  SQL
2baa0 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52  ITE_OPEN_SUBJOUR
2bab0 4e 41 4c 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  NAL | SQLITE_OPE
2bac0 4e 5f 52 45 41 44 57 52 49 54 45 20 0a 20 20 20  N_READWRITE .   
2bad0 20 20 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e     | SQLITE_OPEN
2bae0 5f 43 52 45 41 54 45 20 7c 20 53 51 4c 49 54 45  _CREATE | SQLITE
2baf0 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20  _OPEN_EXCLUSIVE 
2bb00 0a 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f  .      | SQLITE_
2bb10 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
2bb20 53 45 3b 0a 20 20 20 20 69 6e 74 20 6e 53 74 6d  SE;.    int nStm
2bb30 74 53 70 69 6c 6c 20 3d 20 73 71 6c 69 74 65 33  tSpill = sqlite3
2bb40 43 6f 6e 66 69 67 2e 6e 53 74 6d 74 53 70 69 6c  Config.nStmtSpil
2bb50 6c 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  l;.    if( pPage
2bb60 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
2bb70 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2bb80 45 5f 4d 45 4d 4f 52 59 20 7c 7c 20 70 50 61 67  E_MEMORY || pPag
2bb90 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  er->subjInMemory
2bba0 20 29 7b 0a 20 20 20 20 20 20 6e 53 74 6d 74 53   ){.      nStmtS
2bbb0 70 69 6c 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 7d  pill = -1;.    }
2bbc0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2bbd0 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61  3JournalOpen(pPa
2bbe0 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70 50  ger->pVfs, 0, pP
2bbf0 61 67 65 72 2d 3e 73 6a 66 64 2c 20 66 6c 61 67  ager->sjfd, flag
2bc00 73 2c 20 6e 53 74 6d 74 53 70 69 6c 6c 29 3b 0a  s, nStmtSpill);.
2bc10 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2bc20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
2bc30 20 61 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65   a record of the
2bc40 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f   current state o
2bc50 66 20 70 61 67 65 20 70 50 67 20 74 6f 20 74 68  f page pPg to th
2bc60 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a  e sub-journal. .
2bc70 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
2bc80 66 75 6c 2c 20 73 65 74 20 74 68 65 20 62 69 74  ful, set the bit
2bc90 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
2bca0 6f 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 74  o pPg->pgno in t
2bcb0 68 65 20 62 69 74 76 65 63 73 0a 2a 2a 20 66 6f  he bitvecs.** fo
2bcc0 72 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70  r all open savep
2bcd0 6f 69 6e 74 73 20 62 65 66 6f 72 65 20 72 65 74  oints before ret
2bce0 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  urning..**.** Th
2bcf0 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
2bd00 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  rns SQLITE_OK if
2bd10 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73   everything is s
2bd20 75 63 63 65 73 73 66 75 6c 2c 20 61 6e 20 49 4f  uccessful, an IO
2bd30 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69  .** error code i
2bd40 66 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f  f the attempt to
2bd50 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 73 75   write to the su
2bd60 62 2d 6a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c  b-journal fails,
2bd70 20 6f 72 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e   or .** SQLITE_N
2bd80 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63  OMEM if a malloc
2bd90 20 66 61 69 6c 73 20 77 68 69 6c 65 20 73 65 74   fails while set
2bda0 74 69 6e 67 20 61 20 62 69 74 20 69 6e 20 61 20  ting a bit in a 
2bdb0 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 62 69 74  savepoint.** bit
2bdc0 76 65 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  vec..*/.static i
2bdd0 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67  nt subjournalPag
2bde0 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
2bdf0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2be00 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  _OK;.  Pager *pP
2be10 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
2be20 65 72 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  er;.  if( pPager
2be30 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
2be40 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2be50 5f 4f 46 46 20 29 7b 0a 0a 20 20 20 20 2f 2a 20  _OFF ){..    /* 
2be60 4f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75  Open the sub-jou
2be70 72 6e 61 6c 2c 20 69 66 20 69 74 20 68 61 73 20  rnal, if it has 
2be80 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e  not already been
2be90 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 20 20 61   opened */.    a
2bea0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75  ssert( pPager->u
2beb0 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20  seJournal );.   
2bec0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
2bed0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20  pPager->jfd) || 
2bee0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
2bef0 65 72 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  er) );.    asser
2bf00 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
2bf10 2d 3e 73 6a 66 64 29 20 7c 7c 20 70 50 61 67 65  ->sjfd) || pPage
2bf20 72 2d 3e 6e 53 75 62 52 65 63 3d 3d 30 20 29 3b  r->nSubRec==0 );
2bf30 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67  .    assert( pag
2bf40 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
2bf50 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 61   .         || pa
2bf60 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 61 67  geInJournal(pPag
2bf70 65 72 2c 20 70 50 67 29 20 0a 20 20 20 20 20 20  er, pPg) .      
2bf80 20 20 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e     || pPg->pgno>
2bf90 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
2bfa0 7a 65 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 72  ze .    );.    r
2bfb0 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e  c = openSubJourn
2bfc0 61 6c 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20  al(pPager);..   
2bfd0 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d 6a   /* If the sub-j
2bfe0 6f 75 72 6e 61 6c 20 77 61 73 20 6f 70 65 6e 65  ournal was opene
2bff0 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 28  d successfully (
2c000 6f 72 20 77 61 73 20 61 6c 72 65 61 64 79 20 6f  or was already o
2c010 70 65 6e 29 2c 0a 20 20 20 20 2a 2a 20 77 72 69  pen),.    ** wri
2c020 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72  te the journal r
2c030 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 66  ecord into the f
2c040 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ile.  */.    if(
2c050 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2c060 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 44  {.      void *pD
2c070 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61  ata = pPg->pData
2c080 3b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66 73  ;.      i64 offs
2c090 65 74 20 3d 20 28 69 36 34 29 70 50 61 67 65 72  et = (i64)pPager
2c0a0 2d 3e 6e 53 75 62 52 65 63 2a 28 34 2b 70 50 61  ->nSubRec*(4+pPa
2c0b0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
2c0c0 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74        char *pDat
2c0d0 61 32 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  a2;..#if SQLITE_
2c0e0 48 41 53 5f 43 4f 44 45 43 20 20 20 0a 20 20 20  HAS_CODEC   .   
2c0f0 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
2c100 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a  subjInMemory ){.
2c110 20 20 20 20 20 20 20 20 43 4f 44 45 43 32 28 70          CODEC2(p
2c120 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
2c130 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75  g->pgno, 7, retu
2c140 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
2c150 42 4b 50 54 2c 20 70 44 61 74 61 32 29 3b 0a 20  BKPT, pData2);. 
2c160 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
2c170 66 0a 20 20 20 20 20 20 70 44 61 74 61 32 20 3d  f.      pData2 =
2c180 20 70 44 61 74 61 3b 0a 20 20 20 20 20 20 50 41   pData;.      PA
2c190 47 45 52 54 52 41 43 45 28 28 22 53 54 4d 54 2d  GERTRACE(("STMT-
2c1a0 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
2c1b0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
2c1c0 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
2c1d0 6f 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  o));.      rc = 
2c1e0 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
2c1f0 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66 73 65 74  er->sjfd, offset
2c200 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
2c210 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2c220 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2c230 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
2c240 72 69 74 65 28 70 50 61 67 65 72 2d 3e 73 6a 66  rite(pPager->sjf
2c250 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65  d, pData2, pPage
2c260 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66  r->pageSize, off
2c270 73 65 74 2b 34 29 3b 0a 20 20 20 20 20 20 7d 0a  set+4);.      }.
2c280 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
2c290 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2c2a0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 75  .    pPager->nSu
2c2b0 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61 73 73 65  bRec++;.    asse
2c2c0 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76  rt( pPager->nSav
2c2d0 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20 20 20  epoint>0 );.    
2c2e0 72 63 20 3d 20 61 64 64 54 6f 53 61 76 65 70 6f  rc = addToSavepo
2c2f0 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65  intBitvecs(pPage
2c300 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  r, pPg->pgno);. 
2c310 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2c320 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62  }.static int sub
2c330 6a 6f 75 72 6e 61 6c 50 61 67 65 49 66 52 65 71  journalPageIfReq
2c340 75 69 72 65 64 28 50 67 48 64 72 20 2a 70 50 67  uired(PgHdr *pPg
2c350 29 7b 0a 20 20 69 66 28 20 73 75 62 6a 52 65 71  ){.  if( subjReq
2c360 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20 29  uiresPage(pPg) )
2c370 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 75 62  {.    return sub
2c380 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29  journalPage(pPg)
2c390 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
2c3a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2c3b0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
2c3c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
2c3d0 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 63 61  alled by the pca
2c3e0 63 68 65 20 6c 61 79 65 72 20 77 68 65 6e 20 69  che layer when i
2c3f0 74 20 68 61 73 20 72 65 61 63 68 65 64 20 73 6f  t has reached so
2c400 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72  me.** soft memor
2c410 79 20 6c 69 6d 69 74 2e 20 54 68 65 20 66 69 72  y limit. The fir
2c420 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
2c430 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 61   pointer to a Pa
2c440 67 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63  ger object.** (c
2c450 61 73 74 20 61 73 20 61 20 76 6f 69 64 2a 29 2e  ast as a void*).
2c460 20 54 68 65 20 70 61 67 65 72 20 69 73 20 61 6c   The pager is al
2c470 77 61 79 73 20 27 70 75 72 67 65 61 62 6c 65 27  ways 'purgeable'
2c480 20 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f   (not an in-memo
2c490 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 29 2e  ry.** database).
2c4a0 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
2c4b0 6d 65 6e 74 20 69 73 20 61 20 72 65 66 65 72 65  ment is a refere
2c4c0 6e 63 65 20 74 6f 20 61 20 70 61 67 65 20 74 68  nce to a page th
2c4d0 61 74 20 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e  at is .** curren
2c4e0 74 6c 79 20 64 69 72 74 79 20 62 75 74 20 68 61  tly dirty but ha
2c4f0 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  s no outstanding
2c500 20 72 65 66 65 72 65 6e 63 65 73 2e 20 54 68 65   references. The
2c510 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61   page.** is alwa
2c520 79 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ys associated wi
2c530 74 68 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  th the Pager obj
2c540 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
2c550 65 20 66 69 72 73 74 20 0a 2a 2a 20 61 72 67 75  e first .** argu
2c560 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ment..**.** The 
2c570 6a 6f 62 20 6f 66 20 74 68 69 73 20 66 75 6e 63  job of this func
2c580 74 69 6f 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20  tion is to make 
2c590 70 50 67 20 63 6c 65 61 6e 20 62 79 20 77 72 69  pPg clean by wri
2c5a0 74 69 6e 67 20 69 74 73 20 63 6f 6e 74 65 6e 74  ting its content
2c5b0 73 0a 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20  s.** out to the 
2c5c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69  database file, i
2c5d0 66 20 70 6f 73 73 69 62 6c 65 2e 20 54 68 69 73  f possible. This
2c5e0 20 6d 61 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e   may involve syn
2c5f0 63 69 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  cing the.** jour
2c600 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a  nal file. .**.**
2c610 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
2c620 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
2c630 65 43 6c 65 61 6e 28 29 20 69 73 20 63 61 6c 6c  eClean() is call
2c640 65 64 20 6f 6e 20 74 68 65 20 70 61 67 65 20 61  ed on the page a
2c650 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  nd.** SQLITE_OK 
2c660 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
2c670 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
2c680 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20  while trying to 
2c690 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 70 61 67 65  make the.** page
2c6a0 20 63 6c 65 61 6e 2c 20 74 68 65 20 49 4f 20 65   clean, the IO e
2c6b0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
2c6c0 75 72 6e 65 64 2e 20 49 66 20 74 68 65 20 70 61  urned. If the pa
2c6d0 67 65 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20  ge cannot be.** 
2c6e0 6d 61 64 65 20 63 6c 65 61 6e 20 66 6f 72 20 73  made clean for s
2c6f0 6f 6d 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e  ome other reason
2c700 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f  , but no error o
2c710 63 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49  ccurs, then SQLI
2c720 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75  TE_OK.** is retu
2c730 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 50  rned by sqlite3P
2c740 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29  cacheMakeClean()
2c750 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a   is not called..
2c760 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
2c770 67 65 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a  gerStress(void *
2c780 70 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  p, PgHdr *pPg){.
2c790 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
2c7a0 3d 20 28 50 61 67 65 72 20 2a 29 70 3b 0a 20 20  = (Pager *)p;.  
2c7b0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2c7c0 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  OK;..  assert( p
2c7d0 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67  Pg->pPager==pPag
2c7e0 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er );.  assert( 
2c7f0 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
2c800 5f 44 49 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20  _DIRTY );..  /* 
2c810 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 4e  The doNotSpill N
2c820 4f 53 59 4e 43 20 62 69 74 20 69 73 20 73 65 74  OSYNC bit is set
2c830 20 64 75 72 69 6e 67 20 74 69 6d 65 73 20 77 68   during times wh
2c840 65 6e 20 64 6f 69 6e 67 20 61 20 73 79 6e 63 20  en doing a sync 
2c850 6f 66 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  of.  ** journal 
2c860 28 61 6e 64 20 61 64 64 69 6e 67 20 61 20 6e 65  (and adding a ne
2c870 77 20 68 65 61 64 65 72 29 20 69 73 20 6e 6f 74  w header) is not
2c880 20 61 6c 6c 6f 77 65 64 2e 20 20 54 68 69 73 20   allowed.  This 
2c890 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69  occurs.  ** duri
2c8a0 6e 67 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ng calls to sqli
2c8b0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
2c8c0 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20  while trying to 
2c8d0 6a 6f 75 72 6e 61 6c 20 6d 75 6c 74 69 70 6c 65  journal multiple
2c8e0 0a 20 20 2a 2a 20 70 61 67 65 73 20 62 65 6c 6f  .  ** pages belo
2c8f0 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 73 61 6d  nging to the sam
2c900 65 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2a 0a 20  e sector..  **. 
2c910 20 2a 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70 69   ** The doNotSpi
2c920 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20  ll ROLLBACK and 
2c930 4f 46 46 20 62 69 74 73 20 69 6e 68 69 62 69 74  OFF bits inhibit
2c940 73 20 61 6c 6c 20 63 61 63 68 65 20 73 70 69 6c  s all cache spil
2c950 6c 69 6e 67 0a 20 20 2a 2a 20 72 65 67 61 72 64  ling.  ** regard
2c960 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20  less of whether 
2c970 6f 72 20 6e 6f 74 20 61 20 73 79 6e 63 20 69 73  or not a sync is
2c980 20 72 65 71 75 69 72 65 64 2e 20 20 54 68 69 73   required.  This
2c990 20 69 73 20 73 65 74 20 64 75 72 69 6e 67 0a 20   is set during. 
2c9a0 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f   ** a rollback o
2c9b0 72 20 62 79 20 75 73 65 72 20 72 65 71 75 65 73  r by user reques
2c9c0 74 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  t, respectively.
2c9d0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 70 69 6c 6c  .  **.  ** Spill
2c9e0 69 6e 67 20 69 73 20 61 6c 73 6f 20 70 72 6f 68  ing is also proh
2c9f0 69 62 69 74 65 64 20 77 68 65 6e 20 69 6e 20 61  ibited when in a
2ca00 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 73 69  n error state si
2ca10 6e 63 65 20 74 68 61 74 20 63 6f 75 6c 64 0a 20  nce that could. 
2ca20 20 2a 2a 20 6c 65 61 64 20 74 6f 20 64 61 74 61   ** lead to data
2ca30 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
2ca40 20 20 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e     In the curren
2ca50 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
2ca60 20 69 74 20 0a 20 20 2a 2a 20 69 73 20 69 6d 70   it .  ** is imp
2ca70 6f 73 73 69 62 6c 65 20 66 6f 72 20 73 71 6c 69  ossible for sqli
2ca80 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 29  te3PcacheFetch()
2ca90 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 77 69   to be called wi
2caa0 74 68 20 63 72 65 61 74 65 46 6c 61 67 3d 3d 33  th createFlag==3
2cab0 0a 20 20 2a 2a 20 77 68 69 6c 65 20 69 6e 20 74  .  ** while in t
2cac0 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  he error state, 
2cad0 68 65 6e 63 65 20 69 74 20 69 73 20 69 6d 70 6f  hence it is impo
2cae0 73 73 69 62 6c 65 20 66 6f 72 20 74 68 69 73 20  ssible for this 
2caf0 72 6f 75 74 69 6e 65 20 74 6f 0a 20 20 2a 2a 20  routine to.  ** 
2cb00 62 65 20 63 61 6c 6c 65 64 20 69 6e 20 74 68 65  be called in the
2cb10 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 20 4e   error state.  N
2cb20 65 76 65 72 74 68 65 6c 65 73 73 2c 20 77 65 20  evertheless, we 
2cb30 69 6e 63 6c 75 64 65 20 61 20 4e 45 56 45 52 28  include a NEVER(
2cb40 29 0a 20 20 2a 2a 20 74 65 73 74 20 66 6f 72 20  ).  ** test for 
2cb50 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20  the error state 
2cb60 61 73 20 61 20 73 61 66 65 67 75 61 72 64 20 61  as a safeguard a
2cb70 67 61 69 6e 73 74 20 66 75 74 75 72 65 20 63 68  gainst future ch
2cb80 61 6e 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  anges..  */.  if
2cb90 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e  ( NEVER(pPager->
2cba0 65 72 72 43 6f 64 65 29 20 29 20 72 65 74 75 72  errCode) ) retur
2cbb0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 74  n SQLITE_OK;.  t
2cbc0 65 73 74 63 61 73 65 28 20 70 50 61 67 65 72 2d  estcase( pPager-
2cbd0 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50  >doNotSpill & SP
2cbe0 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b  ILLFLAG_ROLLBACK
2cbf0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
2cc00 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
2cc10 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 4f  ll & SPILLFLAG_O
2cc20 46 46 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  FF );.  testcase
2cc30 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  ( pPager->doNotS
2cc40 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47  pill & SPILLFLAG
2cc50 5f 4e 4f 53 59 4e 43 20 29 3b 0a 20 20 69 66 28  _NOSYNC );.  if(
2cc60 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
2cc70 69 6c 6c 0a 20 20 20 26 26 20 28 28 70 50 61 67  ill.   && ((pPag
2cc80 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26  er->doNotSpill &
2cc90 20 28 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c   (SPILLFLAG_ROLL
2cca0 42 41 43 4b 7c 53 50 49 4c 4c 46 4c 41 47 5f 4f  BACK|SPILLFLAG_O
2ccb0 46 46 29 29 21 3d 30 0a 20 20 20 20 20 20 7c 7c  FF))!=0.      ||
2ccc0 20 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50   (pPg->flags & P
2ccd0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21  GHDR_NEED_SYNC)!
2cce0 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  =0).  ){.    ret
2ccf0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2cd00 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 61 53   }..  pPager->aS
2cd10 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 53  tat[PAGER_STAT_S
2cd20 50 49 4c 4c 5d 2b 2b 3b 0a 20 20 70 50 67 2d 3e  PILL]++;.  pPg->
2cd30 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 69 66  pDirty = 0;.  if
2cd40 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
2cd50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20  ager) ){.    /* 
2cd60 57 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20 66  Write a single f
2cd70 72 61 6d 65 20 66 6f 72 20 74 68 69 73 20 70 61  rame for this pa
2cd80 67 65 20 74 6f 20 74 68 65 20 6c 6f 67 2e 20 2a  ge to the log. *
2cd90 2f 0a 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f  /.    rc = subjo
2cda0 75 72 6e 61 6c 50 61 67 65 49 66 52 65 71 75 69  urnalPageIfRequi
2cdb0 72 65 64 28 70 50 67 29 3b 20 0a 20 20 20 20 69  red(pPg); .    i
2cdc0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2cdd0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
2cde0 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28 70 50  agerWalFrames(pP
2cdf0 61 67 65 72 2c 20 70 50 67 2c 20 30 2c 20 30 29  ager, pPg, 0, 0)
2ce00 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
2ce10 0a 20 20 20 20 0a 23 69 66 64 65 66 20 53 51 4c  .    .#ifdef SQL
2ce20 49 54 45 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48  ITE_ENABLE_BATCH
2ce30 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20  _ATOMIC_WRITE.  
2ce40 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65    if( pPager->te
2ce50 6d 70 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  mpFile==0 ){.   
2ce60 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a     rc = sqlite3J
2ce70 6f 75 72 6e 61 6c 43 72 65 61 74 65 28 70 50 61  ournalCreate(pPa
2ce80 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
2ce90 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2cea0 4f 4b 20 29 20 72 65 74 75 72 6e 20 70 61 67 65  OK ) return page
2ceb0 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
2cec0 72 63 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  rc);.    }.#endi
2ced0 66 0a 20 20 0a 20 20 20 20 2f 2a 20 53 79 6e 63  f.  .    /* Sync
2cee0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2cef0 65 20 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a  e if required. *
2cf00 2f 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 66  /.    if( pPg->f
2cf10 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
2cf20 53 59 4e 43 20 0a 20 20 20 20 20 7c 7c 20 70 50  SYNC .     || pP
2cf30 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
2cf40 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
2cf50 4d 4f 44 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  MOD.    ){.     
2cf60 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61   rc = syncJourna
2cf70 6c 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20  l(pPager, 1);.  
2cf80 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72    }.  .    /* Wr
2cf90 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ite the contents
2cfa0 20 6f 66 20 74 68 65 20 70 61 67 65 20 6f 75 74   of the page out
2cfb0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
2cfc0 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66   file. */.    if
2cfd0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2cfe0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2cff0 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
2d000 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30  DR_NEED_SYNC)==0
2d010 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   );.      rc = p
2d020 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
2d030 69 73 74 28 70 50 61 67 65 72 2c 20 70 50 67 29  ist(pPager, pPg)
2d040 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
2d050 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20  * Mark the page 
2d060 61 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69  as clean. */.  i
2d070 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2d080 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41   ){.    PAGERTRA
2d090 43 45 28 28 22 53 54 52 45 53 53 20 25 64 20 70  CE(("STRESS %d p
2d0a0 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
2d0b0 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
2d0c0 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c  >pgno));.    sql
2d0d0 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c  ite3PcacheMakeCl
2d0e0 65 61 6e 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20  ean(pPg);.  }.. 
2d0f0 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
2d100 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
2d110 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68   .}../*.** Flush
2d120 20 61 6c 6c 20 75 6e 72 65 66 65 72 65 6e 63 65   all unreference
2d130 64 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f  d dirty pages to
2d140 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   disk..*/.int sq
2d150 6c 69 74 65 33 50 61 67 65 72 46 6c 75 73 68 28  lite3PagerFlush(
2d160 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
2d170 20 20 69 6e 74 20 72 63 20 3d 20 70 50 61 67 65    int rc = pPage
2d180 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 69 66  r->errCode;.  if
2d190 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  ( !MEMDB ){.    
2d1a0 50 67 48 64 72 20 2a 70 4c 69 73 74 20 3d 20 73  PgHdr *pList = s
2d1b0 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74  qlite3PcacheDirt
2d1c0 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50  yList(pPager->pP
2d1d0 43 61 63 68 65 29 3b 0a 20 20 20 20 61 73 73 65  Cache);.    asse
2d1e0 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
2d1f0 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
2d200 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d  ;.    while( rc=
2d210 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c  =SQLITE_OK && pL
2d220 69 73 74 20 29 7b 0a 20 20 20 20 20 20 50 67 48  ist ){.      PgH
2d230 64 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73  dr *pNext = pLis
2d240 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 20  t->pDirty;.     
2d250 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 52 65 66   if( pList->nRef
2d260 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
2d270 63 20 3d 20 70 61 67 65 72 53 74 72 65 73 73 28  c = pagerStress(
2d280 28 76 6f 69 64 2a 29 70 50 61 67 65 72 2c 20 70  (void*)pPager, p
2d290 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  List);.      }. 
2d2a0 20 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65       pList = pNe
2d2b0 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  xt;.    }.  }.. 
2d2c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2d2d0 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e  *.** Allocate an
2d2e0 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e  d initialize a n
2d2f0 65 77 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  ew Pager object 
2d300 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65  and put a pointe
2d310 72 20 74 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a 70  r to it.** in *p
2d320 70 50 61 67 65 72 2e 20 54 68 65 20 70 61 67 65  pPager. The page
2d330 72 20 73 68 6f 75 6c 64 20 65 76 65 6e 74 75 61  r should eventua
2d340 6c 6c 79 20 62 65 20 66 72 65 65 64 20 62 79 20  lly be freed by 
2d350 70 61 73 73 69 6e 67 20 69 74 0a 2a 2a 20 74 6f  passing it.** to
2d360 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
2d370 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  se()..**.** The 
2d380 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65  zFilename argume
2d390 6e 74 20 69 73 20 74 68 65 20 70 61 74 68 20 74  nt is the path t
2d3a0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
2d3b0 69 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20  ile to open..** 
2d3c0 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
2d3d0 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64  NULL then a rand
2d3e0 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f  omly-named tempo
2d3f0 72 61 72 79 20 66 69 6c 65 20 69 73 20 63 72 65  rary file is cre
2d400 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64  ated.** and used
2d410 20 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20   as the file to 
2d420 62 65 20 63 61 63 68 65 64 2e 20 54 65 6d 70 6f  be cached. Tempo
2d430 72 61 72 79 20 66 69 6c 65 73 20 61 72 65 20 62  rary files are b
2d440 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74  e deleted.** aut
2d450 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20  omatically when 
2d460 74 68 65 79 20 61 72 65 20 63 6c 6f 73 65 64 2e  they are closed.
2d470 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
2d480 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e   ":memory:" then
2d490 20 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d 61   .** all informa
2d4a0 74 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20  tion is held in 
2d4b0 63 61 63 68 65 2e 20 49 74 20 69 73 20 6e 65 76  cache. It is nev
2d4c0 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69  er written to di
2d4d0 73 6b 2e 20 0a 2a 2a 20 54 68 69 73 20 63 61 6e  sk. .** This can
2d4e0 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c   be used to impl
2d4f0 65 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ement an in-memo
2d500 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  ry database..**.
2d510 2a 2a 20 54 68 65 20 6e 45 78 74 72 61 20 70 61  ** The nExtra pa
2d520 72 61 6d 65 74 65 72 20 73 70 65 63 69 66 69 65  rameter specifie
2d530 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
2d540 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61  bytes of space a
2d550 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e  llocated.** alon
2d560 67 20 77 69 74 68 20 65 61 63 68 20 70 61 67 65  g with each page
2d570 20 72 65 66 65 72 65 6e 63 65 2e 20 54 68 69 73   reference. This
2d580 20 73 70 61 63 65 20 69 73 20 61 76 61 69 6c 61   space is availa
2d590 62 6c 65 20 74 6f 20 74 68 65 20 75 73 65 72 0a  ble to the user.
2d5a0 2a 2a 20 76 69 61 20 74 68 65 20 73 71 6c 69 74  ** via the sqlit
2d5b0 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
2d5c0 29 20 41 50 49 2e 20 20 57 68 65 6e 20 61 20 6e  ) API.  When a n
2d5d0 65 77 20 70 61 67 65 20 69 73 20 61 6c 6c 6f 63  ew page is alloc
2d5e0 61 74 65 64 2c 20 74 68 65 0a 2a 2a 20 66 69 72  ated, the.** fir
2d5f0 73 74 20 38 20 62 79 74 65 73 20 6f 66 20 74 68  st 8 bytes of th
2d600 69 73 20 73 70 61 63 65 20 61 72 65 20 7a 65 72  is space are zer
2d610 6f 65 64 20 62 75 74 20 74 68 65 20 72 65 6d 61  oed but the rema
2d620 69 6e 64 65 72 20 69 73 20 75 6e 69 6e 69 74 69  inder is uniniti
2d630 61 6c 69 7a 65 64 2e 0a 2a 2a 20 28 54 68 65 20  alized..** (The 
2d640 65 78 74 72 61 20 73 70 61 63 65 20 69 73 20 75  extra space is u
2d650 73 65 64 20 62 79 20 62 74 72 65 65 20 61 73 20  sed by btree as 
2d660 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65  the MemPage obje
2d670 63 74 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ct.).**.** The f
2d680 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69 73  lags argument is
2d690 20 75 73 65 64 20 74 6f 20 73 70 65 63 69 66 79   used to specify
2d6a0 20 70 72 6f 70 65 72 74 69 65 73 20 74 68 61 74   properties that
2d6b0 20 61 66 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f   affect the.** o
2d6c0 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  peration of the 
2d6d0 70 61 67 65 72 2e 20 49 74 20 73 68 6f 75 6c 64  pager. It should
2d6e0 20 62 65 20 70 61 73 73 65 64 20 73 6f 6d 65 20   be passed some 
2d6f0 62 69 74 77 69 73 65 20 63 6f 6d 62 69 6e 61 74  bitwise combinat
2d700 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41  ion.** of the PA
2d710 47 45 52 5f 2a 20 66 6c 61 67 73 2e 0a 2a 2a 0a  GER_* flags..**.
2d720 2a 2a 20 54 68 65 20 76 66 73 46 6c 61 67 73 20  ** The vfsFlags 
2d730 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62  parameter is a b
2d740 69 74 6d 61 73 6b 20 74 6f 20 70 61 73 73 20 74  itmask to pass t
2d750 6f 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61  o the flags para
2d760 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20  meter.** of the 
2d770 78 4f 70 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f  xOpen() method o
2d780 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 56  f the supplied V
2d790 46 53 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  FS when opening 
2d7a0 66 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  files. .**.** If
2d7b0 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
2d7c0 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  t is allocated a
2d7d0 6e 64 20 74 68 65 20 73 70 65 63 69 66 69 65 64  nd the specified
2d7e0 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a   file opened .**
2d7f0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 53   successfully, S
2d800 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2d810 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65  rned and *ppPage
2d820 72 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  r set to point t
2d830 6f 0a 2a 2a 20 74 68 65 20 6e 65 77 20 70 61 67  o.** the new pag
2d840 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e  er object. If an
2d850 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a   error occurs, *
2d860 70 70 50 61 67 65 72 20 69 73 20 73 65 74 20 74  ppPager is set t
2d870 6f 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72  o NULL.** and er
2d880 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65  ror code returne
2d890 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  d. This function
2d8a0 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
2d8b0 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c  TE_NOMEM.** (sql
2d8c0 69 74 65 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20  ite3Malloc() is 
2d8d0 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65  used to allocate
2d8e0 20 6d 65 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45   memory), SQLITE
2d8f0 5f 43 41 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a  _CANTOPEN or .**
2d900 20 76 61 72 69 6f 75 73 20 53 51 4c 49 54 45 5f   various SQLITE_
2d910 49 4f 5f 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a  IO_XXX errors..*
2d920 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
2d930 65 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65  erOpen(.  sqlite
2d940 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
2d950 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61     /* The virtua
2d960 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f  l file system to
2d970 20 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20   use */.  Pager 
2d980 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20  **ppPager,      
2d990 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72     /* OUT: Retur
2d9a0 6e 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  n the Pager stru
2d9b0 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20  cture here */.  
2d9c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
2d9d0 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65  ename,   /* Name
2d9e0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2d9f0 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f   file to open */
2da00 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20  .  int nExtra,  
2da10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
2da20 78 74 72 61 20 62 79 74 65 73 20 61 70 70 65 6e  xtra bytes appen
2da30 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d  d to each in-mem
2da40 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  ory page */.  in
2da50 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
2da60 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20         /* flags 
2da70 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73  controlling this
2da80 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76   file */.  int v
2da90 66 73 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20  fsFlags,        
2daa0 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 70 61 73      /* flags pas
2dab0 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73  sed through to s
2dac0 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e  qlite3_vfs.xOpen
2dad0 28 29 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  () */.  void (*x
2dae0 52 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a 29  Reinit)(DbPage*)
2daf0 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20   /* Function to 
2db00 72 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67  reinitialize pag
2db10 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70  es */.){.  u8 *p
2db20 50 74 72 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  Ptr;.  Pager *pP
2db30 61 67 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  ager = 0;       
2db40 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
2db50 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20  to allocate and 
2db60 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20  return */.  int 
2db70 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
2db80 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
2db90 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d  ode */.  int tem
2dba0 70 46 69 6c 65 20 3d 20 30 3b 20 20 20 20 20 20  pFile = 0;      
2dbb0 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 65    /* True for te
2dbc0 6d 70 20 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20  mp files (incl. 
2dbd0 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29  in-memory files)
2dbe0 20 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20   */.  int memDb 
2dbf0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
2dc00 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
2dc10 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66  s an in-memory f
2dc20 69 6c 65 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ile */.#ifdef SQ
2dc30 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 45 53 45  LITE_ENABLE_DESE
2dc40 52 49 41 4c 49 5a 45 0a 20 20 69 6e 74 20 6d 65  RIALIZE.  int me
2dc50 6d 4a 4d 20 3d 20 30 3b 20 20 20 20 20 20 20 20  mJM = 0;        
2dc60 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6a 6f 75     /* Memory jou
2dc70 72 6e 61 6c 20 6d 6f 64 65 20 2a 2f 0a 23 65 6c  rnal mode */.#el
2dc80 73 65 0a 23 20 64 65 66 69 6e 65 20 6d 65 6d 4a  se.# define memJ
2dc90 4d 20 30 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74  M 0.#endif.  int
2dca0 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 20 20   readOnly = 0;  
2dcb0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2dcc0 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64 2d   this is a read-
2dcd0 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69  only file */.  i
2dce0 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69  nt journalFileSi
2dcf0 7a 65 3b 20 20 20 20 20 2f 2a 20 42 79 74 65 73  ze;     /* Bytes
2dd00 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72   to allocate for
2dd10 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 64   each journal fd
2dd20 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61 74   */.  char *zPat
2dd30 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f  hname = 0;     /
2dd40 2a 20 46 75 6c 6c 20 70 61 74 68 20 74 6f 20 64  * Full path to d
2dd50 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2dd60 20 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65 20    int nPathname 
2dd70 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75  = 0;       /* Nu
2dd80 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
2dd90 20 7a 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20   zPathname */.  
2dda0 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d  int useJournal =
2ddb0 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f   (flags & PAGER_
2ddc0 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30  OMIT_JOURNAL)==0
2ddd0 3b 20 2f 2a 20 46 61 6c 73 65 20 74 6f 20 6f 6d  ; /* False to om
2dde0 69 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  it journal */.  
2ddf0 69 6e 74 20 70 63 61 63 68 65 53 69 7a 65 20 3d  int pcacheSize =
2de00 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 69   sqlite3PcacheSi
2de10 7a 65 28 29 3b 20 20 20 20 20 20 20 2f 2a 20 42  ze();       /* B
2de20 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ytes to allocate
2de30 20 66 6f 72 20 50 43 61 63 68 65 20 2a 2f 0a 20   for PCache */. 
2de40 20 75 33 32 20 73 7a 50 61 67 65 44 66 6c 74 20   u32 szPageDflt 
2de50 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
2de60 5f 50 41 47 45 5f 53 49 5a 45 3b 20 20 2f 2a 20  _PAGE_SIZE;  /* 
2de70 44 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  Default page siz
2de80 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
2de90 72 20 2a 7a 55 72 69 20 3d 20 30 3b 20 20 20 20  r *zUri = 0;    
2dea0 2f 2a 20 55 52 49 20 61 72 67 73 20 74 6f 20 63  /* URI args to c
2deb0 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 55 72  opy */.  int nUr
2dec0 69 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  i = 0;          
2ded0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
2dee0 79 74 65 73 20 6f 66 20 55 52 49 20 61 72 67 73  ytes of URI args
2def0 20 61 74 20 2a 7a 55 72 69 20 2a 2f 0a 0a 20 20   at *zUri */..  
2df00 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
2df10 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 73 20  w much space is 
2df20 72 65 71 75 69 72 65 64 20 66 6f 72 20 65 61 63  required for eac
2df30 68 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68  h journal file-h
2df40 61 6e 64 6c 65 0a 20 20 2a 2a 20 28 74 68 65 72  andle.  ** (ther
2df50 65 20 61 72 65 20 74 77 6f 20 6f 66 20 74 68 65  e are two of the
2df60 6d 2c 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  m, the main jour
2df70 6e 61 6c 20 61 6e 64 20 74 68 65 20 73 75 62 2d  nal and the sub-
2df80 6a 6f 75 72 6e 61 6c 29 2e 20 20 2a 2f 0a 20 20  journal).  */.  
2df90 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
2dfa0 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33  = ROUND8(sqlite3
2dfb0 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73  JournalSize(pVfs
2dfc0 29 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68  ));..  /* Set th
2dfd0 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  e output variabl
2dfe0 65 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 63 61 73  e to NULL in cas
2dff0 65 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  e an error occur
2e000 73 2e 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72  s. */.  *ppPager
2e010 20 3d 20 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53   = 0;..#ifndef S
2e020 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
2e030 59 44 42 0a 20 20 69 66 28 20 66 6c 61 67 73 20  YDB.  if( flags 
2e040 26 20 50 41 47 45 52 5f 4d 45 4d 4f 52 59 20 29  & PAGER_MEMORY )
2e050 7b 0a 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b  {.    memDb = 1;
2e060 0a 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  .    if( zFilena
2e070 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b  me && zFilename[
2e080 30 5d 20 29 7b 0a 20 20 20 20 20 20 7a 50 61 74  0] ){.      zPat
2e090 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  hname = sqlite3D
2e0a0 62 53 74 72 44 75 70 28 30 2c 20 7a 46 69 6c 65  bStrDup(0, zFile
2e0b0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28  name);.      if(
2e0c0 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 20 29   zPathname==0  )
2e0d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2e0e0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
2e0f0 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c   nPathname = sql
2e100 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61  ite3Strlen30(zPa
2e110 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7a  thname);.      z
2e120 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20  Filename = 0;.  
2e130 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
2e140 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64    /* Compute and
2e150 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 20   store the full 
2e160 70 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61  pathname in an a
2e170 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 20  llocated buffer 
2e180 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20  pointed.  ** to 
2e190 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65  by zPathname, le
2e1a0 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20  ngth nPathname. 
2e1b0 4f 72 2c 20 69 66 20 74 68 69 73 20 69 73 20 61  Or, if this is a
2e1c0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c   temporary file,
2e1d0 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68  .  ** leave both
2e1e0 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a   nPathname and z
2e1f0 50 61 74 68 6e 61 6d 65 20 73 65 74 20 74 6f 20  Pathname set to 
2e200 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46  0..  */.  if( zF
2e210 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65  ilename && zFile
2e220 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 63  name[0] ){.    c
2e230 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
2e240 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70 56    nPathname = pV
2e250 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
2e260 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20  ;.    zPathname 
2e270 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
2e280 63 52 61 77 28 30 2c 20 6e 50 61 74 68 6e 61 6d  cRaw(0, nPathnam
2e290 65 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 50  e*2);.    if( zP
2e2a0 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  athname==0 ){.  
2e2b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2e2c0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
2e2d0 20 20 7d 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d    }.    zPathnam
2e2e0 65 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b  e[0] = 0; /* Mak
2e2f0 65 20 73 75 72 65 20 69 6e 69 74 69 61 6c 69 7a  e sure initializ
2e300 65 64 20 65 76 65 6e 20 69 66 20 46 75 6c 6c 50  ed even if FullP
2e310 61 74 68 6e 61 6d 65 28 29 20 66 61 69 6c 73 20  athname() fails 
2e320 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
2e330 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d  te3OsFullPathnam
2e340 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d  e(pVfs, zFilenam
2e350 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50  e, nPathname, zP
2e360 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6e 50  athname);.    nP
2e370 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
2e380 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e  3Strlen30(zPathn
2e390 61 6d 65 29 3b 0a 20 20 20 20 7a 20 3d 20 7a 55  ame);.    z = zU
2e3a0 72 69 20 3d 20 26 7a 46 69 6c 65 6e 61 6d 65 5b  ri = &zFilename[
2e3b0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
2e3c0 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 5d 3b 0a 20  zFilename)+1];. 
2e3d0 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a     while( *z ){.
2e3e0 20 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74        z += sqlit
2e3f0 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b  e3Strlen30(z)+1;
2e400 0a 20 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69  .      z += sqli
2e410 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31  te3Strlen30(z)+1
2e420 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 55 72 69  ;.    }.    nUri
2e430 20 3d 20 28 69 6e 74 29 28 26 7a 5b 31 5d 20 2d   = (int)(&z[1] -
2e440 20 7a 55 72 69 29 3b 0a 20 20 20 20 61 73 73 65   zUri);.    asse
2e450 72 74 28 20 6e 55 72 69 3e 3d 30 20 29 3b 0a 20  rt( nUri>=0 );. 
2e460 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2e470 45 5f 4f 4b 20 26 26 20 6e 50 61 74 68 6e 61 6d  E_OK && nPathnam
2e480 65 2b 38 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  e+8>pVfs->mxPath
2e490 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  name ){.      /*
2e4a0 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20   This branch is 
2e4b0 74 61 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 6a  taken when the j
2e4c0 6f 75 72 6e 61 6c 20 70 61 74 68 20 72 65 71 75  ournal path requ
2e4d0 69 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a  ired by.      **
2e4e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
2e4f0 69 6e 67 20 6f 70 65 6e 65 64 20 77 69 6c 6c 20  ing opened will 
2e500 62 65 20 6d 6f 72 65 20 74 68 61 6e 20 70 56 66  be more than pVf
2e510 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 20 20  s->mxPathname.  
2e520 20 20 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20      ** bytes in 
2e530 6c 65 6e 67 74 68 2e 20 54 68 69 73 20 6d 65 61  length. This mea
2e540 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
2e550 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64  cannot be opened
2e560 2c 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 74  ,.      ** as it
2e570 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73   will not be pos
2e580 73 69 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68  sible to open th
2e590 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
2e5a0 72 20 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20  r even.      ** 
2e5b0 63 68 65 63 6b 20 66 6f 72 20 61 20 68 6f 74 2d  check for a hot-
2e5c0 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 72  journal before r
2e5d0 65 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f  eading..      */
2e5e0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
2e5f0 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
2e600 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2e610 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2e620 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
2e630 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d  Free(0, zPathnam
2e640 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
2e650 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   rc;.    }.  }..
2e660 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65    /* Allocate me
2e670 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 50 61 67  mory for the Pag
2e680 65 72 20 73 74 72 75 63 74 75 72 65 2c 20 50 43  er structure, PC
2e690 61 63 68 65 20 6f 62 6a 65 63 74 2c 20 74 68 65  ache object, the
2e6a0 0a 20 20 2a 2a 20 74 68 72 65 65 20 66 69 6c 65  .  ** three file
2e6b0 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20 74 68   descriptors, th
2e6c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2e6d0 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 6a 6f 75  name and the jou
2e6e0 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20  rnal .  ** file 
2e6f0 6e 61 6d 65 2e 20 54 68 65 20 6c 61 79 6f 75 74  name. The layout
2e700 20 69 6e 20 6d 65 6d 6f 72 79 20 69 73 20 61 73   in memory is as
2e710 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20   follows:.  **. 
2e720 20 2a 2a 20 20 20 20 20 50 61 67 65 72 20 6f 62   **     Pager ob
2e730 6a 65 63 74 20 20 20 20 20 20 20 20 20 20 20 20  ject            
2e740 20 20 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28          (sizeof(
2e750 50 61 67 65 72 29 20 62 79 74 65 73 29 0a 20 20  Pager) bytes).  
2e760 2a 2a 20 20 20 20 20 50 43 61 63 68 65 20 6f 62  **     PCache ob
2e770 6a 65 63 74 20 20 20 20 20 20 20 20 20 20 20 20  ject            
2e780 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 50         (sqlite3P
2e790 63 61 63 68 65 53 69 7a 65 28 29 20 62 79 74 65  cacheSize() byte
2e7a0 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61  s).  **     Data
2e7b0 62 61 73 65 20 66 69 6c 65 20 68 61 6e 64 6c 65  base file handle
2e7c0 20 20 20 20 20 20 20 20 20 20 20 20 28 70 56 66              (pVf
2e7d0 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 62 79 74 65  s->szOsFile byte
2e7e0 73 29 0a 20 20 2a 2a 20 20 20 20 20 53 75 62 2d  s).  **     Sub-
2e7f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e  journal file han
2e800 64 6c 65 20 20 20 20 20 20 20 20 20 28 6a 6f 75  dle         (jou
2e810 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74  rnalFileSize byt
2e820 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4d 61 69  es).  **     Mai
2e830 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  n journal file h
2e840 61 6e 64 6c 65 20 20 20 20 20 20 20 20 28 6a 6f  andle        (jo
2e850 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79  urnalFileSize by
2e860 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61  tes).  **     Da
2e870 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65  tabase file name
2e880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e                (n
2e890 50 61 74 68 6e 61 6d 65 2b 31 20 62 79 74 65 73  Pathname+1 bytes
2e8a0 29 0a 20 20 2a 2a 20 20 20 20 20 4a 6f 75 72 6e  ).  **     Journ
2e8b0 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20  al file name    
2e8c0 20 20 20 20 20 20 20 20 20 20 20 28 6e 50 61 74             (nPat
2e8d0 68 6e 61 6d 65 2b 38 2b 31 20 62 79 74 65 73 29  hname+8+1 bytes)
2e8e0 0a 20 20 2a 2f 0a 20 20 70 50 74 72 20 3d 20 28  .  */.  pPtr = (
2e8f0 75 38 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  u8 *)sqlite3Mall
2e900 6f 63 5a 65 72 6f 28 0a 20 20 20 20 52 4f 55 4e  ocZero(.    ROUN
2e910 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65  D8(sizeof(*pPage
2e920 72 29 29 20 2b 20 20 20 20 20 20 2f 2a 20 50 61  r)) +      /* Pa
2e930 67 65 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ger structure */
2e940 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 63 61 63  .    ROUND8(pcac
2e950 68 65 53 69 7a 65 29 20 2b 20 20 20 20 20 20 20  heSize) +       
2e960 20 20 20 20 2f 2a 20 50 43 61 63 68 65 20 6f 62      /* PCache ob
2e970 6a 65 63 74 20 2a 2f 0a 20 20 20 20 52 4f 55 4e  ject */.    ROUN
2e980 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  D8(pVfs->szOsFil
2e990 65 29 20 2b 20 20 20 20 20 20 20 2f 2a 20 54 68  e) +       /* Th
2e9a0 65 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 20 2a  e main db file *
2e9b0 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c  /.    journalFil
2e9c0 65 53 69 7a 65 20 2a 20 32 20 2b 20 20 20 20 20  eSize * 2 +     
2e9d0 20 20 20 20 20 2f 2a 20 54 68 65 20 74 77 6f 20       /* The two 
2e9e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f  journal files */
2e9f0 20 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20   .    nPathname 
2ea00 2b 20 31 20 2b 20 6e 55 72 69 20 2b 20 20 20 20  + 1 + nUri +    
2ea10 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d       /* zFilenam
2ea20 65 20 2a 2f 0a 20 20 20 20 6e 50 61 74 68 6e 61  e */.    nPathna
2ea30 6d 65 20 2b 20 38 20 2b 20 32 20 20 20 20 20 20  me + 8 + 2      
2ea40 20 20 20 20 20 20 20 20 2f 2a 20 7a 4a 6f 75 72          /* zJour
2ea50 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  nal */.#ifndef S
2ea60 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
2ea70 20 20 20 2b 20 6e 50 61 74 68 6e 61 6d 65 20 2b     + nPathname +
2ea80 20 34 20 2b 20 32 20 20 20 20 20 20 20 20 20 20   4 + 2          
2ea90 20 20 2f 2a 20 7a 57 61 6c 20 2a 2f 0a 23 65 6e    /* zWal */.#en
2eaa0 64 69 66 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  dif.  );.  asser
2eab0 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
2eac0 49 47 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f 49  IGNMENT(SQLITE_I
2ead0 4e 54 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e 61  NT_TO_PTR(journa
2eae0 6c 46 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a 20  lFileSize)) );. 
2eaf0 20 69 66 28 20 21 70 50 74 72 20 29 7b 0a 20 20   if( !pPtr ){.  
2eb00 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2eb10 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  0, zPathname);. 
2eb20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2eb30 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d  _NOMEM_BKPT;.  }
2eb40 0a 20 20 70 50 61 67 65 72 20 3d 20 20 20 20 20  .  pPager =     
2eb50 20 20 20 20 20 20 20 20 20 28 50 61 67 65 72 2a           (Pager*
2eb60 29 28 70 50 74 72 29 3b 0a 20 20 70 50 61 67 65  )(pPtr);.  pPage
2eb70 72 2d 3e 70 50 43 61 63 68 65 20 3d 20 20 20 20  r->pPCache =    
2eb80 28 50 43 61 63 68 65 2a 29 28 70 50 74 72 20 2b  (PCache*)(pPtr +
2eb90 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  = ROUND8(sizeof(
2eba0 2a 70 50 61 67 65 72 29 29 29 3b 0a 20 20 70 50  *pPager)));.  pP
2ebb0 61 67 65 72 2d 3e 66 64 20 3d 20 20 20 28 73 71  ager->fd =   (sq
2ebc0 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74  lite3_file*)(pPt
2ebd0 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 63 61 63  r += ROUND8(pcac
2ebe0 68 65 53 69 7a 65 29 29 3b 0a 20 20 70 50 61 67  heSize));.  pPag
2ebf0 65 72 2d 3e 73 6a 66 64 20 3d 20 28 73 71 6c 69  er->sjfd = (sqli
2ec00 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20  te3_file*)(pPtr 
2ec10 2b 3d 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e  += ROUND8(pVfs->
2ec20 73 7a 4f 73 46 69 6c 65 29 29 3b 0a 20 20 70 50  szOsFile));.  pP
2ec30 61 67 65 72 2d 3e 6a 66 64 20 3d 20 20 28 73 71  ager->jfd =  (sq
2ec40 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74  lite3_file*)(pPt
2ec50 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  r += journalFile
2ec60 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 72 2d  Size);.  pPager-
2ec70 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 20 20 20  >zFilename =    
2ec80 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20  (char*)(pPtr += 
2ec90 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29  journalFileSize)
2eca0 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
2ecb0 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
2ecc0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
2ecd0 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74  ..  /* Fill in t
2ece0 68 65 20 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61  he Pager.zFilena
2ecf0 6d 65 20 61 6e 64 20 50 61 67 65 72 2e 7a 4a 6f  me and Pager.zJo
2ed00 75 72 6e 61 6c 20 62 75 66 66 65 72 73 2c 20 69  urnal buffers, i
2ed10 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  f required. */. 
2ed20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 20 29   if( zPathname )
2ed30 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 50  {.    assert( nP
2ed40 61 74 68 6e 61 6d 65 3e 30 20 29 3b 0a 20 20 20  athname>0 );.   
2ed50 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
2ed60 6c 20 3d 20 20 20 28 63 68 61 72 2a 29 28 70 50  l =   (char*)(pP
2ed70 74 72 20 2b 3d 20 6e 50 61 74 68 6e 61 6d 65 20  tr += nPathname 
2ed80 2b 20 31 20 2b 20 6e 55 72 69 29 3b 0a 20 20 20  + 1 + nUri);.   
2ed90 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
2eda0 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68  zFilename, zPath
2edb0 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29  name, nPathname)
2edc0 3b 0a 20 20 20 20 69 66 28 20 6e 55 72 69 20 29  ;.    if( nUri )
2edd0 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
2ede0 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50 61 74 68  >zFilename[nPath
2edf0 6e 61 6d 65 2b 31 5d 2c 20 7a 55 72 69 2c 20 6e  name+1], zUri, n
2ee00 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  Uri);.    memcpy
2ee10 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
2ee20 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50  l, zPathname, nP
2ee30 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65  athname);.    me
2ee40 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a  mcpy(&pPager->zJ
2ee50 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65  ournal[nPathname
2ee60 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 5c 30 30 30  ], "-journal\000
2ee70 22 2c 20 38 2b 32 29 3b 0a 20 20 20 20 73 71 6c  ", 8+2);.    sql
2ee80 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28  ite3FileSuffix3(
2ee90 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2eea0 65 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  e, pPager->zJour
2eeb0 6e 61 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  nal);.#ifndef SQ
2eec0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
2eed0 20 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 20 3d    pPager->zWal =
2eee0 20 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e   &pPager->zJourn
2eef0 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31  al[nPathname+8+1
2ef00 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50  ];.    memcpy(pP
2ef10 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 7a 50 61 74  ager->zWal, zPat
2ef20 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  hname, nPathname
2ef30 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70  );.    memcpy(&p
2ef40 50 61 67 65 72 2d 3e 7a 57 61 6c 5b 6e 50 61 74  Pager->zWal[nPat
2ef50 68 6e 61 6d 65 5d 2c 20 22 2d 77 61 6c 5c 30 30  hname], "-wal\00
2ef60 30 22 2c 20 34 2b 31 29 3b 0a 20 20 20 20 73 71  0", 4+1);.    sq
2ef70 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33  lite3FileSuffix3
2ef80 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
2ef90 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c  me, pPager->zWal
2efa0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71  );.#endif.    sq
2efb0 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a  lite3DbFree(0, z
2efc0 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20  Pathname);.  }. 
2efd0 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20 3d 20   pPager->pVfs = 
2efe0 70 56 66 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e  pVfs;.  pPager->
2eff0 76 66 73 46 6c 61 67 73 20 3d 20 76 66 73 46 6c  vfsFlags = vfsFl
2f000 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  ags;..  /* Open 
2f010 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a  the pager file..
2f020 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65    */.  if( zFile
2f030 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
2f040 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20  e[0] ){.    int 
2f050 66 6f 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20  fout = 0;       
2f060 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f070 56 46 53 20 66 6c 61 67 73 20 72 65 74 75 72 6e  VFS flags return
2f080 65 64 20 62 79 20 78 4f 70 65 6e 28 29 20 2a 2f  ed by xOpen() */
2f090 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2f0a0 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50  3OsOpen(pVfs, pP
2f0b0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
2f0c0 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 76 66 73   pPager->fd, vfs
2f0d0 46 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a 20  Flags, &fout);. 
2f0e0 20 20 20 61 73 73 65 72 74 28 20 21 6d 65 6d 44     assert( !memD
2f0f0 62 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  b );.#ifdef SQLI
2f100 54 45 5f 45 4e 41 42 4c 45 5f 44 45 53 45 52 49  TE_ENABLE_DESERI
2f110 41 4c 49 5a 45 0a 20 20 20 20 6d 65 6d 4a 4d 20  ALIZE.    memJM 
2f120 3d 20 28 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f  = (fout&SQLITE_O
2f130 50 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a  PEN_MEMORY)!=0;.
2f140 23 65 6e 64 69 66 0a 20 20 20 20 72 65 61 64 4f  #endif.    readO
2f150 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53 51 4c 49  nly = (fout&SQLI
2f160 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
2f170 29 21 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  )!=0;..    /* If
2f180 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 73 75   the file was su
2f190 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65  ccessfully opene
2f1a0 64 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65  d for read/write
2f1b0 20 61 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20   access,.    ** 
2f1c0 63 68 6f 6f 73 65 20 61 20 64 65 66 61 75 6c 74  choose a default
2f1d0 20 70 61 67 65 20 73 69 7a 65 20 69 6e 20 63 61   page size in ca
2f1e0 73 65 20 77 65 20 68 61 76 65 20 74 6f 20 63 72  se we have to cr
2f1f0 65 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  eate the.    ** 
2f200 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
2f210 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20  he default page 
2f220 73 69 7a 65 20 69 73 20 74 68 65 20 6d 61 78 69  size is the maxi
2f230 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20  mum of:.    **. 
2f240 20 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54     **    + SQLIT
2f250 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
2f260 49 5a 45 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b  IZE,.    **    +
2f270 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
2f280 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73  ned by sqlite3Os
2f290 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20  SectorSize().   
2f2a0 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72   **    + The lar
2f2b0 67 65 73 74 20 70 61 67 65 20 73 69 7a 65 20 74  gest page size t
2f2c0 68 61 74 20 63 61 6e 20 62 65 20 77 72 69 74 74  hat can be writt
2f2d0 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20  en atomically.. 
2f2e0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
2f2f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2f300 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73       int iDc = s
2f310 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
2f320 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
2f330 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20  ager->fd);.     
2f340 20 69 66 28 20 21 72 65 61 64 4f 6e 6c 79 20 29   if( !readOnly )
2f350 7b 0a 20 20 20 20 20 20 20 20 73 65 74 53 65 63  {.        setSec
2f360 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b  torSize(pPager);
2f370 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2f380 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
2f390 41 47 45 5f 53 49 5a 45 3c 3d 53 51 4c 49 54 45  AGE_SIZE<=SQLITE
2f3a0 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
2f3b0 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 20  E_SIZE);.       
2f3c0 20 69 66 28 20 73 7a 50 61 67 65 44 66 6c 74 3c   if( szPageDflt<
2f3d0 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
2f3e0 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
2f3f0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74  if( pPager->sect
2f400 6f 72 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  orSize>SQLITE_MA
2f410 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
2f420 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  IZE ){.         
2f430 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20     szPageDflt = 
2f440 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
2f450 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20  LT_PAGE_SIZE;.  
2f460 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2f470 20 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67             szPag
2f480 65 44 66 6c 74 20 3d 20 28 75 33 32 29 70 50 61  eDflt = (u32)pPa
2f490 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b  ger->sectorSize;
2f4a0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2f4b0 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51       }.#ifdef SQ
2f4c0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
2f4d0 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20 20  IC_WRITE.       
2f4e0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74   {.          int
2f4f0 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 61   ii;.          a
2f500 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
2f510 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35  AP_ATOMIC512==(5
2f520 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20  12>>8));.       
2f530 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
2f540 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b  _IOCAP_ATOMIC64K
2f550 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20  ==(65536>>8));. 
2f560 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2f570 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
2f580 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35  LT_PAGE_SIZE<=65
2f590 35 33 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20  536);.          
2f5a0 66 6f 72 28 69 69 3d 73 7a 50 61 67 65 44 66 6c  for(ii=szPageDfl
2f5b0 74 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41  t; ii<=SQLITE_MA
2f5c0 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
2f5d0 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20  IZE; ii=ii*2){. 
2f5e0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
2f5f0 44 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  Dc&(SQLITE_IOCAP
2f600 5f 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29  _ATOMIC|(ii>>8))
2f610 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2f620 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 69    szPageDflt = i
2f630 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  i;.            }
2f640 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2f650 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
2f660 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
2f670 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d 20 73 71 6c  er->noLock = sql
2f680 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e  ite3_uri_boolean
2f690 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 6e 6f 6c  (zFilename, "nol
2f6a0 6f 63 6b 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  ock", 0);.      
2f6b0 69 66 28 20 28 69 44 63 20 26 20 53 51 4c 49 54  if( (iDc & SQLIT
2f6c0 45 5f 49 4f 43 41 50 5f 49 4d 4d 55 54 41 42 4c  E_IOCAP_IMMUTABL
2f6d0 45 29 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  E)!=0.       || 
2f6e0 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c  sqlite3_uri_bool
2f6f0 65 61 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22  ean(zFilename, "
2f700 69 6d 6d 75 74 61 62 6c 65 22 2c 20 30 29 20 29  immutable", 0) )
2f710 7b 0a 20 20 20 20 20 20 20 20 20 20 76 66 73 46  {.          vfsF
2f720 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
2f730 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  PEN_READONLY;.  
2f740 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 63 74          goto act
2f750 5f 6c 69 6b 65 5f 74 65 6d 70 5f 66 69 6c 65 3b  _like_temp_file;
2f760 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2f770 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
2f780 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  f a temporary fi
2f790 6c 65 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  le is requested,
2f7a0 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65   it is not opene
2f7b0 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  d immediately.. 
2f7c0 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61     ** In this ca
2f7d0 73 65 20 77 65 20 61 63 63 65 70 74 20 74 68 65  se we accept the
2f7e0 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69   default page si
2f7f0 7a 65 20 61 6e 64 20 64 65 6c 61 79 20 61 63 74  ze and delay act
2f800 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65  ually.    ** ope
2f810 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20 75 6e  ning the file un
2f820 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 63 61  til the first ca
2f830 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65 28 29 2e  ll to OsWrite().
2f840 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
2f850 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 61 6c  his branch is al
2f860 73 6f 20 72 75 6e 20 66 6f 72 20 61 6e 20 69 6e  so run for an in
2f870 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
2f880 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20  . An in-memory. 
2f890 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
2f8a0 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 20  s the same as a 
2f8b0 74 65 6d 70 2d 66 69 6c 65 20 74 68 61 74 20 69  temp-file that i
2f8c0 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20  s never written 
2f8d0 6f 75 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69  out to.    ** di
2f8e0 73 6b 20 61 6e 64 20 75 73 65 73 20 61 6e 20 69  sk and uses an i
2f8f0 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62 61 63  n-memory rollbac
2f900 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a  k journal..    *
2f910 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62 72  *.    ** This br
2f920 61 6e 63 68 20 61 6c 73 6f 20 72 75 6e 73 20 66  anch also runs f
2f930 6f 72 20 66 69 6c 65 73 20 6d 61 72 6b 65 64 20  or files marked 
2f940 61 73 20 69 6d 6d 75 74 61 62 6c 65 2e 0a 20 20  as immutable..  
2f950 20 20 2a 2f 20 0a 61 63 74 5f 6c 69 6b 65 5f 74    */ .act_like_t
2f960 65 6d 70 5f 66 69 6c 65 3a 0a 20 20 20 20 74 65  emp_file:.    te
2f970 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20  mpFile = 1;.    
2f980 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
2f990 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b 20 20   PAGER_READER;  
2f9a0 20 20 20 2f 2a 20 50 72 65 74 65 6e 64 20 77 65     /* Pretend we
2f9b0 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20   already have a 
2f9c0 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 70 50 61 67  lock */.    pPag
2f9d0 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 45 58 43 4c  er->eLock = EXCL
2f9e0 55 53 49 56 45 5f 4c 4f 43 4b 3b 20 20 20 20 2f  USIVE_LOCK;    /
2f9f0 2a 20 50 72 65 74 65 6e 64 20 77 65 20 61 72 65  * Pretend we are
2fa00 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20 6d 6f   in EXCLUSIVE mo
2fa10 64 65 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72  de */.    pPager
2fa20 2d 3e 6e 6f 4c 6f 63 6b 20 3d 20 31 3b 20 20 20  ->noLock = 1;   
2fa30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fa40 44 6f 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 2a 2f  Do no locking */
2fa50 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20  .    readOnly = 
2fa60 28 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45  (vfsFlags&SQLITE
2fa70 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b  _OPEN_READONLY);
2fa80 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66  .  }..  /* The f
2fa90 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f  ollowing call to
2faa0 20 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a   PagerSetPagesiz
2fab0 65 28 29 20 73 65 72 76 65 73 20 74 6f 20 73 65  e() serves to se
2fac0 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 0a  t the value of .
2fad0 20 20 2a 2a 20 50 61 67 65 72 2e 70 61 67 65 53    ** Pager.pageS
2fae0 69 7a 65 20 61 6e 64 20 74 6f 20 61 6c 6c 6f 63  ize and to alloc
2faf0 61 74 65 20 74 68 65 20 50 61 67 65 72 2e 70 54  ate the Pager.pT
2fb00 6d 70 53 70 61 63 65 20 62 75 66 66 65 72 2e 0a  mpSpace buffer..
2fb10 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
2fb20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2fb30 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2fb40 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20  memDb==0 );.    
2fb50 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2fb60 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50 61  rSetPagesize(pPa
2fb70 67 65 72 2c 20 26 73 7a 50 61 67 65 44 66 6c 74  ger, &szPageDflt
2fb80 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63  , -1);.    testc
2fb90 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
2fba0 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OK );.  }..  /* 
2fbb0 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 50  Initialize the P
2fbc0 43 61 63 68 65 20 6f 62 6a 65 63 74 2e 20 2a 2f  Cache object. */
2fbd0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2fbe0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6e 45 78 74  E_OK ){.    nExt
2fbf0 72 61 20 3d 20 52 4f 55 4e 44 38 28 6e 45 78 74  ra = ROUND8(nExt
2fc00 72 61 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ra);.    assert(
2fc10 20 6e 45 78 74 72 61 3e 3d 38 20 26 26 20 6e 45   nExtra>=8 && nE
2fc20 78 74 72 61 3c 31 30 30 30 20 29 3b 0a 20 20 20  xtra<1000 );.   
2fc30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61   rc = sqlite3Pca
2fc40 63 68 65 4f 70 65 6e 28 73 7a 50 61 67 65 44 66  cheOpen(szPageDf
2fc50 6c 74 2c 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d  lt, nExtra, !mem
2fc60 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Db,.            
2fc70 20 20 20 20 20 20 20 20 20 20 20 21 6d 65 6d 44             !memD
2fc80 62 3f 70 61 67 65 72 53 74 72 65 73 73 3a 30 2c  b?pagerStress:0,
2fc90 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c   (void *)pPager,
2fca0 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65   pPager->pPCache
2fcb0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
2fcc0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  an error occurre
2fcd0 64 20 61 62 6f 76 65 2c 20 66 72 65 65 20 74 68  d above, free th
2fce0 65 20 20 50 61 67 65 72 20 73 74 72 75 63 74 75  e  Pager structu
2fcf0 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65  re and close the
2fd00 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
2fd10 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2fd20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
2fd30 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64  Close(pPager->fd
2fd40 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
2fd50 67 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70  geFree(pPager->p
2fd60 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 73  TmpSpace);.    s
2fd70 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
2fd80 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  er);.    return 
2fd90 72 63 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52  rc;.  }..  PAGER
2fda0 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20  TRACE(("OPEN %d 
2fdb0 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c  %s\n", FILEHANDL
2fdc0 45 49 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c  EID(pPager->fd),
2fdd0 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
2fde0 6d 65 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  me));.  IOTRACE(
2fdf0 28 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c  ("OPEN %p %s\n",
2fe00 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d   pPager, pPager-
2fe10 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20  >zFilename))..  
2fe20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
2fe30 61 6c 20 3d 20 28 75 38 29 75 73 65 4a 6f 75 72  al = (u8)useJour
2fe40 6e 61 6c 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  nal;.  /* pPager
2fe50 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20  ->stmtOpen = 0; 
2fe60 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2fe70 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a  stmtInUse = 0; *
2fe80 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e  /.  /* pPager->n
2fe90 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  Ref = 0; */.  /*
2fea0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
2feb0 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
2fec0 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
2fed0 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2fee0 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b  ager->nPage = 0;
2fef0 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78   */.  pPager->mx
2ff00 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41  Pgno = SQLITE_MA
2ff10 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20  X_PAGE_COUNT;.  
2ff20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  /* pPager->state
2ff30 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b   = PAGER_UNLOCK;
2ff40 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2ff50 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f  >errMask = 0; */
2ff60 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  .  pPager->tempF
2ff70 69 6c 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69  ile = (u8)tempFi
2ff80 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65  le;.  assert( te
2ff90 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f  mpFile==PAGER_LO
2ffa0 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
2ffb0 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74   .          || t
2ffc0 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c  empFile==PAGER_L
2ffd0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
2ffe0 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74  SIVE );.  assert
2fff0 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ( PAGER_LOCKINGM
30000 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31  ODE_EXCLUSIVE==1
30010 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78   );.  pPager->ex
30020 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 28 75  clusiveMode = (u
30030 38 29 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70  8)tempFile; .  p
30040 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
30050 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d  ntDone = pPager-
30060 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61  >tempFile;.  pPa
30070 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 28 75 38  ger->memDb = (u8
30080 29 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72  )memDb;.  pPager
30090 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 28 75 38  ->readOnly = (u8
300a0 29 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 61 73 73  )readOnly;.  ass
300b0 65 72 74 28 20 75 73 65 4a 6f 75 72 6e 61 6c 20  ert( useJournal 
300c0 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
300d0 69 6c 65 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  ile );.  pPager-
300e0 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72  >noSync = pPager
300f0 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 69 66  ->tempFile;.  if
30100 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  ( pPager->noSync
30110 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
30120 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
30130 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
30140 74 28 20 70 50 61 67 65 72 2d 3e 65 78 74 72 61  t( pPager->extra
30150 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Sync==0 );.    a
30160 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
30170 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20  yncFlags==0 );. 
30180 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
30190 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 3d  r->walSyncFlags=
301a0 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  =0 );.  }else{. 
301b0 20 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53     pPager->fullS
301c0 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  ync = 1;.    pPa
301d0 67 65 72 2d 3e 65 78 74 72 61 53 79 6e 63 20 3d  ger->extraSync =
301e0 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
301f0 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49  syncFlags = SQLI
30200 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a  TE_SYNC_NORMAL;.
30210 20 20 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53      pPager->walS
30220 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
30230 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 7c 20  E_SYNC_NORMAL | 
30240 28 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52  (SQLITE_SYNC_NOR
30250 4d 41 4c 3c 3c 32 29 3b 0a 20 20 7d 0a 20 20 2f  MAL<<2);.  }.  /
30260 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  * pPager->pFirst
30270 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
30280 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
30290 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ed = 0; */.  /* 
302a0 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
302b0 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
302c0 6e 45 78 74 72 61 20 3d 20 28 75 31 36 29 6e 45  nExtra = (u16)nE
302d0 78 74 72 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e  xtra;.  pPager->
302e0 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
302f0 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
30300 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c  T_JOURNAL_SIZE_L
30310 49 4d 49 54 3b 0a 20 20 61 73 73 65 72 74 28 20  IMIT;.  assert( 
30320 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
30330 64 29 20 7c 7c 20 74 65 6d 70 46 69 6c 65 20 29  d) || tempFile )
30340 3b 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a  ;.  setSectorSiz
30350 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  e(pPager);.  if(
30360 20 21 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a   !useJournal ){.
30370 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
30380 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f  nalMode = PAGER_
30390 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b  JOURNALMODE_OFF;
303a0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d  .  }else if( mem
303b0 44 62 20 7c 7c 20 6d 65 6d 4a 4d 20 29 7b 0a 20  Db || memJM ){. 
303c0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
303d0 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a  alMode = PAGER_J
303e0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
303f0 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67  Y;.  }.  /* pPag
30400 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72  er->xBusyHandler
30410 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
30420 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
30430 65 72 41 72 67 20 3d 20 30 3b 20 2a 2f 0a 20 20  erArg = 0; */.  
30440 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
30450 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 20 20 73  r = xReinit;.  s
30460 65 74 47 65 74 74 65 72 4d 65 74 68 6f 64 28 70  etGetterMethod(p
30470 50 61 67 65 72 29 3b 0a 20 20 2f 2a 20 6d 65 6d  Pager);.  /* mem
30480 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73  set(pPager->aHas
30490 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61  h, 0, sizeof(pPa
304a0 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f  ger->aHash)); */
304b0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 7a  .  /* pPager->sz
304c0 4d 6d 61 70 20 3d 20 53 51 4c 49 54 45 5f 44 45  Mmap = SQLITE_DE
304d0 46 41 55 4c 54 5f 4d 4d 41 50 5f 53 49 5a 45 20  FAULT_MMAP_SIZE 
304e0 2f 2f 20 77 69 6c 6c 20 62 65 20 73 65 74 20 62  // will be set b
304f0 79 20 62 74 72 65 65 2e 63 20 2a 2f 0a 0a 20 20  y btree.c */..  
30500 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  *ppPager = pPage
30510 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  r;.  return SQLI
30520 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a  TE_OK;.}..../*.*
30530 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
30540 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
30550 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72  transitioning fr
30560 6f 6d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  om PAGER_UNLOCK 
30570 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 53 48 41 52  to.** PAGER_SHAR
30580 45 44 20 73 74 61 74 65 2e 20 49 74 20 74 65 73  ED state. It tes
30590 74 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ts if there is a
305a0 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 70 72 65   hot journal pre
305b0 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 66  sent in.** the f
305c0 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72 20 74  ile-system for t
305d0 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 20  he given pager. 
305e0 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73  A hot journal is
305f0 20 6f 6e 65 20 74 68 61 74 20 0a 2a 2a 20 6e 65   one that .** ne
30600 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64  eds to be played
30610 20 62 61 63 6b 2e 20 41 63 63 6f 72 64 69 6e 67   back. According
30620 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
30630 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  n, a hot-journal
30640 0a 2a 2a 20 66 69 6c 65 20 65 78 69 73 74 73 20  .** file exists 
30650 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  if the following
30660 20 63 72 69 74 65 72 69 61 20 61 72 65 20 6d 65   criteria are me
30670 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65  t:.**.**   * The
30680 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
30690 69 73 74 73 20 69 6e 20 74 68 65 20 66 69 6c 65  ists in the file
306a0 20 73 79 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20   system, and.** 
306b0 20 20 2a 20 4e 6f 20 70 72 6f 63 65 73 73 20 68    * No process h
306c0 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45 44 20  olds a RESERVED 
306d0 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
306e0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
306f0 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a  file, and.**   *
30700 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
30710 6c 65 20 69 74 73 65 6c 66 20 69 73 20 67 72 65  le itself is gre
30720 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65  ater than 0 byte
30730 73 20 69 6e 20 73 69 7a 65 2c 20 61 6e 64 0a 2a  s in size, and.*
30740 2a 20 20 20 2a 20 54 68 65 20 66 69 72 73 74 20  *   * The first 
30750 62 79 74 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  byte of the jour
30760 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  nal file exists 
30770 61 6e 64 20 69 73 20 6e 6f 74 20 30 78 30 30 2e  and is not 0x00.
30780 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
30790 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68  rrent size of th
307a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
307b0 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e  is 0 but a journ
307c0 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74  al file.** exist
307d0 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62 61  s, that is proba
307e0 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e  bly an old journ
307f0 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f  al left over fro
30800 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74  m a prior.** dat
30810 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73  abase with the s
30820 61 6d 65 20 6e 61 6d 65 2e 20 49 6e 20 74 68 69  ame name. In thi
30830 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e  s case the journ
30840 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 6a 75  al file is.** ju
30850 73 74 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67  st deleted using
30860 20 4f 73 44 65 6c 65 74 65 2c 20 2a 70 45 78 69   OsDelete, *pExi
30870 73 74 73 20 69 73 20 73 65 74 20 74 6f 20 30 20  sts is set to 0 
30880 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  and SQLITE_OK.**
30890 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
308a0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
308b0 20 64 6f 65 73 20 6e 6f 74 20 63 68 65 63 6b 20   does not check 
308c0 69 66 20 74 68 65 72 65 20 69 73 20 61 20 6d 61  if there is a ma
308d0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
308e0 65 6e 61 6d 65 0a 2a 2a 20 61 74 20 74 68 65 20  ename.** at the 
308f0 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2e  end of the file.
30900 20 49 66 20 74 68 65 72 65 20 69 73 2c 20 61 6e   If there is, an
30910 64 20 74 68 61 74 20 6d 61 73 74 65 72 20 6a 6f  d that master jo
30920 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f  urnal file.** do
30930 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68  es not exist, th
30940 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
30950 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c  ile is not reall
30960 79 20 68 6f 74 2e 20 49 6e 20 74 68 69 73 0a 2a  y hot. In this.*
30970 2a 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74  * case this rout
30980 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  ine will return 
30990 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65  a false-positive
309a0 2e 20 54 68 65 20 70 61 67 65 72 5f 70 6c 61 79  . The pager_play
309b0 62 61 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  back().** routin
309c0 65 20 77 69 6c 6c 20 64 69 73 63 6f 76 65 72 20  e will discover 
309d0 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
309e0 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61   file is not rea
309f0 6c 6c 79 20 68 6f 74 20 61 6e 64 20 0a 2a 2a 20  lly hot and .** 
30a00 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69 74  will not roll it
30a10 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66   back. .**.** If
30a20 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66   a hot-journal f
30a30 69 6c 65 20 69 73 20 66 6f 75 6e 64 20 74 6f 20  ile is found to 
30a40 65 78 69 73 74 2c 20 2a 70 45 78 69 73 74 73 20  exist, *pExists 
30a50 69 73 20 73 65 74 20 74 6f 20 31 20 61 6e 64 20  is set to 1 and 
30a60 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  .** SQLITE_OK re
30a70 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 20 68 6f  turned. If no ho
30a80 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  t-journal file i
30a90 73 20 70 72 65 73 65 6e 74 2c 20 2a 70 45 78 69  s present, *pExi
30aa0 73 74 73 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  sts is.** set to
30ab0 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b   0 and SQLITE_OK
30ac0 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
30ad0 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
30ae0 20 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a   while trying.**
30af0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68   to determine wh
30b00 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 68  ether or not a h
30b10 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
30b20 65 78 69 73 74 73 2c 20 74 68 65 20 49 4f 20 65  exists, the IO e
30b30 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 73 20  rror.** code is 
30b40 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
30b50 20 76 61 6c 75 65 20 6f 66 20 2a 70 45 78 69 73   value of *pExis
30b60 74 73 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e  ts is undefined.
30b70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68  .*/.static int h
30b80 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67  asHotJournal(Pag
30b90 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
30ba0 2a 70 45 78 69 73 74 73 29 7b 0a 20 20 73 71 6c  *pExists){.  sql
30bb0 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74  ite3_vfs * const
30bc0 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e   pVfs = pPager->
30bd0 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pVfs;.  int rc =
30be0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
30bf0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
30c00 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65 78  code */.  int ex
30c10 69 73 74 73 20 3d 20 31 3b 20 20 20 20 20 20 20  ists = 1;       
30c20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
30c30 69 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  if a journal fil
30c40 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  e is present */.
30c50 20 20 69 6e 74 20 6a 72 6e 6c 4f 70 65 6e 20 3d    int jrnlOpen =
30c60 20 21 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72   !!isOpen(pPager
30c70 2d 3e 6a 66 64 29 3b 0a 0a 20 20 61 73 73 65 72  ->jfd);..  asser
30c80 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  t( pPager->useJo
30c90 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72  urnal );.  asser
30ca0 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
30cb0 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72  ->fd) );.  asser
30cc0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
30cd0 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b  e==PAGER_OPEN );
30ce0 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 72 6e 6c  ..  assert( jrnl
30cf0 4f 70 65 6e 3d 3d 30 20 7c 7c 20 28 20 73 71 6c  Open==0 || ( sql
30d00 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
30d10 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
30d20 65 72 2d 3e 6a 66 64 29 20 26 0a 20 20 20 20 53  er->jfd) &.    S
30d30 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45  QLITE_IOCAP_UNDE
30d40 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45  LETABLE_WHEN_OPE
30d50 4e 0a 20 20 29 29 3b 0a 0a 20 20 2a 70 45 78 69  N.  ));..  *pExi
30d60 73 74 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 21  sts = 0;.  if( !
30d70 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  jrnlOpen ){.    
30d80 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
30d90 63 65 73 73 28 70 56 66 73 2c 20 70 50 61 67 65  cess(pVfs, pPage
30da0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c  r->zJournal, SQL
30db0 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
30dc0 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20 7d  S, &exists);.  }
30dd0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
30de0 45 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20 29  E_OK && exists )
30df0 7b 0a 20 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64  {.    int locked
30e00 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
30e10 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 6d    /* True if som
30e20 65 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  e process holds 
30e30 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
30e40 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 61 63 65 20  */..    /* Race 
30e50 63 6f 6e 64 69 74 69 6f 6e 20 68 65 72 65 3a 20  condition here: 
30e60 20 41 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73   Another process
30e70 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e   might have been
30e80 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 20   holding the.   
30e90 20 2a 2a 20 74 68 65 20 52 45 53 45 52 56 45 44   ** the RESERVED
30ea0 20 6c 6f 63 6b 20 61 6e 64 20 68 61 76 65 20 61   lock and have a
30eb0 20 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 20 61 74   journal open at
30ec0 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 41 63   the sqlite3OsAc
30ed0 63 65 73 73 28 29 20 0a 20 20 20 20 2a 2a 20 63  cess() .    ** c
30ee0 61 6c 6c 20 61 62 6f 76 65 2c 20 62 75 74 20 74  all above, but t
30ef0 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a  hen delete the j
30f00 6f 75 72 6e 61 6c 20 61 6e 64 20 64 72 6f 70 20  ournal and drop 
30f10 74 68 65 20 6c 6f 63 6b 20 62 65 66 6f 72 65 0a  the lock before.
30f20 20 20 20 20 2a 2a 20 77 65 20 67 65 74 20 74 6f      ** we get to
30f30 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
30f40 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73  qlite3OsCheckRes
30f50 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c  ervedLock() call
30f60 2e 20 20 49 66 20 74 68 61 74 0a 20 20 20 20 2a  .  If that.    *
30f70 2a 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  * is the case, t
30f80 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  his routine migh
30f90 74 20 74 68 69 6e 6b 20 74 68 65 72 65 20 69 73  t think there is
30fa0 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 77   a hot journal w
30fb0 68 65 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 66 61  hen.    ** in fa
30fc0 63 74 20 74 68 65 72 65 20 69 73 20 6e 6f 6e 65  ct there is none
30fd0 2e 20 20 54 68 69 73 20 72 65 73 75 6c 74 73 20  .  This results 
30fe0 69 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74  in a false-posit
30ff0 69 76 65 20 77 68 69 63 68 20 77 69 6c 6c 0a 20  ive which will. 
31000 20 20 20 2a 2a 20 62 65 20 64 65 61 6c 74 20 77     ** be dealt w
31010 69 74 68 20 62 79 20 74 68 65 20 70 6c 61 79 62  ith by the playb
31020 61 63 6b 20 72 6f 75 74 69 6e 65 2e 20 20 54 69  ack routine.  Ti
31030 63 6b 65 74 20 23 33 38 38 33 2e 0a 20 20 20 20  cket #3883..    
31040 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
31050 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76  te3OsCheckReserv
31060 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  edLock(pPager->f
31070 64 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 20  d, &locked);.   
31080 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
31090 4f 4b 20 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b  OK && !locked ){
310a0 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67  .      Pgno nPag
310b0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
310c0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
310d0 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73  pages in databas
310e0 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20  e file */..     
310f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
31100 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29 3b 0a  >tempFile==0 );.
31110 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
31120 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
31130 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  , &nPage);.     
31140 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
31150 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  OK ){.        /*
31160 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
31170 20 69 73 20 7a 65 72 6f 20 70 61 67 65 73 20 69   is zero pages i
31180 6e 20 73 69 7a 65 2c 20 74 68 61 74 20 6d 65 61  n size, that mea
31190 6e 73 20 74 68 61 74 20 65 69 74 68 65 72 20 28  ns that either (
311a0 31 29 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  1) the.        *
311b0 2a 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 20 72  * journal is a r
311c0 65 6d 6e 61 6e 74 20 66 72 6f 6d 20 61 20 70 72  emnant from a pr
311d0 69 6f 72 20 64 61 74 61 62 61 73 65 20 77 69 74  ior database wit
311e0 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20  h the same name 
311f0 77 68 65 72 65 0a 20 20 20 20 20 20 20 20 2a 2a  where.        **
31200 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
31210 6c 65 20 62 75 74 20 6e 6f 74 20 74 68 65 20 6a  le but not the j
31220 6f 75 72 6e 61 6c 20 77 61 73 20 64 65 6c 65 74  ournal was delet
31230 65 64 2c 20 6f 72 20 28 32 29 20 74 68 65 20 69  ed, or (2) the i
31240 6e 69 74 69 61 6c 0a 20 20 20 20 20 20 20 20 2a  nitial.        *
31250 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  * transaction th
31260 61 74 20 70 6f 70 75 6c 61 74 65 73 20 61 20 6e  at populates a n
31270 65 77 20 64 61 74 61 62 61 73 65 20 69 73 20 62  ew database is b
31280 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
31290 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20  ..        ** In 
312a0 65 69 74 68 65 72 20 63 61 73 65 2c 20 74 68 65  either case, the
312b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61   journal file ca
312c0 6e 20 62 65 20 64 65 6c 65 74 65 64 2e 20 20 48  n be deleted.  H
312d0 6f 77 65 76 65 72 2c 20 74 61 6b 65 20 63 61 72  owever, take car
312e0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74  e.        ** not
312f0 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a   to delete the j
31300 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 69  ournal file if i
31310 74 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  t is already ope
31320 6e 20 64 75 65 20 74 6f 0a 20 20 20 20 20 20 20  n due to.       
31330 20 2a 2a 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65   ** journal_mode
31340 3d 50 45 52 53 49 53 54 2e 0a 20 20 20 20 20 20  =PERSIST..      
31350 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
31360 20 6e 50 61 67 65 3d 3d 30 20 26 26 20 21 6a 72   nPage==0 && !jr
31370 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20  nlOpen ){.      
31380 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
31390 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
313a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 61            if( pa
313b0 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72  gerLockDb(pPager
313c0 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  , RESERVED_LOCK)
313d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
313e0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
313f0 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
31400 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
31410 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  l, 0);.         
31420 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
31430 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 20  exclusiveMode ) 
31440 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50  pagerUnlockDb(pP
31450 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ager, SHARED_LOC
31460 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  K);.          }.
31470 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
31480 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
31490 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ();.        }els
314a0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
314b0 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
314c0 20 65 78 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f   exists and no o
314d0 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
314e0 68 61 73 20 61 20 72 65 73 65 72 76 65 64 0a 20  has a reserved. 
314f0 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 67           ** or g
31500 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74  reater lock on t
31510 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
31520 2e 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74  . Now check that
31530 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 20 20   there is.      
31540 20 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20      ** at least 
31550 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74  one non-zero byt
31560 65 73 20 61 74 20 74 68 65 20 73 74 61 72 74 20  es at the start 
31570 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
31580 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ile..          *
31590 2a 20 49 66 20 74 68 65 72 65 20 69 73 2c 20 74  * If there is, t
315a0 68 65 6e 20 77 65 20 63 6f 6e 73 69 64 65 72 20  hen we consider 
315b0 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20  this journal to 
315c0 62 65 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20  be hot. If not, 
315d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74  .          ** it
315e0 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e   can be ignored.
315f0 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
31600 20 20 20 20 20 20 20 20 69 66 28 20 21 6a 72 6e          if( !jrn
31610 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20  lOpen ){.       
31620 20 20 20 20 20 69 6e 74 20 66 20 3d 20 0a 23 69       int f = .#i
31630 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
31640 44 41 54 41 5f 50 52 4f 54 45 43 54 49 4f 4e 0a  DATA_PROTECTION.
31650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70                (p
31660 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 26  Pager->vfsFlags&
31670 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 49 4c 45  SQLITE_OPEN_FILE
31680 50 52 4f 54 45 43 54 49 4f 4e 5f 4d 41 53 4b 29  PROTECTION_MASK)
31690 7c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  |.#endif.       
316a0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
316b0 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49  EN_READONLY|SQLI
316c0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
316d0 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20  RNAL;.          
316e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
316f0 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
31700 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
31710 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 29  ger->jfd, f, &f)
31720 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
31730 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
31740 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
31750 20 20 20 20 20 20 20 20 20 75 38 20 66 69 72 73           u8 firs
31760 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
31770 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
31780 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66  sRead(pPager->jf
31790 64 2c 20 28 76 6f 69 64 20 2a 29 26 66 69 72 73  d, (void *)&firs
317a0 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 1, 0);.      
317b0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
317c0 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
317d0 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20  _READ ){.       
317e0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
317f0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
31800 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
31810 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29   if( !jrnlOpen )
31820 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
31830 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
31840 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
31850 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
31860 20 20 20 20 20 20 20 2a 70 45 78 69 73 74 73 20         *pExists 
31870 3d 20 28 66 69 72 73 74 21 3d 30 29 3b 0a 20 20  = (first!=0);.  
31880 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
31890 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e  ( rc==SQLITE_CAN
318a0 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 20  TOPEN ){.       
318b0 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63 61       /* If we ca
318c0 6e 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20 72 6f  nnot open the ro
318d0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66  llback journal f
318e0 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ile in order to 
318f0 73 65 65 20 69 66 0a 20 20 20 20 20 20 20 20 20  see if.         
31900 20 20 20 2a 2a 20 69 74 20 68 61 73 20 61 20 7a     ** it has a z
31910 65 72 6f 20 68 65 61 64 65 72 2c 20 74 68 61 74  ero header, that
31920 20 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f   might be due to
31930 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 2c 20 6f   an I/O error, o
31940 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  r.            **
31950 20 69 74 20 6d 69 67 68 74 20 62 65 20 64 75 65   it might be due
31960 20 74 6f 20 74 68 65 20 72 61 63 65 20 63 6f 6e   to the race con
31970 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64  dition described
31980 20 61 62 6f 76 65 20 61 6e 64 20 69 6e 0a 20 20   above and in.  
31990 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 69 63            ** tic
319a0 6b 65 74 20 23 33 38 38 33 2e 20 20 45 69 74 68  ket #3883.  Eith
319b0 65 72 20 77 61 79 2c 20 61 73 73 75 6d 65 20 74  er way, assume t
319c0 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
319d0 69 73 20 68 6f 74 2e 0a 20 20 20 20 20 20 20 20  is hot..        
319e0 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68      ** This migh
319f0 74 20 62 65 20 61 20 66 61 6c 73 65 20 70 6f 73  t be a false pos
31a00 69 74 69 76 65 2e 20 20 42 75 74 20 69 66 20 69  itive.  But if i
31a10 74 20 69 73 2c 20 74 68 65 6e 20 74 68 65 0a 20  t is, then the. 
31a20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 75             ** au
31a30 74 6f 6d 61 74 69 63 20 6a 6f 75 72 6e 61 6c 20  tomatic journal 
31a40 70 6c 61 79 62 61 63 6b 20 61 6e 64 20 72 65 63  playback and rec
31a50 6f 76 65 72 79 20 6d 65 63 68 61 6e 69 73 6d 20  overy mechanism 
31a60 77 69 6c 6c 20 64 65 61 6c 0a 20 20 20 20 20 20  will deal.      
31a70 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 69 74        ** with it
31a80 20 75 6e 64 65 72 20 61 6e 20 45 58 43 4c 55 53   under an EXCLUS
31a90 49 56 45 20 6c 6f 63 6b 20 77 68 65 72 65 20 77  IVE lock where w
31aa0 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f  e do not need to
31ab0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
31ac0 77 6f 72 72 79 20 73 6f 20 6d 75 63 68 20 77 69  worry so much wi
31ad0 74 68 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f  th race conditio
31ae0 6e 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ns..            
31af0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  */.            *
31b00 70 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20 20  pExists = 1;.   
31b10 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
31b20 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
31b30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
31b40 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
31b50 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
31b60 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
31b70 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
31b80 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72  to obtain a shar
31b90 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ed lock on the d
31ba0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
31bb0 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74   It is illegal t
31bc0 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61  o call sqlite3Pa
31bd0 67 65 72 47 65 74 28 29 20 75 6e 74 69 6c 20 61  gerGet() until a
31be0 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
31bf0 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 73  on.** has been s
31c00 75 63 63 65 73 73 66 75 6c 6c 79 20 63 61 6c 6c  uccessfully call
31c10 65 64 2e 20 49 66 20 61 20 73 68 61 72 65 64 2d  ed. If a shared-
31c20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20  lock is already 
31c30 68 65 6c 64 20 77 68 65 6e 0a 2a 2a 20 74 68 69  held when.** thi
31c40 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
31c50 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
31c60 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  -op..**.** The f
31c70 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74 69  ollowing operati
31c80 6f 6e 73 20 61 72 65 20 61 6c 73 6f 20 70 65 72  ons are also per
31c90 66 6f 72 6d 65 64 20 62 79 20 74 68 69 73 20 66  formed by this f
31ca0 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20  unction..**.**  
31cb0 20 31 29 20 49 66 20 74 68 65 20 70 61 67 65 72   1) If the pager
31cc0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e   is currently in
31cd0 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
31ce0 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a  e (no lock held.
31cf0 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20 64  **      on the d
31d00 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20 74  atabase file), t
31d10 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69  hen an attempt i
31d20 73 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e  s made to obtain
31d30 20 61 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45   a.**      SHARE
31d40 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  D lock on the da
31d50 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d  tabase file. Imm
31d60 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f  ediately after o
31d70 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20  btaining.**     
31d80 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b   the SHARED lock
31d90 2c 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  , the file-syste
31da0 6d 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f 72  m is checked for
31db0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a   a hot-journal,.
31dc0 2a 2a 20 20 20 20 20 20 77 68 69 63 68 20 69 73  **      which is
31dd0 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 66 20   played back if 
31de0 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69  present. Followi
31df0 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e  ng any hot-journ
31e00 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c  al .**      roll
31e10 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e  back, the conten
31e20 74 73 20 6f 66 20 74 68 65 20 63 61 63 68 65 20  ts of the cache 
31e30 61 72 65 20 76 61 6c 69 64 61 74 65 64 20 62 79  are validated by
31e40 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20   checking.**    
31e50 20 20 74 68 65 20 27 63 68 61 6e 67 65 2d 63 6f    the 'change-co
31e60 75 6e 74 65 72 27 20 66 69 65 6c 64 20 6f 66 20  unter' field of 
31e70 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
31e80 65 20 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20  e header and.** 
31e90 20 20 20 20 20 64 69 73 63 61 72 64 65 64 20 69       discarded i
31ea0 66 20 74 68 65 79 20 61 72 65 20 66 6f 75 6e 64  f they are found
31eb0 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a   to be invalid..
31ec0 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20 74 68  **.**   2) If th
31ed0 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69  e pager is runni
31ee0 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  ng in exclusive-
31ef0 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65 20  mode, and there 
31f00 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a  are currently.**
31f10 20 20 20 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e        no outstan
31f20 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
31f30 74 6f 20 61 6e 79 20 70 61 67 65 73 2c 20 61 6e  to any pages, an
31f40 64 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f  d is in the erro
31f50 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20  r state,.**     
31f60 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74   then an attempt
31f70 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 65 61   is made to clea
31f80 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  r the error stat
31f90 65 20 62 79 20 64 69 73 63 61 72 64 69 6e 67 0a  e by discarding.
31fa0 2a 2a 20 20 20 20 20 20 74 68 65 20 63 6f 6e 74  **      the cont
31fb0 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
31fc0 20 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69   cache and rolli
31fd0 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e  ng back any open
31fe0 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
31ff0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
32000 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
32010 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
32020 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
32030 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
32040 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68 69 6c 65  .** occurs while
32050 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64 61 74   locking the dat
32060 61 62 61 73 65 2c 20 63 68 65 63 6b 69 6e 67 20  abase, checking 
32070 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  for a hot-journa
32080 6c 20 66 69 6c 65 20 6f 72 20 0a 2a 2a 20 72 6f  l file or .** ro
32090 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75  lling back a jou
320a0 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 49  rnal file, the I
320b0 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
320c0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
320d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 61   sqlite3PagerSha
320e0 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70  redLock(Pager *p
320f0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
32100 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
32110 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32120 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
32130 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
32140 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  e is only called
32150 20 66 72 6f 6d 20 62 2d 74 72 65 65 20 61 6e 64   from b-tree and
32160 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 72 65   only when there
32170 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74   are no.  ** out
32180 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 2e 20  standing pages. 
32190 54 68 69 73 20 69 6d 70 6c 69 65 73 20 74 68 61  This implies tha
321a0 74 20 74 68 65 20 70 61 67 65 72 20 73 74 61 74  t the pager stat
321b0 65 20 73 68 6f 75 6c 64 20 65 69 74 68 65 72 0a  e should either.
321c0 20 20 2a 2a 20 62 65 20 4f 50 45 4e 20 6f 72 20    ** be OPEN or 
321d0 52 45 41 44 45 52 2e 20 52 45 41 44 45 52 20 69  READER. READER i
321e0 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20  s only possible 
321f0 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
32200 6f 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20  or was in .  ** 
32210 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73  exclusive access
32220 20 6d 6f 64 65 2e 20 20 2a 2f 0a 20 20 61 73 73   mode.  */.  ass
32230 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63  ert( sqlite3Pcac
32240 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
32250 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29  r->pPCache)==0 )
32260 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
32270 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
32280 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
32290 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
322a0 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c  te==PAGER_OPEN |
322b0 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
322c0 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  ==PAGER_READER )
322d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
322e0 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
322f0 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66 28  ITE_OK );..  if(
32300 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
32310 61 67 65 72 29 20 26 26 20 70 50 61 67 65 72 2d  ager) && pPager-
32320 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
32330 50 45 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20 62  PEN ){.    int b
32340 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 20  HotJournal = 1; 
32350 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
32360 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73   if there exists
32370 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2d 66   a hot journal-f
32380 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  ile */..    asse
32390 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
323a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
323b0 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c  ->tempFile==0 ||
323c0 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
323d0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
323e0 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ;..    rc = page
323f0 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
32400 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f  Pager, SHARED_LO
32410 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  CK);.    if( rc!
32420 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
32430 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
32440 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f  er->eLock==NO_LO
32450 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c  CK || pPager->eL
32460 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock==UNKNOWN_LOC
32470 4b 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K );.      goto 
32480 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20  failed;.    }.. 
32490 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e     /* If a journ
324a0 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  al file exists, 
324b0 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20  and there is no 
324c0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
324d0 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
324e0 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
324f0 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73 20  it either needs 
32500 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
32510 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20  k or deleted..  
32520 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
32530 67 65 72 2d 3e 65 4c 6f 63 6b 3c 3d 53 48 41 52  ger->eLock<=SHAR
32540 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  ED_LOCK ){.     
32550 20 72 63 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72   rc = hasHotJour
32560 6e 61 6c 28 70 50 61 67 65 72 2c 20 26 62 48 6f  nal(pPager, &bHo
32570 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 7d  tJournal);.    }
32580 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
32590 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
325a0 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
325b0 20 7d 0a 20 20 20 20 69 66 28 20 62 48 6f 74 4a   }.    if( bHotJ
325c0 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
325d0 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64  if( pPager->read
325e0 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Only ){.        
325f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
32600 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20  ONLY_ROLLBACK;. 
32610 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
32620 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ed;.      }..   
32630 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43     /* Get an EXC
32640 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
32650 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
32660 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
32670 69 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69  it is.      ** i
32680 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20  mportant that a 
32690 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
326a0 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e   not obtained on
326b0 20 74 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a   the way to the.
326c0 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49        ** EXCLUSI
326d0 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77  VE lock. If it w
326e0 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f  ere, another pro
326f0 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20  cess might open 
32700 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
32710 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65  abase file, dete
32720 63 74 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ct the RESERVED 
32730 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75  lock, and conclu
32740 64 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  de that the.    
32750 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73    ** database is
32760 20 73 61 66 65 20 74 6f 20 72 65 61 64 20 77 68   safe to read wh
32770 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73  ile this process
32780 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e   is still rollin
32790 67 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  g the .      ** 
327a0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b  hot-journal back
327b0 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20  ..      ** .    
327c0 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65    ** Because the
327d0 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45   intermediate RE
327e0 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e  SERVED lock is n
327f0 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e  ot requested, an
32800 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72  y.      ** other
32810 20 70 72 6f 63 65 73 73 20 61 74 74 65 6d 70 74   process attempt
32820 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20 74 68  ing to access th
32830 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
32840 77 69 6c 6c 20 67 65 74 20 74 6f 20 0a 20 20 20  will get to .   
32850 20 20 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74     ** this point
32860 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64   in the code and
32870 20 66 61 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20   fail to obtain 
32880 69 74 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56  its own EXCLUSIV
32890 45 20 6c 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a  E lock .      **
328a0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
328b0 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a   file..      **.
328c0 20 20 20 20 20 20 2a 2a 20 55 6e 6c 65 73 73 20        ** Unless 
328d0 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
328e0 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63  locking_mode=exc
328f0 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65  lusive mode, the
32900 20 6c 6f 63 6b 20 69 73 0a 20 20 20 20 20 20 2a   lock is.      *
32910 2a 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20  * downgraded to 
32920 53 48 41 52 45 44 5f 4c 4f 43 4b 20 62 65 66 6f  SHARED_LOCK befo
32930 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  re this function
32940 20 72 65 74 75 72 6e 73 2e 0a 20 20 20 20 20 20   returns..      
32950 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  */.      rc = pa
32960 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72  gerLockDb(pPager
32970 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
32980 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
32990 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
329a0 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
329b0 64 3b 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20  d;.      }. .   
329c0 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20 6e     /* If it is n
329d0 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20  ot already open 
329e0 61 6e 64 20 74 68 65 20 66 69 6c 65 20 65 78 69  and the file exi
329f0 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 6f 70 65  sts on disk, ope
32a00 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  n the .      ** 
32a10 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64  journal for read
32a20 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 57  /write access. W
32a30 72 69 74 65 20 61 63 63 65 73 73 20 69 73 20 72  rite access is r
32a40 65 71 75 69 72 65 64 20 62 65 63 61 75 73 65 20  equired because 
32a50 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 65 78 63  .      ** in exc
32a60 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f  lusive-access mo
32a70 64 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  de the file desc
32a80 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b  riptor will be k
32a90 65 70 74 20 6f 70 65 6e 20 0a 20 20 20 20 20 20  ept open .      
32aa0 2a 2a 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20  ** and possibly 
32ab0 75 73 65 64 20 66 6f 72 20 61 20 74 72 61 6e 73  used for a trans
32ac0 61 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e  action later on.
32ad0 20 41 6c 73 6f 2c 20 77 72 69 74 65 2d 61 63 63   Also, write-acc
32ae0 65 73 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 73  ess .      ** is
32af0 20 75 73 75 61 6c 6c 79 20 72 65 71 75 69 72 65   usually require
32b00 64 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68  d to finalize th
32b10 65 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 6a 6f 75  e journal in jou
32b20 72 6e 61 6c 5f 6d 6f 64 65 3d 70 65 72 73 69 73  rnal_mode=persis
32b30 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65  t .      ** mode
32b40 20 28 61 6e 64 20 61 6c 73 6f 20 66 6f 72 20 6a   (and also for j
32b50 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 74 72 75 6e  ournal_mode=trun
32b60 63 61 74 65 20 6f 6e 20 73 6f 6d 65 20 73 79 73  cate on some sys
32b70 74 65 6d 73 29 2e 0a 20 20 20 20 20 20 2a 2a 0a  tems)..      **.
32b80 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20        ** If the 
32b90 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74  journal does not
32ba0 20 65 78 69 73 74 2c 20 69 74 20 75 73 75 61 6c   exist, it usual
32bb0 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20 73 6f  ly means that so
32bc0 6d 65 20 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68  me .      ** oth
32bd0 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61  er connection ma
32be0 6e 61 67 65 64 20 74 6f 20 67 65 74 20 69 6e 20  naged to get in 
32bf0 61 6e 64 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b  and roll it back
32c00 20 62 65 66 6f 72 65 20 0a 20 20 20 20 20 20 2a   before .      *
32c10 2a 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  * this connectio
32c20 6e 20 6f 62 74 61 69 6e 65 64 20 74 68 65 20 65  n obtained the e
32c30 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 61 62  xclusive lock ab
32c40 6f 76 65 2e 20 4f 72 2c 20 69 74 20 0a 20 20 20  ove. Or, it .   
32c50 20 20 20 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74     ** may mean t
32c60 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77 61  hat the pager wa
32c70 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73  s in the error-s
32c80 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 20  tate when this. 
32c90 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
32ca0 20 77 61 73 20 63 61 6c 6c 65 64 20 61 6e 64 20   was called and 
32cb0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
32cc0 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e   does not exist.
32cd0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
32ce0 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  if( !isOpen(pPag
32cf0 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
32d00 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20      sqlite3_vfs 
32d10 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70  * const pVfs = p
32d20 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20  Pager->pVfs;.   
32d30 20 20 20 20 20 69 6e 74 20 62 45 78 69 73 74 73       int bExists
32d40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
32d50 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61  * True if journa
32d60 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f  l file exists */
32d70 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
32d80 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a 20  lite3OsAccess(. 
32d90 20 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2c             pVfs,
32da0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
32db0 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  l, SQLITE_ACCESS
32dc0 5f 45 58 49 53 54 53 2c 20 26 62 45 78 69 73 74  _EXISTS, &bExist
32dd0 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  s);.        if( 
32de0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
32df0 20 62 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20   bExists ){.    
32e00 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d        int fout =
32e10 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   0;.          in
32e20 74 20 66 20 3d 20 0a 23 69 66 20 53 51 4c 49 54  t f = .#if SQLIT
32e30 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52  E_ENABLE_DATA_PR
32e40 4f 54 45 43 54 49 4f 4e 0a 20 20 20 20 20 20 20  OTECTION.       
32e50 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 76 66       (pPager->vf
32e60 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50  sFlags&SQLITE_OP
32e70 45 4e 5f 46 49 4c 45 50 52 4f 54 45 43 54 49 4f  EN_FILEPROTECTIO
32e80 4e 5f 4d 41 53 4b 29 7c 0a 23 65 6e 64 69 66 0a  N_MASK)|.#endif.
32e90 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
32ea0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
32eb0 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  E|SQLITE_OPEN_MA
32ec0 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20  IN_JOURNAL;.    
32ed0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
32ee0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
32ef0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
32f00 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
32f10 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
32f20 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
32f30 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a  jfd, f, &fout);.
32f40 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
32f50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
32f60 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  || isOpen(pPager
32f70 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 20 20  ->jfd) );.      
32f80 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
32f90 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26 53 51  TE_OK && fout&SQ
32fa0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
32fb0 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  LY ){.          
32fc0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41    rc = SQLITE_CA
32fd0 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20  NTOPEN_BKPT;.   
32fe0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
32ff0 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
33000 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  jfd);.          
33010 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
33020 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 50    }. .      /* P
33030 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65  layback and dele
33040 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  te the journal. 
33050 20 44 72 6f 70 20 74 68 65 20 64 61 74 61 62 61   Drop the databa
33060 73 65 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a  se write.      *
33070 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71  * lock and reacq
33080 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f  uire the read lo
33090 63 6b 2e 20 50 75 72 67 65 20 74 68 65 20 63 61  ck. Purge the ca
330a0 63 68 65 20 62 65 66 6f 72 65 0a 20 20 20 20 20  che before.     
330b0 20 2a 2a 20 70 6c 61 79 69 6e 67 20 62 61 63 6b   ** playing back
330c0 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c   the hot-journal
330d0 20 73 6f 20 74 68 61 74 20 77 65 20 64 6f 6e 27   so that we don'
330e0 74 20 65 6e 64 20 75 70 20 77 69 74 68 0a 20 20  t end up with.  
330f0 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73      ** an incons
33100 69 73 74 65 6e 74 20 63 61 63 68 65 2e 20 20 53  istent cache.  S
33110 79 6e 63 20 74 68 65 20 68 6f 74 20 6a 6f 75 72  ync the hot jour
33120 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69  nal before playi
33130 6e 67 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 62  ng.      ** it b
33140 61 63 6b 20 73 69 6e 63 65 20 74 68 65 20 70 72  ack since the pr
33150 6f 63 65 73 73 20 74 68 61 74 20 63 72 61 73 68  ocess that crash
33160 65 64 20 61 6e 64 20 6c 65 66 74 20 74 68 65 20  ed and left the 
33170 68 6f 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  hot journal.    
33180 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20 64 69    ** probably di
33190 64 20 6e 6f 74 20 73 79 6e 63 20 69 74 20 61 6e  d not sync it an
331a0 64 20 77 65 20 61 72 65 20 72 65 71 75 69 72 65  d we are require
331b0 64 20 74 6f 20 61 6c 77 61 79 73 20 73 79 6e 63  d to always sync
331c0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f  .      ** the jo
331d0 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61  urnal before pla
331e0 79 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 20 20  ying it back..  
331f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
33200 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
33210 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  jfd) ){.        
33220 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
33230 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20  TE_OK );.       
33240 20 72 63 20 3d 20 70 61 67 65 72 53 79 6e 63 48   rc = pagerSyncH
33250 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  otJournal(pPager
33260 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
33270 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
33280 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
33290 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
332a0 61 67 65 72 2c 20 21 70 50 61 67 65 72 2d 3e 74  ager, !pPager->t
332b0 65 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  empFile);.      
332c0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
332d0 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b  te = PAGER_OPEN;
332e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
332f0 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61 67   }else if( !pPag
33300 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
33310 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67  e ){.        pag
33320 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65  erUnlockDb(pPage
33330 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  r, SHARED_LOCK);
33340 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
33350 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
33360 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  K ){.        /* 
33370 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74  This branch is t
33380 61 6b 65 6e 20 69 66 20 61 6e 20 65 72 72 6f 72  aken if an error
33390 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
333a0 79 69 6e 67 20 74 6f 20 6f 70 65 6e 0a 20 20 20  ying to open.   
333b0 20 20 20 20 20 2a 2a 20 6f 72 20 72 6f 6c 6c 20       ** or roll 
333c0 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  back a hot-journ
333d0 61 6c 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67  al while holding
333e0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
333f0 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20  ck. The.        
33400 2a 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  ** pager_unlock(
33410 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62  ) routine will b
33420 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  e called before 
33430 72 65 74 75 72 6e 69 6e 67 20 74 6f 20 75 6e 6c  returning to unl
33440 6f 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ock.        ** t
33450 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  he file. If the 
33460 75 6e 6c 6f 63 6b 20 61 74 74 65 6d 70 74 20 66  unlock attempt f
33470 61 69 6c 73 2c 20 74 68 65 6e 20 50 61 67 65 72  ails, then Pager
33480 2e 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 0a 20  .eLock must be. 
33490 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 6f         ** set to
334a0 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 28 73   UNKNOWN_LOCK (s
334b0 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61  ee the comment a
334c0 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e 65  bove the #define
334d0 20 66 6f 72 20 0a 20 20 20 20 20 20 20 20 2a 2a   for .        **
334e0 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 61 62   UNKNOWN_LOCK ab
334f0 6f 76 65 20 66 6f 72 20 61 6e 20 65 78 70 6c 61  ove for an expla
33500 6e 61 74 69 6f 6e 29 2e 20 0a 20 20 20 20 20 20  nation). .      
33510 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
33520 49 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20  In order to get 
33530 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 74  pager_unlock() t
33540 6f 20 64 6f 20 74 68 69 73 2c 20 73 65 74 20 50  o do this, set P
33550 61 67 65 72 2e 65 53 74 61 74 65 20 74 6f 0a 20  ager.eState to. 
33560 20 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f         ** PAGER_
33570 45 52 52 4f 52 20 6e 6f 77 2e 20 54 68 69 73 20  ERROR now. This 
33580 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  is not actually 
33590 63 6f 75 6e 74 65 64 20 61 73 20 61 20 74 72 61  counted as a tra
335a0 6e 73 69 74 69 6f 6e 0a 20 20 20 20 20 20 20 20  nsition.        
335b0 2a 2a 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74  ** to ERROR stat
335c0 65 20 69 6e 20 74 68 65 20 73 74 61 74 65 20 64  e in the state d
335d0 69 61 67 72 61 6d 20 61 74 20 74 68 65 20 74 6f  iagram at the to
335e0 70 20 6f 66 20 74 68 69 73 20 66 69 6c 65 2c 0a  p of this file,.
335f0 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 63 65          ** since
33600 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   we know that th
33610 65 20 73 61 6d 65 20 63 61 6c 6c 20 74 6f 20 70  e same call to p
33620 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69  ager_unlock() wi
33630 6c 6c 20 76 65 72 79 0a 20 20 20 20 20 20 20 20  ll very.        
33640 2a 2a 20 73 68 6f 72 74 6c 79 20 74 72 61 6e 73  ** shortly trans
33650 69 74 69 6f 6e 20 74 68 65 20 70 61 67 65 72 20  ition the pager 
33660 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 4f 50  object to the OP
33670 45 4e 20 73 74 61 74 65 2e 20 43 61 6c 6c 69 6e  EN state. Callin
33680 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73 73  g.        ** ass
33690 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
336a0 29 20 77 6f 75 6c 64 20 66 61 69 6c 20 6e 6f 77  ) would fail now
336b0 2c 20 61 73 20 69 74 20 73 68 6f 75 6c 64 20 6e  , as it should n
336c0 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 0a 20  ot be possible. 
336d0 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20         ** to be 
336e0 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20 77  in ERROR state w
336f0 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 7a 65  hen there are ze
33700 72 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ro outstanding p
33710 61 67 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  age .        ** 
33720 72 65 66 65 72 65 6e 63 65 73 2e 0a 20 20 20 20  references..    
33730 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70      */.        p
33740 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
33750 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20  r, rc);.        
33760 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
33770 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65     }..      asse
33780 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
33790 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te==PAGER_OPEN )
337a0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
337b0 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d  (pPager->eLock==
337c0 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20  SHARED_LOCK).   
337d0 20 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67          || (pPag
337e0 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
337f0 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f  e && pPager->eLo
33800 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a  ck>SHARED_LOCK).
33810 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a        );.    }..
33820 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
33830 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 70 50 61  >tempFile && pPa
33840 67 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72  ger->hasHeldShar
33850 65 64 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  edLock ){.      
33860 2f 2a 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f  /* The shared-lo
33870 63 6b 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  ck has just been
33880 20 61 63 71 75 69 72 65 64 20 74 68 65 6e 20 63   acquired then c
33890 68 65 63 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a  heck to.      **
338a0 20 73 65 65 20 69 66 20 74 68 65 20 64 61 74 61   see if the data
338b0 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 6d 6f  base has been mo
338c0 64 69 66 69 65 64 2e 20 20 49 66 20 74 68 65 20  dified.  If the 
338d0 64 61 74 61 62 61 73 65 20 68 61 73 20 63 68 61  database has cha
338e0 6e 67 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20 66  nged,.      ** f
338f0 6c 75 73 68 20 74 68 65 20 63 61 63 68 65 2e 20  lush the cache. 
33900 20 54 68 65 20 68 61 73 48 65 6c 64 53 68 61 72   The hasHeldShar
33910 65 64 4c 6f 63 6b 20 66 6c 61 67 20 70 72 65 76  edLock flag prev
33920 65 6e 74 73 20 74 68 69 73 20 66 72 6f 6d 0a 20  ents this from. 
33930 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 72 69 6e       ** occurrin
33940 67 20 6f 6e 20 74 68 65 20 76 65 72 79 20 66 69  g on the very fi
33950 72 73 74 20 61 63 63 65 73 73 20 74 6f 20 61 20  rst access to a 
33960 66 69 6c 65 2c 20 69 6e 20 6f 72 64 65 72 20 74  file, in order t
33970 6f 20 73 61 76 65 20 61 0a 20 20 20 20 20 20 2a  o save a.      *
33980 2a 20 73 69 6e 67 6c 65 20 75 6e 6e 65 63 65 73  * single unneces
33990 73 61 72 79 20 73 71 6c 69 74 65 33 4f 73 52 65  sary sqlite3OsRe
339a0 61 64 28 29 20 63 61 6c 6c 20 61 74 20 74 68 65  ad() call at the
339b0 20 73 74 61 72 74 2d 75 70 2e 0a 20 20 20 20 20   start-up..     
339c0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61 74   **.      ** Dat
339d0 61 62 61 73 65 20 63 68 61 6e 67 65 73 20 61 72  abase changes ar
339e0 65 20 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f  e detected by lo
339f0 6f 6b 69 6e 67 20 61 74 20 31 35 20 62 79 74 65  oking at 15 byte
33a00 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20  s beginning.    
33a10 20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32    ** at offset 2
33a20 34 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e  4 into the file.
33a30 20 20 54 68 65 20 66 69 72 73 74 20 34 20 6f 66    The first 4 of
33a40 20 74 68 65 73 65 20 31 36 20 62 79 74 65 73 20   these 16 bytes 
33a50 61 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 20 33  are.      ** a 3
33a60 32 2d 62 69 74 20 63 6f 75 6e 74 65 72 20 74 68  2-bit counter th
33a70 61 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  at is incremente
33a80 64 20 77 69 74 68 20 65 61 63 68 20 63 68 61 6e  d with each chan
33a90 67 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a  ge.  The.      *
33aa0 2a 20 6f 74 68 65 72 20 62 79 74 65 73 20 63 68  * other bytes ch
33ab0 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69  ange randomly wi
33ac0 74 68 20 65 61 63 68 20 66 69 6c 65 20 63 68 61  th each file cha
33ad0 6e 67 65 20 77 68 65 6e 0a 20 20 20 20 20 20 2a  nge when.      *
33ae0 2a 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20  * a codec is in 
33af0 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20  use..      ** . 
33b00 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73       ** There is
33b10 20 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73   a vanishingly s
33b20 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74  mall chance that
33b30 20 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e   a change will n
33b40 6f 74 20 62 65 20 0a 20 20 20 20 20 20 2a 2a 20  ot be .      ** 
33b50 64 65 74 65 63 74 65 64 2e 20 20 54 68 65 20 63  detected.  The c
33b60 68 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65  hance of an unde
33b70 74 65 63 74 65 64 20 63 68 61 6e 67 65 20 69 73  tected change is
33b80 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20   so small that. 
33b90 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62       ** it can b
33ba0 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20  e neglected..   
33bb0 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72     */.      char
33bc0 20 64 62 46 69 6c 65 56 65 72 73 5b 73 69 7a 65   dbFileVers[size
33bd0 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
33be0 65 56 65 72 73 29 5d 3b 0a 0a 20 20 20 20 20 20  eVers)];..      
33bf0 49 4f 54 52 41 43 45 28 28 22 43 4b 56 45 52 53  IOTRACE(("CKVERS
33c00 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
33c10 72 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  r, sizeof(dbFile
33c20 56 65 72 73 29 29 29 3b 0a 20 20 20 20 20 20 72  Vers)));.      r
33c30 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
33c40 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 64  d(pPager->fd, &d
33c50 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f  bFileVers, sizeo
33c60 66 28 64 62 46 69 6c 65 56 65 72 73 29 2c 20 32  f(dbFileVers), 2
33c70 34 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  4);.      if( rc
33c80 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
33c90 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
33ca0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
33cb0 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
33cc0 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
33cd0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
33ce0 20 20 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65     memset(dbFile
33cf0 56 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Vers, 0, sizeof(
33d00 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
33d10 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
33d20 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e   memcmp(pPager->
33d30 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69  dbFileVers, dbFi
33d40 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64  leVers, sizeof(d
33d50 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29  bFileVers))!=0 )
33d60 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f  {.        pager_
33d70 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 0a  reset(pPager);..
33d80 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 6d 61 70          /* Unmap
33d90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
33da0 6c 65 2e 20 49 74 20 69 73 20 70 6f 73 73 69 62  le. It is possib
33db0 6c 65 20 74 68 61 74 20 65 78 74 65 72 6e 61 6c  le that external
33dc0 20 70 72 6f 63 65 73 73 65 73 0a 20 20 20 20 20   processes.     
33dd0 20 20 20 2a 2a 20 6d 61 79 20 68 61 76 65 20 74     ** may have t
33de0 72 75 6e 63 61 74 65 64 20 74 68 65 20 64 61 74  runcated the dat
33df0 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74  abase file and t
33e00 68 65 6e 20 65 78 74 65 6e 64 65 64 20 69 74 20  hen extended it 
33e10 62 61 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20  back.        ** 
33e20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
33e30 73 69 7a 65 20 77 68 69 6c 65 20 74 68 69 73 20  size while this 
33e40 70 72 6f 63 65 73 73 20 77 61 73 20 6e 6f 74 20  process was not 
33e50 68 6f 6c 64 69 6e 67 20 61 20 6c 6f 63 6b 2e 0a  holding a lock..
33e60 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68          ** In th
33e70 69 73 20 63 61 73 65 20 74 68 65 72 65 20 6d 61  is case there ma
33e80 79 20 65 78 69 73 74 20 61 20 50 61 67 65 72 2e  y exist a Pager.
33e90 70 4d 61 70 20 6d 61 70 70 69 6e 67 20 74 68 61  pMap mapping tha
33ea0 74 20 61 70 70 65 61 72 73 0a 20 20 20 20 20 20  t appears.      
33eb0 20 20 2a 2a 20 74 6f 20 62 65 20 74 68 65 20 72    ** to be the r
33ec0 69 67 68 74 20 73 69 7a 65 20 62 75 74 20 69 73  ight size but is
33ed0 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 76 61   not actually va
33ee0 6c 69 64 2e 20 41 76 6f 69 64 20 74 68 69 73 0a  lid. Avoid this.
33ef0 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73 73 69          ** possi
33f00 62 69 6c 69 74 79 20 62 79 20 75 6e 6d 61 70 70  bility by unmapp
33f10 69 6e 67 20 74 68 65 20 64 62 20 68 65 72 65 2e  ing the db here.
33f20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
33f30 55 53 45 46 45 54 43 48 28 70 50 61 67 65 72 29  USEFETCH(pPager)
33f40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
33f50 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70  lite3OsUnfetch(p
33f60 50 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29  Pager->fd, 0, 0)
33f70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
33f80 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
33f90 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
33fa0 57 41 4c 20 66 69 6c 65 20 69 6e 20 74 68 65 20  WAL file in the 
33fb0 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 6f 70 65  file-system, ope
33fc0 6e 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  n this database 
33fd0 69 6e 20 57 41 4c 0a 20 20 20 20 2a 2a 20 6d 6f  in WAL.    ** mo
33fe0 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74  de. Otherwise, t
33ff0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e  he following fun
34000 63 74 69 6f 6e 20 63 61 6c 6c 20 69 73 20 61 20  ction call is a 
34010 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20  no-op..    */.  
34020 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e    rc = pagerOpen
34030 57 61 6c 49 66 50 72 65 73 65 6e 74 28 70 50 61  WalIfPresent(pPa
34040 67 65 72 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ger);.#ifndef SQ
34050 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
34060 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
34070 2d 3e 70 57 61 6c 3d 3d 30 20 7c 7c 20 72 63 3d  ->pWal==0 || rc=
34080 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 23 65  =SQLITE_OK );.#e
34090 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ndif.  }..  if( 
340a0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
340b0 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  er) ){.    asser
340c0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
340d0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   );.    rc = pag
340e0 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73  erBeginReadTrans
340f0 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a  action(pPager);.
34100 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65    }..  if( pPage
34110 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 26  r->tempFile==0 &
34120 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  & pPager->eState
34130 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20  ==PAGER_OPEN && 
34140 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
34150 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50  .    rc = pagerP
34160 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
34170 20 26 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65   &pPager->dbSize
34180 29 3b 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a  );.  }.. failed:
34190 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
341a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
341b0 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
341c0 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70    pager_unlock(p
341d0 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73 65  Pager);.    asse
341e0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
341f0 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te==PAGER_OPEN )
34200 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
34210 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
34220 50 41 47 45 52 5f 52 45 41 44 45 52 3b 0a 20 20  PAGER_READER;.  
34230 20 20 70 50 61 67 65 72 2d 3e 68 61 73 48 65 6c    pPager->hasHel
34240 64 53 68 61 72 65 64 4c 6f 63 6b 20 3d 20 31 3b  dSharedLock = 1;
34250 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
34260 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ;.}../*.** If th
34270 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
34280 74 20 68 61 73 20 72 65 61 63 68 65 64 20 7a 65  t has reached ze
34290 72 6f 2c 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79  ro, rollback any
342a0 20 61 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73   active.** trans
342b0 61 63 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63  action and unloc
342c0 6b 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a  k the pager..**.
342d0 2a 2a 20 45 78 63 65 70 74 2c 20 69 6e 20 6c 6f  ** Except, in lo
342e0 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55  cking_mode=EXCLU
342f0 53 49 56 45 20 77 68 65 6e 20 74 68 65 72 65 20  SIVE when there 
34300 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 69 6e  is nothing to in
34310 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
34320 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 20 75 6e   journal, the un
34330 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 70 65 72 66  lock is not perf
34340 6f 72 6d 65 64 20 61 6e 64 20 74 68 65 72 65 20  ormed and there 
34350 69 73 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 74 6f  is.** nothing to
34360 20 72 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20 74 68   rollback, so th
34370 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
34380 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74 69  no-op..*/ .stati
34390 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f  c void pagerUnlo
343a0 63 6b 49 66 55 6e 75 73 65 64 28 50 61 67 65 72  ckIfUnused(Pager
343b0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
343c0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
343d0 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
343e0 50 43 61 63 68 65 29 3d 3d 30 20 29 7b 0a 20 20  PCache)==0 ){.  
343f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
34400 2d 3e 6e 4d 6d 61 70 4f 75 74 3d 3d 30 20 29 3b  ->nMmapOut==0 );
34410 20 2f 2a 20 62 65 63 61 75 73 65 20 70 61 67 65   /* because page
34420 31 20 69 73 20 6e 65 76 65 72 20 6d 65 6d 6f 72  1 is never memor
34430 79 20 6d 61 70 70 65 64 20 2a 2f 0a 20 20 20 20  y mapped */.    
34440 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
34450 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
34460 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65    }.}../*.** The
34470 20 70 61 67 65 20 67 65 74 74 65 72 20 6d 65 74   page getter met
34480 68 6f 64 73 20 65 61 63 68 20 74 72 79 20 74 6f  hods each try to
34490 20 61 63 71 75 69 72 65 20 61 20 72 65 66 65 72   acquire a refer
344a0 65 6e 63 65 20 74 6f 20 61 0a 2a 2a 20 70 61 67  ence to a.** pag
344b0 65 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62  e with page numb
344c0 65 72 20 70 67 6e 6f 2e 20 49 66 20 74 68 65 20  er pgno. If the 
344d0 72 65 71 75 65 73 74 65 64 20 72 65 66 65 72 65  requested refere
344e0 6e 63 65 20 69 73 20 0a 2a 2a 20 73 75 63 63 65  nce is .** succe
344f0 73 73 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64  ssfully obtained
34500 2c 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 74  , it is copied t
34510 6f 20 2a 70 70 50 61 67 65 20 61 6e 64 20 53 51  o *ppPage and SQ
34520 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
34530 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72  ..**.** There ar
34540 65 20 64 69 66 66 65 72 65 6e 74 20 69 6d 70 6c  e different impl
34550 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74  ementations of t
34560 68 65 20 67 65 74 74 65 72 20 6d 65 74 68 6f 64  he getter method
34570 20 64 65 70 65 6e 64 69 6e 67 0a 2a 2a 20 6f 6e   depending.** on
34580 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
34590 74 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 2e  te of the pager.
345a0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 67 65 74 50 61  .**.**     getPa
345b0 67 65 4e 6f 72 6d 61 6c 28 29 20 20 20 20 20 20  geNormal()      
345c0 20 20 20 2d 2d 20 20 54 68 65 20 6e 6f 72 6d 61     --  The norma
345d0 6c 20 67 65 74 74 65 72 0a 2a 2a 20 20 20 20 20  l getter.**     
345e0 67 65 74 50 61 67 65 45 72 72 6f 72 28 29 20 20  getPageError()  
345f0 20 20 20 20 20 20 20 20 2d 2d 20 20 55 73 65 64          --  Used
34600 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73   if the pager is
34610 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61   in an error sta
34620 74 65 0a 2a 2a 20 20 20 20 20 67 65 74 50 61 67  te.**     getPag
34630 65 4d 6d 61 70 28 29 20 20 20 20 20 20 20 20 20  eMmap()         
34640 20 20 2d 2d 20 20 55 73 65 64 20 69 66 20 6d 65    --  Used if me
34650 6d 6f 72 79 2d 6d 61 70 70 65 64 20 49 2f 4f 20  mory-mapped I/O 
34660 69 73 20 65 6e 61 62 6c 65 64 0a 2a 2a 0a 2a 2a  is enabled.**.**
34670 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65   If the requeste
34680 64 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64  d page is alread
34690 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20  y in the cache, 
346a0 69 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  it is returned. 
346b0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61  .** Otherwise, a
346c0 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74   new page object
346d0 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
346e0 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  d populated with
346f0 20 64 61 74 61 0a 2a 2a 20 72 65 61 64 20 66 72   data.** read fr
34700 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
34710 66 69 6c 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61  file. In some ca
34720 73 65 73 2c 20 74 68 65 20 70 63 61 63 68 65 20  ses, the pcache 
34730 6d 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68  module may.** ch
34740 6f 6f 73 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f  oose not to allo
34750 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20  cate a new page 
34760 6f 62 6a 65 63 74 20 61 6e 64 20 6d 61 79 20 72  object and may r
34770 65 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67  euse an existing
34780 0a 2a 2a 20 6f 62 6a 65 63 74 20 77 69 74 68 20  .** object with 
34790 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  no outstanding r
347a0 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a  eferences..**.**
347b0 20 54 68 65 20 65 78 74 72 61 20 64 61 74 61 20   The extra data 
347c0 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61  appended to a pa
347d0 67 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69  ge is always ini
347e0 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f  tialized to zero
347f0 73 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20  s the .** first 
34800 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c  time a page is l
34810 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72  oaded into memor
34820 79 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 72  y. If the page r
34830 65 71 75 65 73 74 65 64 20 69 73 20 0a 2a 2a 20  equested is .** 
34840 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63  already in the c
34850 61 63 68 65 20 77 68 65 6e 20 74 68 69 73 20 66  ache when this f
34860 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
34870 64 2c 20 74 68 65 6e 20 74 68 65 20 65 78 74 72  d, then the extr
34880 61 0a 2a 2a 20 64 61 74 61 20 69 73 20 6c 65 66  a.** data is lef
34890 74 20 61 73 20 69 74 20 77 61 73 20 77 68 65 6e  t as it was when
348a0 20 74 68 65 20 70 61 67 65 20 6f 62 6a 65 63 74   the page object
348b0 20 77 61 73 20 6c 61 73 74 20 75 73 65 64 2e 0a   was last used..
348c0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74  **.** If the dat
348d0 61 62 61 73 65 20 69 6d 61 67 65 20 69 73 20 73  abase image is s
348e0 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20  maller than the 
348f0 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 6f  requested page o
34900 72 20 69 66 20 0a 2a 2a 20 74 68 65 20 66 6c 61  r if .** the fla
34910 67 73 20 70 61 72 61 6d 65 74 65 72 20 63 6f 6e  gs parameter con
34920 74 61 69 6e 73 20 74 68 65 20 50 41 47 45 52 5f  tains the PAGER_
34930 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 62 69  GET_NOCONTENT bi
34940 74 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 72 65  t and the .** re
34950 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
34960 6e 6f 74 20 61 6c 72 65 61 64 79 20 73 74 6f 72  not already stor
34970 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c  ed in the cache,
34980 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74   then no .** act
34990 75 61 6c 20 64 69 73 6b 20 72 65 61 64 20 6f 63  ual disk read oc
349a0 63 75 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61  curs. In this ca
349b0 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d  se the memory im
349c0 61 67 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70  age of the .** p
349d0 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  age is initializ
349e0 65 64 20 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e  ed to all zeros.
349f0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 50 41 47 45 52   .**.** If PAGER
34a00 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 69  _GET_NOCONTENT i
34a10 73 20 74 72 75 65 2c 20 69 74 20 6d 65 61 6e 73  s true, it means
34a20 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20   that we do not 
34a30 63 61 72 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68  care about.** th
34a40 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
34a50 65 20 70 61 67 65 2e 20 54 68 69 73 20 6f 63 63  e page. This occ
34a60 75 72 73 20 69 6e 20 74 77 6f 20 73 63 65 6e 61  urs in two scena
34a70 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29  rios:.**.**   a)
34a80 20 57 68 65 6e 20 72 65 61 64 69 6e 67 20 61 20   When reading a 
34a90 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
34aa0 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74  age from the dat
34ab0 61 62 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a  abase, and.**.**
34ac0 20 20 20 62 29 20 57 68 65 6e 20 61 20 73 61 76     b) When a sav
34ad0 65 70 6f 69 6e 74 20 69 73 20 62 65 69 6e 67 20  epoint is being 
34ae0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20  rolled back and 
34af0 77 65 20 6e 65 65 64 20 74 6f 20 6c 6f 61 64 0a  we need to load.
34b00 2a 2a 20 20 20 20 20 20 61 20 6e 65 77 20 70 61  **      a new pa
34b10 67 65 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68  ge into the cach
34b20 65 20 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 77  e to be filled w
34b30 69 74 68 20 74 68 65 20 64 61 74 61 20 72 65 61  ith the data rea
34b40 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74  d.**      from t
34b50 68 65 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75  he savepoint jou
34b60 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50  rnal..**.** If P
34b70 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45  AGER_GET_NOCONTE
34b80 4e 54 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  NT is true, then
34b90 20 74 68 65 20 64 61 74 61 20 72 65 74 75 72 6e   the data return
34ba0 65 64 20 69 73 20 7a 65 72 6f 65 64 20 69 6e 73  ed is zeroed ins
34bb0 74 65 61 64 0a 2a 2a 20 6f 66 20 62 65 69 6e 67  tead.** of being
34bc0 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
34bd0 61 74 61 62 61 73 65 2e 20 41 64 64 69 74 69 6f  atabase. Additio
34be0 6e 61 6c 6c 79 2c 20 74 68 65 20 62 69 74 73 20  nally, the bits 
34bf0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
34c00 20 74 6f 20 70 67 6e 6f 20 69 6e 20 50 61 67 65   to pgno in Page
34c10 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 28 62 69  r.pInJournal (bi
34c20 74 76 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c  tvec of pages al
34c30 72 65 61 64 79 20 77 72 69 74 74 65 6e 20 74 6f  ready written to
34c40 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
34c50 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20 50 61  file) and the Pa
34c60 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e  gerSavepoint.pIn
34c70 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63  Savepoint bitvec
34c80 73 20 6f 66 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a  s of any open.**
34c90 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20   savepoints are 
34ca0 73 65 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  set. This means 
34cb0 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6d  if the page is m
34cc0 61 64 65 20 77 72 69 74 61 62 6c 65 20 61 74 20  ade writable at 
34cd0 61 6e 79 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20  any.** point in 
34ce0 74 68 65 20 66 75 74 75 72 65 2c 20 75 73 69 6e  the future, usin
34cf0 67 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  g a call to sqli
34d00 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 2c  te3PagerWrite(),
34d10 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a   its contents.**
34d20 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f 75   will not be jou
34d30 72 6e 61 6c 65 64 2e 20 54 68 69 73 20 73 61 76  rnaled. This sav
34d40 65 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  es IO..**.** The
34d50 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67   acquisition mig
34d60 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65  ht fail for seve
34d70 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e  ral reasons.  In
34d80 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61   all cases,.** a
34d90 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
34da0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
34db0 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65  rned and *ppPage
34dc0 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
34dd0 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
34de0 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
34df0 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73  up().  Both this
34e00 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f   routine and Loo
34e10 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a  kup() attempt.**
34e20 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20   to find a page 
34e30 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  in the in-memory
34e40 20 63 61 63 68 65 20 66 69 72 73 74 2e 20 20 49   cache first.  I
34e50 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
34e60 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20  t already.** in 
34e70 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75  memory, this rou
34e80 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73  tine goes to dis
34e90 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20  k to read it in 
34ea0 77 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29  whereas Lookup()
34eb0 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73  .** just returns
34ec0 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e   0.  This routin
34ed0 65 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61  e acquires a rea
34ee0 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74  d-lock the first
34ef0 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20   time it.** has 
34f00 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61  to go to disk, a
34f10 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c  nd could also pl
34f20 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f  ayback an old jo
34f30 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61  urnal if necessa
34f40 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f  ry..** Since Loo
34f50 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73  kup() never goes
34f60 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76   to disk, it nev
34f70 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77  er has to deal w
34f80 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20  ith locks.** or 
34f90 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a  journal files..*
34fa0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
34fb0 50 61 67 65 4e 6f 72 6d 61 6c 28 0a 20 20 50 61  PageNormal(.  Pa
34fc0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
34fd0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f    /* The pager o
34fe0 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62  pen on the datab
34ff0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67  ase file */.  Pg
35000 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
35010 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
35020 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44   to fetch */.  D
35030 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  bPage **ppPage, 
35040 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f     /* Write a po
35050 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
35060 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  e here */.  int 
35070 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
35080 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 58 58 58  /* PAGER_GET_XXX
35090 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 69   flags */.){.  i
350a0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
350b0 4b 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  K;.  PgHdr *pPg;
350c0 0a 20 20 75 38 20 6e 6f 43 6f 6e 74 65 6e 74 3b  .  u8 noContent;
350d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
350e0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 50 41     /* True if PA
350f0 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e  GER_GET_NOCONTEN
35100 54 20 69 73 20 73 65 74 20 2a 2f 0a 20 20 73 71  T is set */.  sq
35110 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 70 61 67  lite3_pcache_pag
35120 65 20 2a 70 42 61 73 65 3b 0a 0a 20 20 61 73 73  e *pBase;..  ass
35130 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
35140 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
35150 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
35160 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
35170 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 61  ER_READER );.  a
35180 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
35190 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
351a0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
351b0 50 61 67 65 72 2d 3e 68 61 73 48 65 6c 64 53 68  Pager->hasHeldSh
351c0 61 72 65 64 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 0a  aredLock==1 );..
351d0 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 20    if( pgno==0 ) 
351e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
351f0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 70 42  RRUPT_BKPT;.  pB
35200 61 73 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61  ase = sqlite3Pca
35210 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d  cheFetch(pPager-
35220 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20  >pPCache, pgno, 
35230 33 29 3b 0a 20 20 69 66 28 20 70 42 61 73 65 3d  3);.  if( pBase=
35240 3d 30 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20  =0 ){.    pPg = 
35250 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  0;.    rc = sqli
35260 74 65 33 50 63 61 63 68 65 46 65 74 63 68 53 74  te3PcacheFetchSt
35270 72 65 73 73 28 70 50 61 67 65 72 2d 3e 70 50 43  ress(pPager->pPC
35280 61 63 68 65 2c 20 70 67 6e 6f 2c 20 26 70 42 61  ache, pgno, &pBa
35290 73 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  se);.    if( rc!
352a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
352b0 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
352c0 65 72 72 3b 0a 20 20 20 20 69 66 28 20 70 42 61  err;.    if( pBa
352d0 73 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  se==0 ){.      r
352e0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
352f0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
35300 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
35310 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  err;.    }.  }. 
35320 20 70 50 67 20 3d 20 2a 70 70 50 61 67 65 20 3d   pPg = *ppPage =
35330 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
35340 74 63 68 46 69 6e 69 73 68 28 70 50 61 67 65 72  tchFinish(pPager
35350 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c  ->pPCache, pgno,
35360 20 70 42 61 73 65 29 3b 0a 20 20 61 73 73 65 72   pBase);.  asser
35370 74 28 20 70 50 67 3d 3d 28 2a 70 70 50 61 67 65  t( pPg==(*ppPage
35380 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
35390 50 67 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29  Pg->pgno==pgno )
353a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
353b0 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20  >pPager==pPager 
353c0 7c 7c 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d  || pPg->pPager==
353d0 30 20 29 3b 0a 0a 20 20 6e 6f 43 6f 6e 74 65 6e  0 );..  noConten
353e0 74 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47  t = (flags & PAG
353f0 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
35400 29 21 3d 30 3b 0a 20 20 69 66 28 20 70 50 67 2d  )!=0;.  if( pPg-
35410 3e 70 50 61 67 65 72 20 26 26 20 21 6e 6f 43 6f  >pPager && !noCo
35420 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20  ntent ){.    /* 
35430 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
35440 20 70 63 61 63 68 65 20 61 6c 72 65 61 64 79 20   pcache already 
35450 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 69 74  contains an init
35460 69 61 6c 69 7a 65 64 20 63 6f 70 79 20 6f 66 0a  ialized copy of.
35470 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 2e      ** the page.
35480 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   Return without 
35490 66 75 72 74 68 65 72 20 61 64 6f 2e 20 20 2a 2f  further ado.  */
354a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e  .    assert( pgn
354b0 6f 3c 3d 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e  o<=PAGER_MAX_PGN
354c0 4f 20 26 26 20 70 67 6e 6f 21 3d 50 41 47 45 52  O && pgno!=PAGER
354d0 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
354e0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
354f0 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54  aStat[PAGER_STAT
35500 5f 48 49 54 5d 2b 2b 3b 0a 20 20 20 20 72 65 74  _HIT]++;.    ret
35510 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
35520 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
35530 54 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  The pager cache 
35540 68 61 73 20 63 72 65 61 74 65 64 20 61 20 6e 65  has created a ne
35550 77 20 70 61 67 65 2e 20 49 74 73 20 63 6f 6e 74  w page. Its cont
35560 65 6e 74 20 6e 65 65 64 73 20 74 6f 20 0a 20 20  ent needs to .  
35570 20 20 2a 2a 20 62 65 20 69 6e 69 74 69 61 6c 69    ** be initiali
35580 7a 65 64 2e 20 42 75 74 20 66 69 72 73 74 20 73  zed. But first s
35590 6f 6d 65 20 65 72 72 6f 72 20 63 68 65 63 6b 73  ome error checks
355a0 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
355b0 28 31 29 20 54 68 65 20 6d 61 78 69 6d 75 6d 20  (1) The maximum 
355c0 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32  page number is 2
355d0 5e 33 31 0a 20 20 20 20 2a 2a 20 28 32 29 20 4e  ^31.    ** (2) N
355e0 65 76 65 72 20 74 72 79 20 74 6f 20 66 65 74 63  ever try to fetc
355f0 68 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61  h the locking pa
35600 67 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  ge.    */.    if
35610 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58  ( pgno>PAGER_MAX
35620 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50  _PGNO || pgno==P
35630 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
35640 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63  ger) ){.      rc
35650 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
35660 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  T_BKPT;.      go
35670 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65  to pager_acquire
35680 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _err;.    }..   
35690 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70   pPg->pPager = p
356a0 50 61 67 65 72 3b 0a 0a 20 20 20 20 61 73 73 65  Pager;..    asse
356b0 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  rt( !isOpen(pPag
356c0 65 72 2d 3e 66 64 29 20 7c 7c 20 21 4d 45 4d 44  er->fd) || !MEMD
356d0 42 20 29 3b 0a 20 20 20 20 69 66 28 20 21 69 73  B );.    if( !is
356e0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
356f0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69   || pPager->dbSi
35700 7a 65 3c 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e  ze<pgno || noCon
35710 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 69 66  tent ){.      if
35720 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d  ( pgno>pPager->m
35730 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20  xPgno ){.       
35740 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c   rc = SQLITE_FUL
35750 4c 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  L;.        goto 
35760 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
35770 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  r;.      }.     
35780 20 69 66 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29   if( noContent )
35790 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 61 69  {.        /* Fai
357a0 6c 75 72 65 20 74 6f 20 73 65 74 20 74 68 65 20  lure to set the 
357b0 62 69 74 73 20 69 6e 20 74 68 65 20 49 6e 4a 6f  bits in the InJo
357c0 75 72 6e 61 6c 20 62 69 74 2d 76 65 63 74 6f 72  urnal bit-vector
357d0 73 20 69 73 20 62 65 6e 69 67 6e 2e 0a 20 20 20  s is benign..   
357e0 20 20 20 20 20 2a 2a 20 49 74 20 6d 65 72 65 6c       ** It merel
357f0 79 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  y means that we 
35800 6d 69 67 68 74 20 64 6f 20 73 6f 6d 65 20 65 78  might do some ex
35810 74 72 61 20 77 6f 72 6b 20 74 6f 20 6a 6f 75 72  tra work to jour
35820 6e 61 6c 20 61 20 0a 20 20 20 20 20 20 20 20 2a  nal a .        *
35830 2a 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73  * page that does
35840 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
35850 6a 6f 75 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65  journaled.  Neve
35860 72 74 68 65 6c 65 73 73 2c 20 62 65 20 73 75 72  rtheless, be sur
35870 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  e .        ** to
35880 20 74 65 73 74 20 74 68 65 20 63 61 73 65 20 77   test the case w
35890 68 65 72 65 20 61 20 6d 61 6c 6c 6f 63 20 65 72  here a malloc er
358a0 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
358b0 20 74 72 79 69 6e 67 20 74 6f 20 73 65 74 20 0a   trying to set .
358c0 20 20 20 20 20 20 20 20 2a 2a 20 61 20 62 69 74          ** a bit
358d0 20 69 6e 20 61 20 62 69 74 20 76 65 63 74 6f 72   in a bit vector
358e0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
358f0 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
35900 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
35910 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 67 6e  .        if( pgn
35920 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  o<=pPager->dbOri
35930 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  gSize ){.       
35940 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20     TESTONLY( rc 
35950 3d 20 29 20 73 71 6c 69 74 65 33 42 69 74 76 65  = ) sqlite3Bitve
35960 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  cSet(pPager->pIn
35970 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a  Journal, pgno);.
35980 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
35990 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
359a0 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
359b0 7d 0a 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e  }.        TESTON
359c0 4c 59 28 20 72 63 20 3d 20 29 20 61 64 64 54 6f  LY( rc = ) addTo
359d0 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73  SavepointBitvecs
359e0 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
359f0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
35a00 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
35a10 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  EM );.        sq
35a20 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
35a30 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7d 0a  lloc();.      }.
35a40 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67        memset(pPg
35a50 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67  ->pData, 0, pPag
35a60 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
35a70 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 5a       IOTRACE(("Z
35a80 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  ERO %p %d\n", pP
35a90 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ager, pgno));.  
35aa0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
35ab0 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67  ssert( pPg->pPag
35ac0 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20  er==pPager );.  
35ad0 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61      pPager->aSta
35ae0 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 4d 49 53  t[PAGER_STAT_MIS
35af0 53 5d 2b 2b 3b 0a 20 20 20 20 20 20 72 63 20 3d  S]++;.      rc =
35b00 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67 29   readDbPage(pPg)
35b10 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
35b20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
35b30 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f       goto pager_
35b40 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
35b50 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
35b60 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
35b70 68 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65  h(pPg);.  }.  re
35b80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
35b90 0a 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65  .pager_acquire_e
35ba0 72 72 3a 0a 20 20 61 73 73 65 72 74 28 20 72 63  rr:.  assert( rc
35bb0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
35bc0 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
35bd0 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f  sqlite3PcacheDro
35be0 70 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61  p(pPg);.  }.  pa
35bf0 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65  gerUnlockIfUnuse
35c00 64 28 70 50 61 67 65 72 29 3b 0a 20 20 2a 70 70  d(pPager);.  *pp
35c10 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 65 74 75  Page = 0;.  retu
35c20 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 53 51  rn rc;.}..#if SQ
35c30 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
35c40 5a 45 3e 30 0a 2f 2a 20 54 68 65 20 70 61 67 65  ZE>0./* The page
35c50 20 67 65 74 74 65 72 20 66 6f 72 20 77 68 65 6e   getter for when
35c60 20 6d 65 6d 6f 72 79 2d 6d 61 70 70 65 64 20 49   memory-mapped I
35c70 2f 4f 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f  /O is enabled */
35c80 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 50  .static int getP
35c90 61 67 65 4d 4d 61 70 28 0a 20 20 50 61 67 65 72  ageMMap(.  Pager
35ca0 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f   *pPager,      /
35cb0 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e  * The pager open
35cc0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
35cd0 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
35ce0 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f  pgno,          /
35cf0 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  * Page number to
35d00 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61   fetch */.  DbPa
35d10 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
35d20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74  /* Write a point
35d30 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  er to the page h
35d40 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ere */.  int fla
35d50 67 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  gs           /* 
35d60 50 41 47 45 52 5f 47 45 54 5f 58 58 58 20 66 6c  PAGER_GET_XXX fl
35d70 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ags */.){.  int 
35d80 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
35d90 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 30    PgHdr *pPg = 0
35da0 3b 0a 20 20 75 33 32 20 69 46 72 61 6d 65 20 3d  ;.  u32 iFrame =
35db0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
35dc0 20 20 20 20 2f 2a 20 46 72 61 6d 65 20 74 6f 20      /* Frame to 
35dd0 72 65 61 64 20 66 72 6f 6d 20 57 41 4c 20 66 69  read from WAL fi
35de0 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 74 20 69  le */..  /* It i
35df0 73 20 61 63 63 65 70 74 61 62 6c 65 20 74 6f 20  s acceptable to 
35e00 75 73 65 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  use a read-only 
35e10 28 6d 6d 61 70 29 20 70 61 67 65 20 66 6f 72 20  (mmap) page for 
35e20 61 6e 79 20 70 61 67 65 20 65 78 63 65 70 74 0a  any page except.
35e30 20 20 2a 2a 20 70 61 67 65 20 31 20 69 66 20 74    ** page 1 if t
35e40 68 65 72 65 20 69 73 20 6e 6f 20 77 72 69 74 65  here is no write
35e50 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65  -transaction ope
35e60 6e 20 6f 72 20 74 68 65 20 41 43 51 55 49 52 45  n or the ACQUIRE
35e70 5f 52 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20 66  _READONLY.  ** f
35e80 6c 61 67 20 77 61 73 20 73 70 65 63 69 66 69 65  lag was specifie
35e90 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  d by the caller.
35ea0 20 41 6e 64 20 73 6f 20 6c 6f 6e 67 20 61 73 20   And so long as 
35eb0 74 68 65 20 64 62 20 69 73 20 6e 6f 74 20 61 20  the db is not a 
35ec0 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20  .  ** temporary 
35ed0 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  or in-memory dat
35ee0 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20 63 6f 6e  abase.  */.  con
35ef0 73 74 20 69 6e 74 20 62 4d 6d 61 70 4f 6b 20 3d  st int bMmapOk =
35f00 20 28 70 67 6e 6f 3e 31 0a 20 20 20 26 26 20 28   (pgno>1.   && (
35f10 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
35f20 50 41 47 45 52 5f 52 45 41 44 45 52 20 7c 7c 20  PAGER_READER || 
35f30 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 47  (flags & PAGER_G
35f40 45 54 5f 52 45 41 44 4f 4e 4c 59 29 29 0a 20 20  ET_READONLY)).  
35f50 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 55 53  );..  assert( US
35f60 45 46 45 54 43 48 28 70 50 61 67 65 72 29 20 29  EFETCH(pPager) )
35f70 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
35f80 48 41 53 5f 43 4f 44 45 43 0a 20 20 61 73 73 65  HAS_CODEC.  asse
35f90 72 74 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  rt( pPager->xCod
35fa0 65 63 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a  ec==0 );.#endif.
35fb0 0a 20 20 2f 2a 20 4f 70 74 69 6d 69 7a 61 74 69  .  /* Optimizati
35fc0 6f 6e 20 6e 6f 74 65 3a 20 20 41 64 64 69 6e 67  on note:  Adding
35fd0 20 74 68 65 20 22 70 67 6e 6f 3c 3d 31 22 20 74   the "pgno<=1" t
35fe0 65 72 6d 20 62 65 66 6f 72 65 20 22 70 67 6e 6f  erm before "pgno
35ff0 3d 3d 30 22 20 68 65 72 65 0a 20 20 2a 2a 20 61  ==0" here.  ** a
36000 6c 6c 6f 77 73 20 74 68 65 20 63 6f 6d 70 69 6c  llows the compil
36010 65 72 20 6f 70 74 69 6d 69 7a 65 72 20 74 6f 20  er optimizer to 
36020 72 65 75 73 65 20 74 68 65 20 72 65 73 75 6c 74  reuse the result
36030 73 20 6f 66 20 74 68 65 20 22 70 67 6e 6f 3e 31  s of the "pgno>1
36040 22 0a 20 20 2a 2a 20 74 65 73 74 20 69 6e 20 74  ".  ** test in t
36050 68 65 20 70 72 65 76 69 6f 75 73 20 73 74 61 74  he previous stat
36060 65 6d 65 6e 74 2c 20 61 6e 64 20 61 76 6f 69 64  ement, and avoid
36070 20 74 65 73 74 69 6e 67 20 70 67 6e 6f 3d 3d 30   testing pgno==0
36080 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6d   in the.  ** com
36090 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 70  mon case where p
360a0 67 6e 6f 20 69 73 20 6c 61 72 67 65 2e 20 2a 2f  gno is large. */
360b0 0a 20 20 69 66 28 20 70 67 6e 6f 3c 3d 31 20 26  .  if( pgno<=1 &
360c0 26 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20  & pgno==0 ){.   
360d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
360e0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
360f0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
36100 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
36110 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73  _READER );.  ass
36120 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
36130 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
36140 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
36150 67 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72  ger->hasHeldShar
36160 65 64 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 61  edLock==1 );.  a
36170 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
36180 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  rrCode==SQLITE_O
36190 4b 20 29 3b 0a 0a 20 20 69 66 28 20 62 4d 6d 61  K );..  if( bMma
361a0 70 4f 6b 20 26 26 20 70 61 67 65 72 55 73 65 57  pOk && pagerUseW
361b0 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
361c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
361d0 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65  lFindFrame(pPage
361e0 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26  r->pWal, pgno, &
361f0 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  iFrame);.    if(
36200 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
36210 7b 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65 20  {.      *ppPage 
36220 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 0;.      retur
36230 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
36240 20 20 69 66 28 20 62 4d 6d 61 70 4f 6b 20 26 26    if( bMmapOk &&
36250 20 69 46 72 61 6d 65 3d 3d 30 20 29 7b 0a 20 20   iFrame==0 ){.  
36260 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20    void *pData = 
36270 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  0;.    rc = sqli
36280 74 65 33 4f 73 46 65 74 63 68 28 70 50 61 67 65  te3OsFetch(pPage
36290 72 2d 3e 66 64 2c 20 0a 20 20 20 20 20 20 20 20  r->fd, .        
362a0 28 69 36 34 29 28 70 67 6e 6f 2d 31 29 20 2a 20  (i64)(pgno-1) * 
362b0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
362c0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
362d0 7a 65 2c 20 26 70 44 61 74 61 0a 20 20 20 20 29  ze, &pData.    )
362e0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
362f0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 61 74 61  LITE_OK && pData
36300 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50   ){.      if( pP
36310 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50 41 47  ager->eState>PAG
36320 45 52 5f 52 45 41 44 45 52 20 7c 7c 20 70 50 61  ER_READER || pPa
36330 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
36340 0a 20 20 20 20 20 20 20 20 70 50 67 20 3d 20 73  .        pPg = s
36350 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
36360 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
36370 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
36380 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20  f( pPg==0 ){.   
36390 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 41       rc = pagerA
363a0 63 71 75 69 72 65 4d 61 70 50 61 67 65 28 70 50  cquireMapPage(pP
363b0 61 67 65 72 2c 20 70 67 6e 6f 2c 20 70 44 61 74  ager, pgno, pDat
363c0 61 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 20 20  a, &pPg);.      
363d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
363e0 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28  qlite3OsUnfetch(
363f0 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36 34  pPager->fd, (i64
36400 29 28 70 67 6e 6f 2d 31 29 2a 70 50 61 67 65 72  )(pgno-1)*pPager
36410 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 44 61 74  ->pageSize, pDat
36420 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  a);.      }.    
36430 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
36440 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
36450 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
36460 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
36470 70 50 67 3b 0a 20 20 20 20 20 20 20 20 72 65 74  pPg;.        ret
36480 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
36490 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
364a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
364b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 50  OK ){.      *ppP
364c0 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  age = 0;.      r
364d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
364e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 67 65 74    }.  return get
364f0 50 61 67 65 4e 6f 72 6d 61 6c 28 70 50 61 67 65  PageNormal(pPage
36500 72 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c  r, pgno, ppPage,
36510 20 66 6c 61 67 73 29 3b 0a 7d 0a 23 65 6e 64 69   flags);.}.#endi
36520 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f  f /* SQLITE_MAX_
36530 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a  MMAP_SIZE>0 */..
36540 2f 2a 20 54 68 65 20 70 61 67 65 20 67 65 74 74  /* The page gett
36550 65 72 20 6d 65 74 68 6f 64 20 66 6f 72 20 77 68  er method for wh
36560 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73 20  en the pager is 
36570 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 2a  an error state *
36580 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
36590 50 61 67 65 45 72 72 6f 72 28 0a 20 20 50 61 67  PageError(.  Pag
365a0 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
365b0 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70   /* The pager op
365c0 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  en on the databa
365d0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e  se file */.  Pgn
365e0 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
365f0 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
36600 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62  to fetch */.  Db
36610 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
36620 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69    /* Write a poi
36630 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
36640 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66   here */.  int f
36650 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f  lags           /
36660 2a 20 50 41 47 45 52 5f 47 45 54 5f 58 58 58 20  * PAGER_GET_XXX 
36670 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 55 4e  flags */.){.  UN
36680 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
36690 67 6e 6f 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  gno);.  UNUSED_P
366a0 41 52 41 4d 45 54 45 52 28 66 6c 61 67 73 29 3b  ARAMETER(flags);
366b0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
366c0 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  r->errCode!=SQLI
366d0 54 45 5f 4f 4b 20 29 3b 0a 20 20 2a 70 70 50 61  TE_OK );.  *ppPa
366e0 67 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  ge = 0;.  return
366f0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
36700 3b 0a 7d 0a 0a 0a 2f 2a 20 44 69 73 70 61 74 63  ;.}.../* Dispatc
36710 68 20 61 6c 6c 20 70 61 67 65 20 66 65 74 63 68  h all page fetch
36720 20 72 65 71 75 65 73 74 73 20 74 6f 20 74 68 65   requests to the
36730 20 61 70 70 72 6f 70 72 69 61 74 65 20 67 65 74   appropriate get
36740 74 65 72 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 69  ter method..*/.i
36750 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  nt sqlite3PagerG
36760 65 74 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  et(.  Pager *pPa
36770 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  ger,      /* The
36780 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74   pager open on t
36790 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
367a0 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
367b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
367c0 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63  e number to fetc
367d0 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a  h */.  DbPage **
367e0 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72  ppPage,    /* Wr
367f0 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ite a pointer to
36800 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20 2a   the page here *
36810 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
36820 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52          /* PAGER
36830 5f 47 45 54 5f 58 58 58 20 66 6c 61 67 73 20 2a  _GET_XXX flags *
36840 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  /.){.  return pP
36850 61 67 65 72 2d 3e 78 47 65 74 28 70 50 61 67 65  ager->xGet(pPage
36860 72 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c  r, pgno, ppPage,
36870 20 66 6c 61 67 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   flags);.}../*.*
36880 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65  * Acquire a page
36890 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   if it is alread
368a0 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  y in the in-memo
368b0 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a  ry cache.  Do.**
368c0 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70 61   not read the pa
368d0 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52  ge from disk.  R
368e0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
368f0 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20  to the page,.** 
36900 6f 72 20 30 20 69 66 20 74 68 65 20 70 61 67 65  or 0 if the page
36910 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
36920 2e 20 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  . .**.** See als
36930 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  o sqlite3PagerGe
36940 74 28 29 2e 20 20 54 68 65 20 64 69 66 66 65 72  t().  The differ
36950 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
36960 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64  s routine.** and
36970 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
36980 28 29 20 69 73 20 74 68 61 74 20 5f 67 65 74 28  () is that _get(
36990 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65  ) will go to the
369a0 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a   disk and read.*
369b0 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20 69 66  * in the page if
369c0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
369d0 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68   already in cach
369e0 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
369f0 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c  .** returns NULL
36a00 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
36a10 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20  not in cache or 
36a20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72  if a disk I/O er
36a30 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72  ror .** has ever
36a40 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62   happened..*/.Db
36a50 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67  Page *sqlite3Pag
36a60 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a  erLookup(Pager *
36a70 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
36a80 6f 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 70 63  o){.  sqlite3_pc
36a90 61 63 68 65 5f 70 61 67 65 20 2a 70 50 61 67 65  ache_page *pPage
36aa0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
36ab0 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  er!=0 );.  asser
36ac0 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20  t( pgno!=0 );.  
36ad0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
36ae0 70 50 43 61 63 68 65 21 3d 30 20 29 3b 0a 20 20  pPCache!=0 );.  
36af0 70 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50  pPage = sqlite3P
36b00 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65  cacheFetch(pPage
36b10 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f  r->pPCache, pgno
36b20 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
36b30 70 50 61 67 65 3d 3d 30 20 7c 7c 20 70 50 61 67  pPage==0 || pPag
36b40 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65  er->hasHeldShare
36b50 64 4c 6f 63 6b 20 29 3b 0a 20 20 69 66 28 20 70  dLock );.  if( p
36b60 50 61 67 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Page==0 ) return
36b70 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   0;.  return sql
36b80 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 46  ite3PcacheFetchF
36b90 69 6e 69 73 68 28 70 50 61 67 65 72 2d 3e 70 50  inish(pPager->pP
36ba0 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 70 50 61  Cache, pgno, pPa
36bb0 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ge);.}../*.** Re
36bc0 6c 65 61 73 65 20 61 20 70 61 67 65 20 72 65 66  lease a page ref
36bd0 65 72 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  erence..**.** Th
36be0 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  e sqlite3PagerUn
36bf0 72 65 66 28 29 20 61 6e 64 20 73 71 6c 69 74 65  ref() and sqlite
36c00 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75  3PagerUnrefNotNu
36c10 6c 6c 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65  ll() may only be
36c20 0a 2a 2a 20 75 73 65 64 20 69 66 20 77 65 20 6b  .** used if we k
36c30 6e 6f 77 20 74 68 61 74 20 74 68 65 20 70 61 67  now that the pag
36c40 65 20 62 65 69 6e 67 20 72 65 6c 65 61 73 65 64  e being released
36c50 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73 74   is not the last
36c60 20 70 61 67 65 2e 0a 2a 2a 20 54 68 65 20 62 74   page..** The bt
36c70 72 65 65 20 6c 61 79 65 72 20 61 6c 77 61 79 73  ree layer always
36c80 20 68 6f 6c 64 73 20 70 61 67 65 31 20 6f 70 65   holds page1 ope
36c90 6e 20 75 6e 74 69 6c 20 74 68 65 20 65 6e 64 2c  n until the end,
36ca0 20 73 6f 20 74 68 65 73 65 20 66 69 72 73 74 0a   so these first.
36cb0 2a 2a 20 74 6f 20 72 6f 75 74 69 6e 65 73 20 63  ** to routines c
36cc0 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 72 65  an be used to re
36cd0 6c 65 61 73 65 20 61 6e 79 20 70 61 67 65 20 6f  lease any page o
36ce0 74 68 65 72 20 74 68 61 6e 20 42 74 53 68 61 72  ther than BtShar
36cf0 65 64 2e 70 50 61 67 65 31 2e 0a 2a 2a 0a 2a 2a  ed.pPage1..**.**
36d00 20 55 73 65 20 73 71 6c 69 74 65 33 50 61 67 65   Use sqlite3Page
36d10 72 55 6e 72 65 66 50 61 67 65 4f 6e 65 28 29 20  rUnrefPageOne() 
36d20 74 6f 20 72 65 6c 65 61 73 65 20 70 61 67 65 31  to release page1
36d30 2e 20 20 54 68 69 73 20 6c 61 74 74 65 72 20 72  .  This latter r
36d40 6f 75 74 69 6e 65 0a 2a 2a 20 63 68 65 63 6b 73  outine.** checks
36d50 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
36d60 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67  r of outstanding
36d70 20 70 61 67 65 73 20 61 6e 64 20 69 66 20 74 68   pages and if th
36d80 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70  e number of.** p
36d90 61 67 65 73 20 72 65 61 63 68 65 73 20 7a 65 72  ages reaches zer
36da0 6f 20 69 74 20 64 72 6f 70 73 20 74 68 65 20 64  o it drops the d
36db0 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e 0a 2a 2f  atabase lock..*/
36dc0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
36dd0 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 44  erUnrefNotNull(D
36de0 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 54  bPage *pPg){.  T
36df0 45 53 54 4f 4e 4c 59 28 20 50 61 67 65 72 20 2a  ESTONLY( Pager *
36e00 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
36e10 61 67 65 72 3b 20 29 0a 20 20 61 73 73 65 72 74  ager; ).  assert
36e20 28 20 70 50 67 21 3d 30 20 29 3b 0a 20 20 69 66  ( pPg!=0 );.  if
36e30 28 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50  ( pPg->flags & P
36e40 47 48 44 52 5f 4d 4d 41 50 20 29 7b 0a 20 20 20  GHDR_MMAP ){.   
36e50 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67   assert( pPg->pg
36e60 6e 6f 21 3d 31 20 29 3b 20 20 2f 2a 20 50 61 67  no!=1 );  /* Pag
36e70 65 31 20 69 73 20 6e 65 76 65 72 20 6d 65 6d 6f  e1 is never memo
36e80 72 79 20 6d 61 70 70 65 64 20 2a 2f 0a 20 20 20  ry mapped */.   
36e90 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70   pagerReleaseMap
36ea0 50 61 67 65 28 70 50 67 29 3b 0a 20 20 7d 65 6c  Page(pPg);.  }el
36eb0 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  se{.    sqlite3P
36ec0 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50 67  cacheRelease(pPg
36ed0 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 44 6f 20 6e  );.  }.  /* Do n
36ee0 6f 74 20 75 73 65 20 74 68 69 73 20 72 6f 75 74  ot use this rout
36ef0 69 6e 65 20 74 6f 20 72 65 6c 65 61 73 65 20 74  ine to release t
36f00 68 65 20 6c 61 73 74 20 72 65 66 65 72 65 6e 63  he last referenc
36f10 65 20 74 6f 20 70 61 67 65 31 20 2a 2f 0a 20 20  e to page1 */.  
36f20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
36f30 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
36f40 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30  ager->pPCache)>0
36f50 20 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74   );.}.void sqlit
36f60 65 33 50 61 67 65 72 55 6e 72 65 66 28 44 62 50  e3PagerUnref(DbP
36f70 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 69 66 28  age *pPg){.  if(
36f80 20 70 50 67 20 29 20 73 71 6c 69 74 65 33 50 61   pPg ) sqlite3Pa
36f90 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28  gerUnrefNotNull(
36fa0 70 50 67 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c  pPg);.}.void sql
36fb0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 50 61  ite3PagerUnrefPa
36fc0 67 65 4f 6e 65 28 44 62 50 61 67 65 20 2a 70 50  geOne(DbPage *pP
36fd0 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
36fe0 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ger;.  assert( p
36ff0 50 67 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Pg!=0 );.  asser
37000 74 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20  t( pPg->pgno==1 
37010 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 50  );.  assert( (pP
37020 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52  g->flags & PGHDR
37030 5f 4d 4d 41 50 29 3d 3d 30 20 29 3b 20 2f 2a 20  _MMAP)==0 ); /* 
37040 50 61 67 65 31 20 69 73 20 6e 65 76 65 72 20 6d  Page1 is never m
37050 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 2a 2f 0a  emory mapped */.
37060 20 20 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e    pPager = pPg->
37070 70 50 61 67 65 72 3b 0a 20 20 73 71 6c 69 74 65  pPager;.  sqlite
37080 33 50 61 67 65 72 52 65 73 65 74 4c 6f 63 6b 54  3PagerResetLockT
37090 69 6d 65 6f 75 74 28 70 50 61 67 65 72 29 3b 0a  imeout(pPager);.
370a0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52    sqlite3PcacheR
370b0 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 70  elease(pPg);.  p
370c0 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73  agerUnlockIfUnus
370d0 65 64 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f  ed(pPager);.}../
370e0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
370f0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 74 20  on is called at 
37100 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 76 65  the start of eve
37110 72 79 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  ry write transac
37120 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65 20 6d  tion..** There m
37130 75 73 74 20 61 6c 72 65 61 64 79 20 62 65 20 61  ust already be a
37140 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43   RESERVED or EXC
37150 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
37160 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
37170 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72  file when this r
37180 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
37190 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65  ..**.** Open the
371a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
371b0 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20 61  r pager pPager a
371c0 6e 64 20 77 72 69 74 65 20 61 20 6a 6f 75 72 6e  nd write a journ
371d0 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 74 6f 20  al header.** to 
371e0 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 2e  the start of it.
371f0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61 63   If there are ac
37200 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 2c  tive savepoints,
37210 20 6f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f   open the sub-jo
37220 75 72 6e 61 6c 0a 2a 2a 20 61 73 20 77 65 6c 6c  urnal.** as well
37230 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
37240 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65  is only used whe
37250 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
37260 6c 65 20 69 73 20 62 65 69 6e 67 20 0a 2a 2a 20  le is being .** 
37270 6f 70 65 6e 65 64 20 74 6f 20 77 72 69 74 65 20  opened to write 
37280 61 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20 66  a rollback log f
37290 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  or a transaction
372a0 2e 20 49 74 20 69 73 20 6e 6f 74 20 75 73 65 64  . It is not used
372b0 20 0a 2a 2a 20 77 68 65 6e 20 6f 70 65 6e 69 6e   .** when openin
372c0 67 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  g a hot journal 
372d0 66 69 6c 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20  file to roll it 
372e0 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
372f0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
37300 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20  is already open 
37310 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 69 6e  (as it may be in
37320 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29   exclusive mode)
37330 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 66  ,.** then this f
37340 75 6e 63 74 69 6f 6e 20 6a 75 73 74 20 77 72 69  unction just wri
37350 74 65 73 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65  tes a journal he
37360 61 64 65 72 20 74 6f 20 74 68 65 20 73 74 61 72  ader to the star
37370 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61 6c 72 65  t of the.** alre
37380 61 64 79 20 6f 70 65 6e 20 66 69 6c 65 2e 20 0a  ady open file. .
37390 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72  **.** Whether or
373a0 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c   not the journal
373b0 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20   file is opened 
373c0 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
373d0 2c 20 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e 70  , the.** Pager.p
373e0 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63  InJournal bitvec
373f0 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c   structure is al
37400 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52  located..**.** R
37410 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
37420 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  if everything is
37430 20 73 75 63 63 65 73 73 66 75 6c 2e 20 4f 74 68   successful. Oth
37440 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 0a  erwise, return .
37450 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  ** SQLITE_NOMEM 
37460 69 66 20 74 68 65 20 61 74 74 65 6d 70 74 20 74  if the attempt t
37470 6f 20 61 6c 6c 6f 63 61 74 65 20 50 61 67 65 72  o allocate Pager
37480 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 66 61 69 6c  .pInJournal fail
37490 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f 20  s, or .** an IO 
374a0 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 6f 70  error code if op
374b0 65 6e 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ening or writing
374c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
374d0 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  e fails..*/.stat
374e0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65  ic int pager_ope
374f0 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  n_journal(Pager 
37500 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
37510 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
37520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37530 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
37540 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74   code */.  sqlit
37550 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70  e3_vfs * const p
37560 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
37570 66 73 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63  fs;   /* Local c
37580 61 63 68 65 20 6f 66 20 76 66 73 20 70 6f 69 6e  ache of vfs poin
37590 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ter */..  assert
375a0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
375b0 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
375c0 4f 43 4b 45 44 20 29 3b 0a 20 20 61 73 73 65 72  OCKED );.  asser
375d0 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
375e0 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
375f0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
37600 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
37610 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61   );.  .  /* If a
37620 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 65 72  lready in the er
37630 72 6f 72 20 73 74 61 74 65 2c 20 74 68 69 73 20  ror state, this 
37640 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
37650 2d 6f 70 2e 20 20 42 75 74 20 6f 6e 0a 20 20 2a  -op.  But on.  *
37660 2a 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  * the other hand
37670 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
37680 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69  s never called i
37690 66 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79  f we are already
376a0 20 69 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f   in.  ** an erro
376b0 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69 66  r state. */.  if
376c0 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e  ( NEVER(pPager->
376d0 65 72 72 43 6f 64 65 29 20 29 20 72 65 74 75 72  errCode) ) retur
376e0 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
376f0 65 3b 0a 0a 20 20 69 66 28 20 21 70 61 67 65 72  e;..  if( !pager
37700 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 26  UseWal(pPager) &
37710 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
37720 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55  lMode!=PAGER_JOU
37730 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a  RNALMODE_OFF ){.
37740 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a      pPager->pInJ
37750 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33  ournal = sqlite3
37760 42 69 74 76 65 63 43 72 65 61 74 65 28 70 50 61  BitvecCreate(pPa
37770 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20  ger->dbSize);.  
37780 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49    if( pPager->pI
37790 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20  nJournal==0 ){. 
377a0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
377b0 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
377c0 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 4f     }.  .    /* O
377d0 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
377e0 66 69 6c 65 20 69 66 20 69 74 20 69 73 20 6e 6f  file if it is no
377f0 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2e 20  t already open. 
37800 2a 2f 0a 20 20 20 20 69 66 28 20 21 69 73 4f 70  */.    if( !isOp
37810 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
37820 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  ){.      if( pPa
37830 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
37840 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
37850 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20  ODE_MEMORY ){.  
37860 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d        sqlite3Mem
37870 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67  JournalOpen(pPag
37880 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
37890 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
378a0 6e 74 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54  nt flags = SQLIT
378b0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
378c0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  |SQLITE_OPEN_CRE
378d0 41 54 45 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ATE;.        int
378e0 20 6e 53 70 69 6c 6c 3b 0a 0a 23 69 66 20 53 51   nSpill;..#if SQ
378f0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41  LITE_ENABLE_DATA
37900 5f 50 52 4f 54 45 43 54 49 4f 4e 0a 20 20 20 20  _PROTECTION.    
37910 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 28 70 50      flags |= (pP
37920 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 26 53  ager->vfsFlags&S
37930 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 49 4c 45 50  QLITE_OPEN_FILEP
37940 52 4f 54 45 43 54 49 4f 4e 5f 4d 41 53 4b 29 3b  ROTECTION_MASK);
37950 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
37960 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  if( pPager->temp
37970 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  File ){.        
37980 20 20 66 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49    flags |= (SQLI
37990 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
379a0 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45  CLOSE|SQLITE_OPE
379b0 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3b  N_TEMP_JOURNAL);
379c0 0a 20 20 20 20 20 20 20 20 20 20 6e 53 70 69 6c  .          nSpil
379d0 6c 20 3d 20 73 71 6c 69 74 65 33 43 6f 6e 66 69  l = sqlite3Confi
379e0 67 2e 6e 53 74 6d 74 53 70 69 6c 6c 3b 0a 20 20  g.nStmtSpill;.  
379f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
37a00 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20         flags |= 
37a10 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
37a20 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20  _JOURNAL;.      
37a30 20 20 20 20 6e 53 70 69 6c 6c 20 3d 20 6a 72 6e      nSpill = jrn
37a40 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50 61 67  lBufferSize(pPag
37a50 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  er);.        }. 
37a60 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20           .      
37a70 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74    /* Verify that
37a80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 74   the database st
37a90 69 6c 6c 20 68 61 73 20 74 68 65 20 73 61 6d 65  ill has the same
37aa0 20 6e 61 6d 65 20 61 73 20 69 74 20 64 69 64 20   name as it did 
37ab0 77 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  when.        ** 
37ac0 69 74 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c  it was originall
37ad0 79 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 20  y opened. */.   
37ae0 20 20 20 20 20 72 63 20 3d 20 64 61 74 61 62 61       rc = databa
37af0 73 65 49 73 55 6e 6d 6f 76 65 64 28 70 50 61 67  seIsUnmoved(pPag
37b00 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  er);.        if(
37b10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
37b20 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
37b30 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f   sqlite3JournalO
37b40 70 65 6e 20 28 0a 20 20 20 20 20 20 20 20 20 20  pen (.          
37b50 20 20 20 20 70 56 66 73 2c 20 70 50 61 67 65 72      pVfs, pPager
37b60 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
37b70 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20  er->jfd, flags, 
37b80 6e 53 70 69 6c 6c 0a 20 20 20 20 20 20 20 20 20  nSpill.         
37b90 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   );.        }.  
37ba0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
37bb0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
37bc0 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67  K || isOpen(pPag
37bd0 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20  er->jfd) );.    
37be0 7d 0a 20 20 0a 20 20 0a 20 20 20 20 2f 2a 20 57  }.  .  .    /* W
37bf0 72 69 74 65 20 74 68 65 20 66 69 72 73 74 20 6a  rite the first j
37c00 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f  ournal header to
37c10 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
37c20 65 20 61 6e 64 20 6f 70 65 6e 20 0a 20 20 20 20  e and open .    
37c30 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  ** the sub-journ
37c40 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  al if necessary.
37c50 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
37c60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
37c70 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20  .      /* TODO: 
37c80 43 68 65 63 6b 20 69 66 20 61 6c 6c 20 6f 66 20  Check if all of 
37c90 74 68 65 73 65 20 61 72 65 20 72 65 61 6c 6c 79  these are really
37ca0 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
37cb0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
37cc0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
37cd0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
37ce0 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
37cf0 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
37d00 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
37d10 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20  ournalHdr = 0;. 
37d20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a       rc = writeJ
37d30 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
37d40 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
37d50 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
37d60 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
37d70 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50  BitvecDestroy(pP
37d80 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
37d90 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  );.    pPager->p
37da0 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
37db0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
37dc0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
37dd0 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
37de0 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 70  _LOCKED );.    p
37df0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
37e00 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
37e10 48 45 4d 4f 44 3b 0a 20 20 7d 0a 0a 20 20 72 65  HEMOD;.  }..  re
37e20 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
37e30 2a 20 42 65 67 69 6e 20 61 20 77 72 69 74 65 2d  * Begin a write-
37e40 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
37e50 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67  he specified pag
37e60 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 20  er object. If a 
37e70 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61  .** write-transa
37e80 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
37e90 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 74  y been opened, t
37ea0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
37eb0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
37ec0 66 20 74 68 65 20 65 78 46 6c 61 67 20 61 72 67  f the exFlag arg
37ed0 75 6d 65 6e 74 20 69 73 20 66 61 6c 73 65 2c 20  ument is false, 
37ee0 74 68 65 6e 20 61 63 71 75 69 72 65 20 61 74 20  then acquire at 
37ef0 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44  least a RESERVED
37f00 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  .** lock on the 
37f10 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
37f20 66 20 65 78 46 6c 61 67 20 69 73 20 74 72 75 65  f exFlag is true
37f30 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 61  , then acquire a
37f40 74 20 6c 65 61 73 74 0a 2a 2a 20 61 6e 20 45 58  t least.** an EX
37f50 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66  CLUSIVE lock. If
37f60 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
37f70 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6e 6f  already held, no
37f80 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 66 75 6e   locking .** fun
37f90 63 74 69 6f 6e 73 20 6e 65 65 64 20 62 65 20 63  ctions need be c
37fa0 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  alled..**.** If 
37fb0 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  the subjInMemory
37fc0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e   argument is non
37fd0 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20  -zero, then any 
37fe0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e  sub-journal open
37ff0 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 69  ed.** within thi
38000 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  s transaction wi
38010 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 61 73 20  ll be opened as 
38020 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c  an in-memory fil
38030 65 2e 20 54 68 69 73 0a 2a 2a 20 68 61 73 20 6e  e. This.** has n
38040 6f 20 65 66 66 65 63 74 20 69 66 20 74 68 65 20  o effect if the 
38050 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 61  sub-journal is a
38060 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 28 61  lready opened (a
38070 73 20 69 74 20 6d 61 79 20 62 65 20 77 68 65 6e  s it may be when
38080 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65  .** running in e
38090 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 20 6f  xclusive mode) o
380a0 72 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63  r if the transac
380b0 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65  tion does not re
380c0 71 75 69 72 65 20 61 0a 2a 2a 20 73 75 62 2d 6a  quire a.** sub-j
380d0 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 65 20 73  ournal. If the s
380e0 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75  ubjInMemory argu
380f0 6d 65 6e 74 20 69 73 20 7a 65 72 6f 2c 20 74 68  ment is zero, th
38100 65 6e 20 61 6e 79 20 72 65 71 75 69 72 65 64 0a  en any required.
38110 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  ** sub-journal i
38120 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e  s implemented in
38130 2d 6d 65 6d 6f 72 79 20 69 66 20 70 50 61 67 65  -memory if pPage
38140 72 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  r is an in-memor
38150 79 20 64 61 74 61 62 61 73 65 2c 20 0a 2a 2a 20  y database, .** 
38160 6f 72 20 75 73 69 6e 67 20 61 20 74 65 6d 70 6f  or using a tempo
38170 72 61 72 79 20 66 69 6c 65 20 6f 74 68 65 72 77  rary file otherw
38180 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ise..*/.int sqli
38190 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 50 61  te3PagerBegin(Pa
381a0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
381b0 20 65 78 46 6c 61 67 2c 20 69 6e 74 20 73 75 62   exFlag, int sub
381c0 6a 49 6e 4d 65 6d 6f 72 79 29 7b 0a 20 20 69 6e  jInMemory){.  in
381d0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
381e0 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
381f0 3e 65 72 72 43 6f 64 65 20 29 20 72 65 74 75 72  >errCode ) retur
38200 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
38210 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  e;.  assert( pPa
38220 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
38230 45 52 5f 52 45 41 44 45 52 20 26 26 20 70 50 61  ER_READER && pPa
38240 67 65 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45  ger->eState<PAGE
38250 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 70 50 61  R_ERROR );.  pPa
38260 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72  ger->subjInMemor
38270 79 20 3d 20 28 75 38 29 73 75 62 6a 49 6e 4d 65  y = (u8)subjInMe
38280 6d 6f 72 79 3b 0a 0a 20 20 69 66 28 20 41 4c 57  mory;..  if( ALW
38290 41 59 53 28 70 50 61 67 65 72 2d 3e 65 53 74 61  AYS(pPager->eSta
382a0 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
382b0 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
382c0 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
382d0 6e 61 6c 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 69  nal==0 );..    i
382e0 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
382f0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
38300 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
38310 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f  is configured to
38320 20 75 73 65 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64   use locking_mod
38330 65 3d 65 78 63 6c 75 73 69 76 65 2c 20 61 6e 64  e=exclusive, and
38340 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 65 78 63   an.      ** exc
38350 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74  lusive lock on t
38360 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  he database is n
38370 6f 74 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c  ot already held,
38380 20 6f 62 74 61 69 6e 20 69 74 20 6e 6f 77 2e 0a   obtain it now..
38390 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
383a0 66 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  f( pPager->exclu
383b0 73 69 76 65 4d 6f 64 65 20 26 26 20 73 71 6c 69  siveMode && sqli
383c0 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d  te3WalExclusiveM
383d0 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ode(pPager->pWal
383e0 2c 20 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  , -1) ){.       
383f0 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44   rc = pagerLockD
38400 62 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  b(pPager, EXCLUS
38410 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
38420 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
38430 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
38440 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
38450 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 28       }.        (
38460 76 6f 69 64 29 73 71 6c 69 74 65 33 57 61 6c 45  void)sqlite3WalE
38470 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61  xclusiveMode(pPa
38480 67 65 72 2d 3e 70 57 61 6c 2c 20 31 29 3b 0a 20  ger->pWal, 1);. 
38490 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
384a0 20 47 72 61 62 20 74 68 65 20 77 72 69 74 65 20   Grab the write 
384b0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6c 6f 67 20  lock on the log 
384c0 66 69 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73  file. If success
384d0 66 75 6c 2c 20 75 70 67 72 61 64 65 20 74 6f 0a  ful, upgrade to.
384e0 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 52        ** PAGER_R
384f0 45 53 45 52 56 45 44 20 73 74 61 74 65 2e 20 4f  ESERVED state. O
38500 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
38510 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74   an error code t
38520 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20  o the caller..  
38530 20 20 20 20 2a 2a 20 54 68 65 20 62 75 73 79 2d      ** The busy-
38540 68 61 6e 64 6c 65 72 20 69 73 20 6e 6f 74 20 69  handler is not i
38550 6e 76 6f 6b 65 64 20 69 66 20 61 6e 6f 74 68 65  nvoked if anothe
38560 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c 72  r connection alr
38570 65 61 64 79 0a 20 20 20 20 20 20 2a 2a 20 68 6f  eady.      ** ho
38580 6c 64 73 20 74 68 65 20 77 72 69 74 65 2d 6c 6f  lds the write-lo
38590 63 6b 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c  ck. If possible,
385a0 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72   the upper layer
385b0 20 77 69 6c 6c 20 63 61 6c 6c 20 69 74 2e 0a 20   will call it.. 
385c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
385d0 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67   = sqlite3WalBeg
385e0 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69  inWriteTransacti
385f0 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29  on(pPager->pWal)
38600 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
38610 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20 52     /* Obtain a R
38620 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
38630 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
38640 65 2e 20 49 66 20 74 68 65 20 65 78 46 6c 61 67  e. If the exFlag
38650 20 70 61 72 61 6d 65 74 65 72 0a 20 20 20 20 20   parameter.     
38660 20 2a 2a 20 69 73 20 74 72 75 65 2c 20 74 68 65   ** is true, the
38670 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 75 70  n immediately up
38680 67 72 61 64 65 20 74 68 69 73 20 74 6f 20 61 6e  grade this to an
38690 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
386a0 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 62 75   The.      ** bu
386b0 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62  sy-handler callb
386c0 61 63 6b 20 63 61 6e 20 62 65 20 75 73 65 64 20  ack can be used 
386d0 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 74  when