/ Hex Artifact Content
Login

Artifact 76d29b8a960dcb8b67210f095899d91e4a90673a6674ea58cfd1115b705a7fb9:


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 2f 2a 0a 2a 2a 20  hods!=0)../*.** 
97b0: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
97c0: 68 69 73 20 70 61 67 65 72 20 75 73 65 73 20 61  his pager uses a
97d0: 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67   write-ahead log
97e0: 20 74 6f 20 72 65 61 64 20 70 61 67 65 20 70 67   to read page pg
97f0: 6e 6f 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61  no..** Return fa
9800: 6c 73 65 20 69 66 20 74 68 65 20 70 61 67 65 72  lse if the pager
9810: 20 72 65 61 64 73 20 70 67 6e 6f 20 64 69 72 65   reads pgno dire
9820: 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 64 61  ctly from the da
9830: 74 61 62 61 73 65 2e 0a 2a 2f 0a 23 69 66 20 21  tabase..*/.#if !
9840: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
9850: 4d 49 54 5f 57 41 4c 29 20 26 26 20 64 65 66 69  MIT_WAL) && defi
9860: 6e 65 64 28 53 51 4c 49 54 45 5f 44 49 52 45 43  ned(SQLITE_DIREC
9870: 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 29  T_OVERFLOW_READ)
9880: 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
9890: 72 55 73 65 57 61 6c 28 50 61 67 65 72 20 2a 70  rUseWal(Pager *p
98a0: 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
98b0: 29 7b 0a 20 20 75 33 32 20 69 52 65 61 64 20 3d  ){.  u32 iRead =
98c0: 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
98d0: 69 66 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c  if( pPager->pWal
98e0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
98f0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
9900: 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65  lFindFrame(pPage
9910: 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26  r->pWal, pgno, &
9920: 69 52 65 61 64 29 3b 0a 20 20 72 65 74 75 72 6e  iRead);.  return
9930: 20 72 63 20 7c 7c 20 69 52 65 61 64 3b 0a 7d 0a   rc || iRead;.}.
9940: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
9950: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 23  QLITE_OMIT_WAL.#
9960: 20 64 65 66 69 6e 65 20 70 61 67 65 72 55 73 65   define pagerUse
9970: 57 61 6c 28 78 29 20 28 28 78 29 2d 3e 70 57 61  Wal(x) ((x)->pWa
9980: 6c 21 3d 30 29 0a 23 65 6c 73 65 0a 23 20 64 65  l!=0).#else.# de
9990: 66 69 6e 65 20 70 61 67 65 72 55 73 65 57 61 6c  fine pagerUseWal
99a0: 28 78 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70  (x) 0.# define p
99b0: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28  agerRollbackWal(
99c0: 78 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61  x) 0.# define pa
99d0: 67 65 72 57 61 6c 46 72 61 6d 65 73 28 76 2c 77  gerWalFrames(v,w
99e0: 2c 78 2c 79 29 20 30 0a 23 20 64 65 66 69 6e 65  ,x,y) 0.# define
99f0: 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50   pagerOpenWalIfP
9a00: 72 65 73 65 6e 74 28 7a 29 20 53 51 4c 49 54 45  resent(z) SQLITE
9a10: 5f 4f 4b 0a 23 20 64 65 66 69 6e 65 20 70 61 67  _OK.# define pag
9a20: 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73  erBeginReadTrans
9a30: 61 63 74 69 6f 6e 28 7a 29 20 53 51 4c 49 54 45  action(z) SQLITE
9a40: 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  _OK.#endif..#ifn
9a50: 64 65 66 20 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a  def NDEBUG ./*.*
9a60: 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20  * Usage:.**.**  
9a70: 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
9a80: 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
9a90: 65 72 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69  er) );.**.** Thi
9aa0: 73 20 66 75 6e 63 74 69 6f 6e 20 72 75 6e 73 20  s function runs 
9ab0: 6d 61 6e 79 20 61 73 73 65 72 74 73 20 74 6f 20  many asserts to 
9ac0: 74 72 79 20 74 6f 20 66 69 6e 64 20 69 6e 63 6f  try to find inco
9ad0: 6e 73 69 73 74 65 6e 63 69 65 73 20 69 6e 0a 2a  nsistencies in.*
9ae0: 2a 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73  * the internal s
9af0: 74 61 74 65 20 6f 66 20 74 68 65 20 50 61 67 65  tate of the Page
9b00: 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61  r object..*/.sta
9b10: 74 69 63 20 69 6e 74 20 61 73 73 65 72 74 5f 70  tic int assert_p
9b20: 61 67 65 72 5f 73 74 61 74 65 28 50 61 67 65 72  ager_state(Pager
9b30: 20 2a 70 29 7b 0a 20 20 50 61 67 65 72 20 2a 70   *p){.  Pager *p
9b40: 50 61 67 65 72 20 3d 20 70 3b 0a 0a 20 20 2f 2a  Pager = p;..  /*
9b50: 20 53 74 61 74 65 20 6d 75 73 74 20 62 65 20 76   State must be v
9b60: 61 6c 69 64 2e 20 2a 2f 0a 20 20 61 73 73 65 72  alid. */.  asser
9b70: 74 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  t( p->eState==PA
9b80: 47 45 52 5f 4f 50 45 4e 0a 20 20 20 20 20 20 20  GER_OPEN.       
9b90: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  || p->eState==PA
9ba0: 47 45 52 5f 52 45 41 44 45 52 0a 20 20 20 20 20  GER_READER.     
9bb0: 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d    || p->eState==
9bc0: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
9bd0: 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  KED.       || p-
9be0: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
9bf0: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20  RITER_CACHEMOD. 
9c00: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61        || p->eSta
9c10: 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
9c20: 5f 44 42 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c  _DBMOD.       ||
9c30: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
9c40: 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45  R_WRITER_FINISHE
9c50: 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65  D.       || p->e
9c60: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52  State==PAGER_ERR
9c70: 4f 52 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 52 65  OR.  );..  /* Re
9c80: 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20  gardless of the 
9c90: 63 75 72 72 65 6e 74 20 73 74 61 74 65 2c 20 61  current state, a
9ca0: 20 74 65 6d 70 2d 66 69 6c 65 20 63 6f 6e 6e 65   temp-file conne
9cb0: 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 62 65 68  ction always beh
9cc0: 61 76 65 73 0a 20 20 2a 2a 20 61 73 20 69 66 20  aves.  ** as if 
9cd0: 69 74 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73  it has an exclus
9ce0: 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ive lock on the 
9cf0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
9d00: 74 20 6e 65 76 65 72 20 75 70 64 61 74 65 73 0a  t never updates.
9d10: 20 20 2a 2a 20 74 68 65 20 63 68 61 6e 67 65 2d    ** the change-
9d20: 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 2c 20 73  counter field, s
9d30: 6f 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e  o the changeCoun
9d40: 74 44 6f 6e 65 20 66 6c 61 67 20 69 73 20 61 6c  tDone flag is al
9d50: 77 61 79 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  ways set..  */. 
9d60: 20 61 73 73 65 72 74 28 20 70 2d 3e 74 65 6d 70   assert( p->temp
9d70: 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 2d 3e 65 4c  File==0 || p->eL
9d80: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
9d90: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
9da0: 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20   p->tempFile==0 
9db0: 7c 7c 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  || pPager->chang
9dc0: 65 43 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20  eCountDone );.. 
9dd0: 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65 4a 6f   /* If the useJo
9de0: 75 72 6e 61 6c 20 66 6c 61 67 20 69 73 20 63 6c  urnal flag is cl
9df0: 65 61 72 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ear, the journal
9e00: 2d 6d 6f 64 65 20 6d 75 73 74 20 62 65 20 22 4f  -mode must be "O
9e10: 46 46 22 2e 20 0a 20 20 2a 2a 20 41 6e 64 20 69  FF". .  ** And i
9e20: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  f the journal-mo
9e30: 64 65 20 69 73 20 22 4f 46 46 22 2c 20 74 68 65  de is "OFF", the
9e40: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
9e50: 73 74 20 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a  st not be open..
9e60: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
9e70: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
9e80: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
9e90: 5f 4f 46 46 20 7c 7c 20 70 2d 3e 75 73 65 4a 6f  _OFF || p->useJo
9ea0: 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72  urnal );.  asser
9eb0: 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  t( p->journalMod
9ec0: 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
9ed0: 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 21 69 73 4f  MODE_OFF || !isO
9ee0: 70 65 6e 28 70 2d 3e 6a 66 64 29 20 29 3b 0a 0a  pen(p->jfd) );..
9ef0: 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
9f00: 4d 45 4d 44 42 20 69 6d 70 6c 69 65 73 20 6e 6f  MEMDB implies no
9f10: 53 79 6e 63 2e 20 41 6e 64 20 61 6e 20 69 6e 2d  Sync. And an in-
9f20: 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20  memory journal. 
9f30: 53 69 6e 63 65 20 0a 20 20 2a 2a 20 74 68 69 73  Since .  ** this
9f40: 20 6d 65 61 6e 73 20 61 6e 20 69 6e 2d 6d 65 6d   means an in-mem
9f50: 6f 72 79 20 70 61 67 65 72 20 70 65 72 66 6f 72  ory pager perfor
9f60: 6d 73 20 6e 6f 20 49 4f 20 61 74 20 61 6c 6c 2c  ms no IO at all,
9f70: 20 69 74 20 63 61 6e 6e 6f 74 20 65 6e 63 6f 75   it cannot encou
9f80: 6e 74 65 72 20 0a 20 20 2a 2a 20 65 69 74 68 65  nter .  ** eithe
9f90: 72 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f  r SQLITE_IOERR o
9fa0: 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64 75  r SQLITE_FULL du
9fb0: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 6f 72  ring rollback or
9fc0: 20 77 68 69 6c 65 20 66 69 6e 61 6c 69 7a 69 6e   while finalizin
9fd0: 67 20 0a 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61  g .  ** a journa
9fe0: 6c 20 66 69 6c 65 2e 20 28 61 6c 74 68 6f 75 67  l file. (althoug
9ff0: 68 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  h the in-memory 
a000: 6a 6f 75 72 6e 61 6c 20 69 6d 70 6c 65 6d 65 6e  journal implemen
a010: 74 61 74 69 6f 6e 20 6d 61 79 20 0a 20 20 2a 2a  tation may .  **
a020: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
a030: 4f 45 52 52 5f 4e 4f 4d 45 4d 20 77 68 69 6c 65  OERR_NOMEM while
a040: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
a050: 65 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74  e is being writt
a060: 65 6e 29 2e 20 49 74 20 0a 20 20 2a 2a 20 69 73  en). It .  ** is
a070: 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 74 20 70   therefore not p
a080: 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 6e 20 69  ossible for an i
a090: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 74  n-memory pager t
a0a0: 6f 20 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f  o enter the ERRO
a0b0: 52 20 0a 20 20 2a 2a 20 73 74 61 74 65 2e 0a 20  R .  ** state.. 
a0c0: 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20   */.  if( MEMDB 
a0d0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
a0e0: 69 73 4f 70 65 6e 28 70 2d 3e 66 64 29 20 29 3b  isOpen(p->fd) );
a0f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
a100: 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 20 20 61 73  noSync );.    as
a110: 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c  sert( p->journal
a120: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
a130: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
a140: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
a150: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a160: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
a170: 59 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73  Y .    );.    as
a180: 73 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65 21  sert( p->eState!
a190: 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26 20  =PAGER_ERROR && 
a1a0: 70 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  p->eState!=PAGER
a1b0: 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20 61 73 73  _OPEN );.    ass
a1c0: 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
a1d0: 28 70 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20  (p)==0 );.  }.. 
a1e0: 20 2f 2a 20 49 66 20 63 68 61 6e 67 65 43 6f 75   /* If changeCou
a1f0: 6e 74 44 6f 6e 65 20 69 73 20 73 65 74 2c 20 61  ntDone is set, a
a200: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
a210: 72 20 67 72 65 61 74 65 72 20 6d 75 73 74 20 62  r greater must b
a220: 65 20 68 65 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74  e held.  ** on t
a230: 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  he file..  */.  
a240: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a250: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3d  changeCountDone=
a260: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c  =0 || pPager->eL
a270: 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock>=RESERVED_LO
a280: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
a290: 70 2d 3e 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e  p->eLock!=PENDIN
a2a0: 47 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 73 77 69  G_LOCK );..  swi
a2b0: 74 63 68 28 20 70 2d 3e 65 53 74 61 74 65 20 29  tch( p->eState )
a2c0: 7b 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  {.    case PAGER
a2d0: 5f 4f 50 45 4e 3a 0a 20 20 20 20 20 20 61 73 73  _OPEN:.      ass
a2e0: 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
a2f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a300: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a310: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a320: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a330: 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
a340: 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
a350: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  =0 || pPager->te
a360: 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20  mpFile );.      
a370: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
a380: 20 50 41 47 45 52 5f 52 45 41 44 45 52 3a 0a 20   PAGER_READER:. 
a390: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a3a0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a3b0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a3c0: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63   assert( p->eLoc
a3d0: 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  k!=UNKNOWN_LOCK 
a3e0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a3f0: 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45   p->eLock>=SHARE
a400: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  D_LOCK );.      
a410: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
a420: 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f   PAGER_WRITER_LO
a430: 43 4b 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65  CKED:.      asse
a440: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e  rt( p->eLock!=UN
a450: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20  KNOWN_LOCK );.  
a460: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a470: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
a480: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
a490: 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  if( !pagerUseWal
a4a0: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
a4b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
a4c0: 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c  Lock>=RESERVED_L
a4d0: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  OCK );.      }. 
a4e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a4f0: 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50 61  ger->dbSize==pPa
a500: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
a510: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a520: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
a530: 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46  ize==pPager->dbF
a540: 69 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  ileSize );.     
a550: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a560: 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61  >dbOrigSize==pPa
a570: 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20  ger->dbHintSize 
a580: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a590: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
a5a0: 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  er==0 );.      b
a5b0: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
a5c0: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
a5d0: 48 45 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73  HEMOD:.      ass
a5e0: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55  ert( p->eLock!=U
a5f0: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20  NKNOWN_LOCK );. 
a600: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a610: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a620: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a630: 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61   if( !pagerUseWa
a640: 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
a650: 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 70 6f       /* It is po
a660: 73 73 69 62 6c 65 20 74 68 61 74 20 69 66 20 6a  ssible that if j
a670: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20  ournal_mode=wal 
a680: 68 65 72 65 20 74 68 61 74 20 6e 65 69 74 68 65  here that neithe
a690: 72 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  r the.        **
a6a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f   journal file no
a6b0: 72 20 74 68 65 20 57 41 4c 20 66 69 6c 65 20 61  r the WAL file a
a6c0: 72 65 20 6f 70 65 6e 2e 20 54 68 69 73 20 68 61  re open. This ha
a6d0: 70 70 65 6e 73 20 64 75 72 69 6e 67 0a 20 20 20  ppens during.   
a6e0: 20 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61       ** a rollba
a6f0: 63 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  ck transaction t
a700: 68 61 74 20 73 77 69 74 63 68 65 73 20 66 72 6f  hat switches fro
a710: 6d 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f  m journal_mode=o
a720: 66 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ff.        ** to
a730: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61   journal_mode=wa
a740: 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  l..        */.  
a750: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a760: 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44  >eLock>=RESERVED
a770: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20  _LOCK );.       
a780: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
a790: 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20  p->jfd) .       
a7a0: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
a7b0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a7c0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
a7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
a7e0: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
a7f0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
a800: 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 20 20 29  E_WAL .        )
a810: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a820: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a830: 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67  dbOrigSize==pPag
a840: 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29  er->dbFileSize )
a850: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a860: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
a870: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69  ze==pPager->dbHi
a880: 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  ntSize );.      
a890: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
a8a0: 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42   PAGER_WRITER_DB
a8b0: 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72  MOD:.      asser
a8c0: 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  t( p->eLock==EXC
a8d0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
a8e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a8f0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a900: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a910: 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
a920: 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
a930: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a940: 2d 3e 65 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53 49  ->eLock>=EXCLUSI
a950: 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  VE_LOCK );.     
a960: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
a970: 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20  p->jfd) .       
a980: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
a990: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a9a0: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
a9b0: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
a9c0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
a9d0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
a9e0: 4c 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  L .           ||
a9f0: 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63   (sqlite3OsDevic
aa00: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
aa10: 28 70 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49  (p->fd)&SQLITE_I
aa20: 4f 43 41 50 5f 42 41 54 43 48 5f 41 54 4f 4d 49  OCAP_BATCH_ATOMI
aa30: 43 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  C).      );.    
aa40: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
aa50: 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3c 3d 70 50  ->dbOrigSize<=pP
aa60: 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
aa70: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
aa80: 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  ..    case PAGER
aa90: 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44  _WRITER_FINISHED
aaa0: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
aab0: 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  p->eLock==EXCLUS
aac0: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  IVE_LOCK );.    
aad0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
aae0: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
aaf0: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
ab00: 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
ab10: 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
ab20: 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
ab30: 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20  en(p->jfd) .    
ab40: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75         || p->jou
ab50: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
ab60: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
ab70: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
ab80: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
ab90: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
aba0: 5f 57 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20  _WAL .          
abb0: 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65   || (sqlite3OsDe
abc0: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
abd0: 69 63 73 28 70 2d 3e 66 64 29 26 53 51 4c 49 54  ics(p->fd)&SQLIT
abe0: 45 5f 49 4f 43 41 50 5f 42 41 54 43 48 5f 41 54  E_IOCAP_BATCH_AT
abf0: 4f 4d 49 43 29 0a 20 20 20 20 20 20 29 3b 0a 20  OMIC).      );. 
ac00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
ac10: 20 63 61 73 65 20 50 41 47 45 52 5f 45 52 52 4f   case PAGER_ERRO
ac20: 52 3a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72  R:.      /* Ther
ac30: 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  e must be at lea
ac40: 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69  st one outstandi
ac50: 6e 67 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ng reference to 
ac60: 74 68 65 20 70 61 67 65 72 20 69 66 0a 20 20 20  the pager if.   
ac70: 20 20 20 2a 2a 20 69 6e 20 45 52 52 4f 52 20 73     ** in ERROR s
ac80: 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 20  tate. Otherwise 
ac90: 74 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64  the pager should
aca0: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 72   have already dr
acb0: 6f 70 70 65 64 0a 20 20 20 20 20 20 2a 2a 20 62  opped.      ** b
acc0: 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ack to OPEN stat
acd0: 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
ace0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
acf0: 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
ad00: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
ad10: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61  sert( sqlite3Pca
ad20: 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
ad30: 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 7c  er->pPCache)>0 |
ad40: 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
ad50: 6c 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  le );.      brea
ad60: 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  k;.  }..  return
ad70: 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
ad80: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 2a 2f  ifndef NDEBUG */
ad90: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
ada0: 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 52 65 74  DEBUG ./*.** Ret
adb0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
adc0: 20 61 20 68 75 6d 61 6e 20 72 65 61 64 61 62 6c   a human readabl
add0: 65 20 73 74 72 69 6e 67 20 69 6e 20 61 20 73 74  e string in a st
ade0: 61 74 69 63 20 62 75 66 66 65 72 0a 2a 2a 20 63  atic buffer.** c
adf0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 74  ontaining the st
ae00: 61 74 65 20 6f 66 20 74 68 65 20 50 61 67 65 72  ate of the Pager
ae10: 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
ae20: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54  s an argument. T
ae30: 68 69 73 0a 2a 2a 20 69 73 20 69 6e 74 65 6e 64  his.** is intend
ae40: 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 77 69  ed to be used wi
ae50: 74 68 69 6e 20 64 65 62 75 67 67 65 72 73 2e 20  thin debuggers. 
ae60: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 20  For example, as 
ae70: 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a  an alternative.*
ae80: 2a 20 74 6f 20 22 70 72 69 6e 74 20 2a 70 50 61  * to "print *pPa
ae90: 67 65 72 22 20 69 6e 20 67 64 62 3a 0a 2a 2a 0a  ger" in gdb:.**.
aea0: 2a 2a 20 28 67 64 62 29 20 70 72 69 6e 74 66 20  ** (gdb) printf 
aeb0: 22 25 73 22 2c 20 70 72 69 6e 74 5f 70 61 67 65  "%s", print_page
aec0: 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 0a  r_state(pPager).
aed0: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
aee0: 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74 61 74  print_pager_stat
aef0: 65 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 73  e(Pager *p){.  s
af00: 74 61 74 69 63 20 63 68 61 72 20 7a 52 65 74 5b  tatic char zRet[
af10: 31 30 32 34 5d 3b 0a 0a 20 20 73 71 6c 69 74 65  1024];..  sqlite
af20: 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 32 34 2c  3_snprintf(1024,
af30: 20 7a 52 65 74 2c 0a 20 20 20 20 20 20 22 46 69   zRet,.      "Fi
af40: 6c 65 6e 61 6d 65 3a 20 20 20 20 20 20 25 73 5c  lename:      %s\
af50: 6e 22 0a 20 20 20 20 20 20 22 53 74 61 74 65 3a  n".      "State:
af60: 20 20 20 20 20 20 20 20 20 25 73 20 65 72 72 43           %s errC
af70: 6f 64 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20  ode=%d\n".      
af80: 22 4c 6f 63 6b 3a 20 20 20 20 20 20 20 20 20 20  "Lock:          
af90: 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63  %s\n".      "Loc
afa0: 6b 69 6e 67 20 6d 6f 64 65 3a 20 20 6c 6f 63 6b  king mode:  lock
afb0: 69 6e 67 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20  ing_mode=%s\n". 
afc0: 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 20 6d 6f       "Journal mo
afd0: 64 65 3a 20 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  de:  journal_mod
afe0: 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 42  e=%s\n".      "B
aff0: 61 63 6b 69 6e 67 20 73 74 6f 72 65 3a 20 74 65  acking store: te
b000: 6d 70 46 69 6c 65 3d 25 64 20 6d 65 6d 44 62 3d  mpFile=%d memDb=
b010: 25 64 20 75 73 65 4a 6f 75 72 6e 61 6c 3d 25 64  %d useJournal=%d
b020: 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f 75 72 6e  \n".      "Journ
b030: 61 6c 3a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61  al:       journa
b040: 6c 4f 66 66 3d 25 6c 6c 64 20 6a 6f 75 72 6e 61  lOff=%lld journa
b050: 6c 48 64 72 3d 25 6c 6c 64 5c 6e 22 0a 20 20 20  lHdr=%lld\n".   
b060: 20 20 20 22 53 69 7a 65 3a 20 20 20 20 20 20 20     "Size:       
b070: 20 20 20 64 62 73 69 7a 65 3d 25 64 20 64 62 4f     dbsize=%d dbO
b080: 72 69 67 53 69 7a 65 3d 25 64 20 64 62 46 69 6c  rigSize=%d dbFil
b090: 65 53 69 7a 65 3d 25 64 5c 6e 22 0a 20 20 20 20  eSize=%d\n".    
b0a0: 20 20 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65    , p->zFilename
b0b0: 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 53 74 61  .      , p->eSta
b0c0: 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 20  te==PAGER_OPEN  
b0d0: 20 20 20 20 20 20 20 20 20 20 3f 20 22 4f 50 45            ? "OPE
b0e0: 4e 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  N" :.        p->
b0f0: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
b100: 41 44 45 52 20 20 20 20 20 20 20 20 20 20 3f 20  ADER          ? 
b110: 22 52 45 41 44 45 52 22 20 3a 0a 20 20 20 20 20  "READER" :.     
b120: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41     p->eState==PA
b130: 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
b140: 44 20 20 20 3f 20 22 57 52 49 54 45 52 5f 4c 4f  D   ? "WRITER_LO
b150: 43 4b 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20  CKED" :.        
b160: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
b170: 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
b180: 20 3f 20 22 57 52 49 54 45 52 5f 43 41 43 48 45   ? "WRITER_CACHE
b190: 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70  MOD" :.        p
b1a0: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
b1b0: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20  WRITER_DBMOD    
b1c0: 3f 20 22 57 52 49 54 45 52 5f 44 42 4d 4f 44 22  ? "WRITER_DBMOD"
b1d0: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
b1e0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
b1f0: 45 52 5f 46 49 4e 49 53 48 45 44 20 3f 20 22 57  ER_FINISHED ? "W
b200: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 22 20  RITER_FINISHED" 
b210: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  :.        p->eSt
b220: 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate==PAGER_ERROR
b230: 20 20 20 20 20 20 20 20 20 20 20 3f 20 22 45 52             ? "ER
b240: 52 4f 52 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22  ROR" : "?error?"
b250: 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d  .      , (int)p-
b260: 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20 2c  >errCode.      ,
b270: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f   p->eLock==NO_LO
b280: 43 4b 20 20 20 20 20 20 20 20 20 3f 20 22 4e 4f  CK         ? "NO
b290: 5f 4c 4f 43 4b 22 20 3a 0a 20 20 20 20 20 20 20  _LOCK" :.       
b2a0: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52   p->eLock==RESER
b2b0: 56 45 44 5f 4c 4f 43 4b 20 20 20 3f 20 22 52 45  VED_LOCK   ? "RE
b2c0: 53 45 52 56 45 44 22 20 3a 0a 20 20 20 20 20 20  SERVED" :.      
b2d0: 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c    p->eLock==EXCL
b2e0: 55 53 49 56 45 5f 4c 4f 43 4b 20 20 3f 20 22 45  USIVE_LOCK  ? "E
b2f0: 58 43 4c 55 53 49 56 45 22 20 3a 0a 20 20 20 20  XCLUSIVE" :.    
b300: 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 53 48      p->eLock==SH
b310: 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 3f 20  ARED_LOCK     ? 
b320: 22 53 48 41 52 45 44 22 20 3a 0a 20 20 20 20 20  "SHARED" :.     
b330: 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b     p->eLock==UNK
b340: 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 3f 20 22  NOWN_LOCK    ? "
b350: 55 4e 4b 4e 4f 57 4e 22 20 3a 20 22 3f 65 72 72  UNKNOWN" : "?err
b360: 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e  or?".      , p->
b370: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3f 20  exclusiveMode ? 
b380: 22 65 78 63 6c 75 73 69 76 65 22 20 3a 20 22 6e  "exclusive" : "n
b390: 6f 72 6d 61 6c 22 0a 20 20 20 20 20 20 2c 20 70  ormal".      , p
b3a0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
b3b0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
b3c0: 5f 4d 45 4d 4f 52 59 20 20 20 3f 20 22 6d 65 6d  _MEMORY   ? "mem
b3d0: 6f 72 79 22 20 3a 0a 20 20 20 20 20 20 20 20 70  ory" :.        p
b3e0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
b3f0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
b400: 5f 4f 46 46 20 20 20 20 20 20 3f 20 22 6f 66 66  _OFF      ? "off
b410: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a  " :.        p->j
b420: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
b430: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
b440: 4c 45 54 45 20 20 20 3f 20 22 64 65 6c 65 74 65  LETE   ? "delete
b450: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a  " :.        p->j
b460: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
b470: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
b480: 52 53 49 53 54 20 20 3f 20 22 70 65 72 73 69 73  RSIST  ? "persis
b490: 74 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  t" :.        p->
b4a0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
b4b0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
b4c0: 52 55 4e 43 41 54 45 20 3f 20 22 74 72 75 6e 63  RUNCATE ? "trunc
b4d0: 61 74 65 22 20 3a 0a 20 20 20 20 20 20 20 20 70  ate" :.        p
b4e0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
b4f0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
b500: 5f 57 41 4c 20 20 20 20 20 20 3f 20 22 77 61 6c  _WAL      ? "wal
b510: 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20  " : "?error?".  
b520: 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 74 65      , (int)p->te
b530: 6d 70 46 69 6c 65 2c 20 28 69 6e 74 29 70 2d 3e  mpFile, (int)p->
b540: 6d 65 6d 44 62 2c 20 28 69 6e 74 29 70 2d 3e 75  memDb, (int)p->u
b550: 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  seJournal.      
b560: 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  , p->journalOff,
b570: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20   p->journalHdr. 
b580: 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 64       , (int)p->d
b590: 62 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64  bSize, (int)p->d
b5a0: 62 4f 72 69 67 53 69 7a 65 2c 20 28 69 6e 74 29  bOrigSize, (int)
b5b0: 70 2d 3e 64 62 46 69 6c 65 53 69 7a 65 0a 20 20  p->dbFileSize.  
b5c0: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 7a 52 65  );..  return zRe
b5d0: 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  t;.}.#endif../* 
b5e0: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
b5f0: 65 73 20 74 6f 20 74 68 65 20 76 61 72 69 6f 75  es to the variou
b600: 73 20 70 61 67 65 20 67 65 74 74 65 72 73 20 2a  s page getters *
b610: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
b620: 50 61 67 65 4e 6f 72 6d 61 6c 28 50 61 67 65 72  PageNormal(Pager
b630: 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65 2a 2a 2c  *,Pgno,DbPage**,
b640: 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  int);.static int
b650: 20 67 65 74 50 61 67 65 45 72 72 6f 72 28 50 61   getPageError(Pa
b660: 67 65 72 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65  ger*,Pgno,DbPage
b670: 2a 2a 2c 69 6e 74 29 3b 0a 23 69 66 20 53 51 4c  **,int);.#if SQL
b680: 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
b690: 45 3e 30 0a 73 74 61 74 69 63 20 69 6e 74 20 67  E>0.static int g
b6a0: 65 74 50 61 67 65 4d 4d 61 70 28 50 61 67 65 72  etPageMMap(Pager
b6b0: 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65 2a 2a 2c  *,Pgno,DbPage**,
b6c0: 69 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  int);.#endif../*
b6d0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 50 61 67 65  .** Set the Page
b6e0: 72 2e 78 47 65 74 20 6d 65 74 68 6f 64 20 66 6f  r.xGet method fo
b6f0: 72 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  r the appropriat
b700: 65 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20 74  e routine used t
b710: 6f 20 66 65 74 63 68 0a 2a 2a 20 63 6f 6e 74 65  o fetch.** conte
b720: 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  nt from the page
b730: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
b740: 64 20 73 65 74 47 65 74 74 65 72 4d 65 74 68 6f  d setGetterMetho
b750: 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  d(Pager *pPager)
b760: 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  {.  if( pPager->
b770: 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 70  errCode ){.    p
b780: 50 61 67 65 72 2d 3e 78 47 65 74 20 3d 20 67 65  Pager->xGet = ge
b790: 74 50 61 67 65 45 72 72 6f 72 3b 0a 23 69 66 20  tPageError;.#if 
b7a0: 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
b7b0: 53 49 5a 45 3e 30 0a 20 20 7d 65 6c 73 65 20 69  SIZE>0.  }else i
b7c0: 66 28 20 55 53 45 46 45 54 43 48 28 70 50 61 67  f( USEFETCH(pPag
b7d0: 65 72 29 0a 23 69 66 64 65 66 20 53 51 4c 49 54  er).#ifdef SQLIT
b7e0: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 26  E_HAS_CODEC.   &
b7f0: 26 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63  & pPager->xCodec
b800: 3d 3d 30 0a 23 65 6e 64 69 66 0a 20 20 29 7b 0a  ==0.#endif.  ){.
b810: 20 20 20 20 70 50 61 67 65 72 2d 3e 78 47 65 74      pPager->xGet
b820: 20 3d 20 67 65 74 50 61 67 65 4d 4d 61 70 3b 0a   = getPageMMap;.
b830: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
b840: 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
b850: 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
b860: 20 70 50 61 67 65 72 2d 3e 78 47 65 74 20 3d 20   pPager->xGet = 
b870: 67 65 74 50 61 67 65 4e 6f 72 6d 61 6c 3b 0a 20  getPageNormal;. 
b880: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
b890: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 69 73  rn true if it is
b8a0: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72   necessary to wr
b8b0: 69 74 65 20 70 61 67 65 20 2a 70 50 67 20 69 6e  ite page *pPg in
b8c0: 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
b8d0: 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e 65  al..** A page ne
b8e0: 65 64 73 20 74 6f 20 62 65 20 77 72 69 74 74 65  eds to be writte
b8f0: 6e 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a  n into the sub-j
b900: 6f 75 72 6e 61 6c 20 69 66 20 74 68 65 72 65 20  ournal if there 
b910: 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72  exists one.** or
b920: 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76 65 70   more open savep
b930: 6f 69 6e 74 73 20 66 6f 72 20 77 68 69 63 68 3a  oints for which:
b940: 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70  .**.**   * The p
b950: 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c 65  age-number is le
b960: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
b970: 20 74 6f 20 50 61 67 65 72 53 61 76 65 70 6f 69   to PagerSavepoi
b980: 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a  nt.nOrig, and.**
b990: 20 20 20 2a 20 54 68 65 20 62 69 74 20 63 6f 72     * The bit cor
b9a0: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
b9b0: 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73  e page-number is
b9c0: 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20 20   not set in.**  
b9d0: 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
b9e0: 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e 0a  t.pInSavepoint..
b9f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75  */.static int su
ba00: 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 50  bjRequiresPage(P
ba10: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
ba20: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
ba30: 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 61 67  g->pPager;.  Pag
ba40: 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 3b 0a  erSavepoint *p;.
ba50: 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50    Pgno pgno = pP
ba60: 67 2d 3e 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 69  g->pgno;.  int i
ba70: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
ba80: 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
ba90: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d  t; i++){.    p =
baa0: 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70   &pPager->aSavep
bab0: 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28  oint[i];.    if(
bac0: 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20   p->nOrig>=pgno 
bad0: 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 42 69 74  && 0==sqlite3Bit
bae0: 76 65 63 54 65 73 74 4e 6f 74 4e 75 6c 6c 28 70  vecTestNotNull(p
baf0: 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20  ->pInSavepoint, 
bb00: 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 72  pgno) ){.      r
bb10: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
bb20: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
bb30: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
bb40: 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75  DEBUG./*.** Retu
bb50: 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 70  rn true if the p
bb60: 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  age is already i
bb70: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
bb80: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
bb90: 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28  t pageInJournal(
bba0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
bbb0: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 72 65  gHdr *pPg){.  re
bbc0: 74 75 72 6e 20 73 71 6c 69 74 65 33 42 69 74 76  turn sqlite3Bitv
bbd0: 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70  ecTest(pPager->p
bbe0: 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e  InJournal, pPg->
bbf0: 70 67 6e 6f 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  pgno);.}.#endif.
bc00: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32  ./*.** Read a 32
bc10: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f  -bit integer fro
bc20: 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65  m the given file
bc30: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74   descriptor.  St
bc40: 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a  ore the integer.
bc50: 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61 64 20  ** that is read 
bc60: 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72  in *pRes.  Retur
bc70: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
bc80: 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64  verything worked
bc90: 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  , or an.** error
bca0: 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69   code is somethi
bcb0: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a  ng goes wrong..*
bcc0: 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20  *.** All values 
bcd0: 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69  are stored on di
bce0: 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e  sk as big-endian
bcf0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
bd00: 72 65 61 64 33 32 62 69 74 73 28 73 71 6c 69 74  read32bits(sqlit
bd10: 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
bd20: 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a 70 52   offset, u32 *pR
bd30: 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  es){.  unsigned 
bd40: 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e  char ac[4];.  in
bd50: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  t rc = sqlite3Os
bd60: 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a  Read(fd, ac, siz
bd70: 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65 74 29  eof(ac), offset)
bd80: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
bd90: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52  TE_OK ){.    *pR
bda0: 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34  es = sqlite3Get4
bdb0: 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20  byte(ac);.  }.  
bdc0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
bdd0: 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62  .** Write a 32-b
bde0: 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20  it integer into 
bdf0: 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20  a string buffer 
be00: 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20 62 79  in big-endian by
be10: 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65  te order..*/.#de
be20: 66 69 6e 65 20 70 75 74 33 32 62 69 74 73 28 41  fine put32bits(A
be30: 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75 74 34  ,B)  sqlite3Put4
be40: 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a  byte((u8*)A,B)..
be50: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33  ./*.** Write a 3
be60: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e  2-bit integer in
be70: 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c  to the given fil
be80: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52  e descriptor.  R
be90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
bea0: 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  ** on success or
beb0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
bec0: 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  s something goes
bed0: 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69   wrong..*/.stati
bee0: 63 20 69 6e 74 20 77 72 69 74 65 33 32 62 69 74  c int write32bit
bef0: 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  s(sqlite3_file *
bf00: 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20  fd, i64 offset, 
bf10: 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68 61 72  u32 val){.  char
bf20: 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62   ac[4];.  put32b
bf30: 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20  its(ac, val);.  
bf40: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73  return sqlite3Os
bf50: 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34 2c  Write(fd, ac, 4,
bf60: 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a   offset);.}../*.
bf70: 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61  ** Unlock the da
bf80: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6c  tabase file to l
bf90: 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63  evel eLock, whic
bfa0: 68 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  h must be either
bfb0: 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72 20 53   NO_LOCK.** or S
bfc0: 48 41 52 45 44 5f 4c 4f 43 4b 2e 20 52 65 67 61  HARED_LOCK. Rega
bfd0: 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
bfe0: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 63 61 6c  r or not the cal
bff0: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a  l to xUnlock().*
c000: 2a 20 73 75 63 63 65 65 64 73 2c 20 73 65 74 20  * succeeds, set 
c010: 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  the Pager.eLock 
c020: 76 61 72 69 61 62 6c 65 20 74 6f 20 6d 61 74 63  variable to matc
c030: 68 20 74 68 65 20 28 61 74 74 65 6d 70 74 65 64  h the (attempted
c040: 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  ) new lock..**.*
c050: 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50 61 67  * Except, if Pag
c060: 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20  er.eLock is set 
c070: 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  to UNKNOWN_LOCK 
c080: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
c090: 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 2c  on is.** called,
c0a0: 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69   do not modify i
c0b0: 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65  t. See the comme
c0c0: 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65  nt above the #de
c0d0: 66 69 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e 4b 4e  fine of .** UNKN
c0e0: 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20  OWN_LOCK for an 
c0f0: 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74  explanation of t
c100: 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  his..*/.static i
c110: 6e 74 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62  nt pagerUnlockDb
c120: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
c130: 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e  int eLock){.  in
c140: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
c150: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  ;..  assert( !pP
c160: 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
c170: 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ode || pPager->e
c180: 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b 20 29 3b 0a 20  Lock==eLock );. 
c190: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
c1a0: 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  NO_LOCK || eLock
c1b0: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
c1c0: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
c1d0: 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 61 67  !=NO_LOCK || pag
c1e0: 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
c1f0: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73 4f  ==0 );.  if( isO
c200: 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
c210: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
c220: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c  Pager->eLock>=eL
c230: 6f 63 6b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ock );.    rc = 
c240: 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f  pPager->noLock ?
c250: 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c   SQLITE_OK : sql
c260: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61  ite3OsUnlock(pPa
c270: 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b  ger->fd, eLock);
c280: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
c290: 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f  >eLock!=UNKNOWN_
c2a0: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  LOCK ){.      pP
c2b0: 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75  ager->eLock = (u
c2c0: 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20  8)eLock;.    }. 
c2d0: 20 20 20 49 4f 54 52 41 43 45 28 28 22 55 4e 4c     IOTRACE(("UNL
c2e0: 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  OCK %p %d\n", pP
c2f0: 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20  ager, eLock)).  
c300: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
c310: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65  ../*.** Lock the
c320: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
c330: 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77  o level eLock, w
c340: 68 69 63 68 20 6d 75 73 74 20 62 65 20 65 69 74  hich must be eit
c350: 68 65 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c  her SHARED_LOCK,
c360: 0a 2a 2a 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  .** RESERVED_LOC
c370: 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c  K or EXCLUSIVE_L
c380: 4f 43 4b 2e 20 49 66 20 74 68 65 20 63 61 6c 6c  OCK. If the call
c390: 65 72 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  er is successful
c3a0: 2c 20 73 65 74 20 74 68 65 0a 2a 2a 20 50 61 67  , set the.** Pag
c3b0: 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c  er.eLock variabl
c3c0: 65 20 74 6f 20 74 68 65 20 6e 65 77 20 6c 6f 63  e to the new loc
c3d0: 6b 69 6e 67 20 73 74 61 74 65 2e 20 0a 2a 2a 0a  king state. .**.
c3e0: 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50 61  ** Except, if Pa
c3f0: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
c400: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
c410: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
c420: 69 6f 6e 20 69 73 20 0a 2a 2a 20 63 61 6c 6c 65  ion is .** calle
c430: 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79  d, do not modify
c440: 20 69 74 20 75 6e 6c 65 73 73 20 74 68 65 20 6e   it unless the n
c450: 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65  ew locking state
c460: 20 69 73 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   is EXCLUSIVE_LO
c470: 43 4b 2e 20 0a 2a 2a 20 53 65 65 20 74 68 65 20  CK. .** See the 
c480: 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68  comment above th
c490: 65 20 23 64 65 66 69 6e 65 20 6f 66 20 55 4e 4b  e #define of UNK
c4a0: 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e  NOWN_LOCK for an
c4b0: 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 0a 2a 2a   explanation .**
c4c0: 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61   of this..*/.sta
c4d0: 74 69 63 20 69 6e 74 20 70 61 67 65 72 4c 6f 63  tic int pagerLoc
c4e0: 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61 67 65  kDb(Pager *pPage
c4f0: 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20  r, int eLock){. 
c500: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
c510: 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
c520: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
c530: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 52 45 53  CK || eLock==RES
c540: 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  ERVED_LOCK || eL
c550: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
c560: 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 61  OCK );.  if( pPa
c570: 67 65 72 2d 3e 65 4c 6f 63 6b 3c 65 4c 6f 63 6b  ger->eLock<eLock
c580: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63   || pPager->eLoc
c590: 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  k==UNKNOWN_LOCK 
c5a0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67  ){.    rc = pPag
c5b0: 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20 53 51 4c  er->noLock ? SQL
c5c0: 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74 65 33  ITE_OK : sqlite3
c5d0: 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  OsLock(pPager->f
c5e0: 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69  d, eLock);.    i
c5f0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
c600: 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f   && (pPager->eLo
c610: 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck!=UNKNOWN_LOCK
c620: 7c 7c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ||eLock==EXCLUSI
c630: 56 45 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20  VE_LOCK) ){.    
c640: 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20    pPager->eLock 
c650: 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20  = (u8)eLock;.   
c660: 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f 43     IOTRACE(("LOC
c670: 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  K %p %d\n", pPag
c680: 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20 20 20  er, eLock)).    
c690: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
c6a0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
c6b0: 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d   function determ
c6c0: 69 6e 65 73 20 77 68 65 74 68 65 72 20 6f 72 20  ines whether or 
c6d0: 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77  not the atomic-w
c6e0: 72 69 74 65 20 6f 72 0a 2a 2a 20 61 74 6f 6d 69  rite or.** atomi
c6f0: 63 2d 62 61 74 63 68 2d 77 72 69 74 65 20 6f 70  c-batch-write op
c700: 74 69 6d 69 7a 61 74 69 6f 6e 73 20 63 61 6e 20  timizations can 
c710: 62 65 20 75 73 65 64 20 77 69 74 68 20 74 68 69  be used with thi
c720: 73 20 70 61 67 65 72 2e 20 54 68 65 0a 2a 2a 20  s pager. The.** 
c730: 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
c740: 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65  imization can be
c750: 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20   used if:.**.** 
c760: 20 28 61 29 20 74 68 65 20 76 61 6c 75 65 20 72   (a) the value r
c770: 65 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65 76  eturned by OsDev
c780: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
c790: 63 73 28 29 20 69 6e 64 69 63 61 74 65 73 20 74  cs() indicates t
c7a0: 68 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64 61  hat.**      a da
c7b0: 74 61 62 61 73 65 20 70 61 67 65 20 6d 61 79 20  tabase page may 
c7c0: 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69  be written atomi
c7d0: 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20 28  cally, and.**  (
c7e0: 62 29 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  b) the value ret
c7f0: 75 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74 6f  urned by OsSecto
c800: 72 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73 20  rSize() is less 
c810: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a  than or equal.**
c820: 20 20 20 20 20 20 74 6f 20 74 68 65 20 70 61 67        to the pag
c830: 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e size..**.** If
c840: 20 69 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c   it can be used,
c850: 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
c860: 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20  returned is the 
c870: 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
c880: 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65  nal .** file whe
c890: 6e 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 72 6f  n it contains ro
c8a0: 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f 72 20  llback data for 
c8b0: 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65  exactly one page
c8c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 74 6f 6d  ..**.** The atom
c8d0: 69 63 2d 62 61 74 63 68 2d 77 72 69 74 65 20 6f  ic-batch-write o
c8e0: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20  ptimization can 
c8f0: 62 65 20 75 73 65 64 20 69 66 20 4f 73 44 65 76  be used if OsDev
c900: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
c910: 63 73 28 29 0a 2a 2a 20 72 65 74 75 72 6e 73 20  cs().** returns 
c920: 61 20 76 61 6c 75 65 20 77 69 74 68 20 74 68 65  a value with the
c930: 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 42 41   SQLITE_IOCAP_BA
c940: 54 43 48 5f 41 54 4f 4d 49 43 20 62 69 74 20 73  TCH_ATOMIC bit s
c950: 65 74 2e 20 2d 31 20 69 73 0a 2a 2a 20 72 65 74  et. -1 is.** ret
c960: 75 72 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61  urned in this ca
c970: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65 69  se..**.** If nei
c980: 74 68 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ther optimizatio
c990: 6e 20 63 61 6e 20 62 65 20 75 73 65 64 2c 20 30  n can be used, 0
c9a0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
c9b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c  .static int jrnl
c9c0: 42 75 66 66 65 72 53 69 7a 65 28 50 61 67 65 72  BufferSize(Pager
c9d0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73   *pPager){.  ass
c9e0: 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 0a  ert( !MEMDB );..
c9f0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
ca00: 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
ca10: 5f 57 52 49 54 45 29 20 5c 0a 20 7c 7c 20 64 65  _WRITE) \. || de
ca20: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
ca30: 42 4c 45 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43  BLE_BATCH_ATOMIC
ca40: 5f 57 52 49 54 45 29 0a 20 20 69 6e 74 20 64 63  _WRITE).  int dc
ca50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ca60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
ca70: 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69  evice characteri
ca80: 73 74 69 63 73 20 2a 2f 0a 0a 20 20 61 73 73 65  stics */..  asse
ca90: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
caa0: 72 2d 3e 66 64 29 20 29 3b 0a 20 20 64 63 20 3d  r->fd) );.  dc =
cab0: 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
cac0: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
cad0: 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 23 65 6c  pPager->fd);.#el
cae0: 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  se.  UNUSED_PARA
caf0: 4d 45 54 45 52 28 70 50 61 67 65 72 29 3b 0a 23  METER(pPager);.#
cb00: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
cb10: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 42 41 54 43  LITE_ENABLE_BATC
cb20: 48 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20  H_ATOMIC_WRITE. 
cb30: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
cb40: 69 7a 65 3e 30 20 26 26 20 28 64 63 26 53 51 4c  ize>0 && (dc&SQL
cb50: 49 54 45 5f 49 4f 43 41 50 5f 42 41 54 43 48 5f  ITE_IOCAP_BATCH_
cb60: 41 54 4f 4d 49 43 29 20 29 7b 0a 20 20 20 20 72  ATOMIC) ){.    r
cb70: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 23 65  eturn -1;.  }.#e
cb80: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
cb90: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
cba0: 43 5f 57 52 49 54 45 0a 20 20 7b 0a 20 20 20 20  C_WRITE.  {.    
cbb0: 69 6e 74 20 6e 53 65 63 74 6f 72 20 3d 20 70 50  int nSector = pP
cbc0: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
cbd0: 3b 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67 65  ;.    int szPage
cbe0: 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
cbf0: 69 7a 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  ize;..    assert
cc00: 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
cc10: 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38  OMIC512==(512>>8
cc20: 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 53  ));.    assert(S
cc30: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
cc40: 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38  IC64K==(65536>>8
cc50: 29 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28  ));.    if( 0==(
cc60: 64 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  dc&(SQLITE_IOCAP
cc70: 5f 41 54 4f 4d 49 43 7c 28 73 7a 50 61 67 65 3e  _ATOMIC|(szPage>
cc80: 3e 38 29 29 20 7c 7c 20 6e 53 65 63 74 6f 72 3e  >8)) || nSector>
cc90: 73 7a 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20  szPage) ){.     
cca0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
ccb0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 4a  .  }..  return J
ccc0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
ccd0: 61 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f  ager) + JOURNAL_
cce0: 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 23  PG_SZ(pPager);.#
ccf0: 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
cd00: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53  0;.}../*.** If S
cd10: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
cd20: 53 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65  S is defined the
cd30: 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e  n we do some san
cd40: 69 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20  ity checking.** 
cd50: 6f 6e 20 74 68 65 20 63 61 63 68 65 20 75 73 69  on the cache usi
cd60: 6e 67 20 61 20 68 61 73 68 20 66 75 6e 63 74 69  ng a hash functi
cd70: 6f 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  on.  This is use
cd80: 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a  d for testing.**
cd90: 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f   and debugging o
cda0: 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  nly..*/.#ifdef S
cdb0: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
cdc0: 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  S./*.** Return a
cdd0: 20 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20   32-bit hash of 
cde0: 74 68 65 20 70 61 67 65 20 64 61 74 61 20 66 6f  the page data fo
cdf0: 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  r pPage..*/.stat
ce00: 69 63 20 75 33 32 20 70 61 67 65 72 5f 64 61 74  ic u32 pager_dat
ce10: 61 68 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c  ahash(int nByte,
ce20: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
ce30: 70 44 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61  pData){.  u32 ha
ce40: 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  sh = 0;.  int i;
ce50: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42  .  for(i=0; i<nB
ce60: 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68  yte; i++){.    h
ce70: 61 73 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39  ash = (hash*1039
ce80: 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20  ) + pData[i];.  
ce90: 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b  }.  return hash;
cea0: 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  .}.static u32 pa
ceb0: 67 65 72 5f 70 61 67 65 68 61 73 68 28 50 67 48  ger_pagehash(PgH
cec0: 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65  dr *pPage){.  re
ced0: 74 75 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68  turn pager_datah
cee0: 61 73 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65  ash(pPage->pPage
cef0: 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 6e  r->pageSize, (un
cf00: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 50  signed char *)pP
cf10: 61 67 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 73  age->pData);.}.s
cf20: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
cf30: 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 50 67  _set_pagehash(Pg
cf40: 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 70  Hdr *pPage){.  p
cf50: 50 61 67 65 2d 3e 70 61 67 65 48 61 73 68 20 3d  Page->pageHash =
cf60: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
cf70: 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pPage);.}../*.**
cf80: 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20   The CHECK_PAGE 
cf90: 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67  macro takes a Pg
cfa0: 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d  Hdr* as an argum
cfb0: 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43  ent. If SQLITE_C
cfc0: 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73  HECK_PAGES.** is
cfd0: 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44   defined, and ND
cfe0: 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69  EBUG is not defi
cff0: 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29  ned, an assert()
d000: 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b   statement check
d010: 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61  s.** that the pa
d020: 67 65 20 69 73 20 65 69 74 68 65 72 20 64 69 72  ge is either dir
d030: 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63  ty or still matc
d040: 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74  hes the calculat
d050: 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f  ed page-hash..*/
d060: 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50  .#define CHECK_P
d070: 41 47 45 28 78 29 20 63 68 65 63 6b 50 61 67 65  AGE(x) checkPage
d080: 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  (x).static void 
d090: 63 68 65 63 6b 50 61 67 65 28 50 67 48 64 72 20  checkPage(PgHdr 
d0a0: 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
d0b0: 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
d0c0: 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20  ager;.  assert( 
d0d0: 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
d0e0: 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20  PAGER_ERROR );. 
d0f0: 20 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66   assert( (pPg->f
d100: 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
d110: 29 20 7c 7c 20 70 50 67 2d 3e 70 61 67 65 48 61  ) || pPg->pageHa
d120: 73 68 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61  sh==pager_pageha
d130: 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65  sh(pPg) );.}..#e
d140: 6c 73 65 0a 23 64 65 66 69 6e 65 20 70 61 67 65  lse.#define page
d150: 72 5f 64 61 74 61 68 61 73 68 28 58 2c 59 29 20  r_datahash(X,Y) 
d160: 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72   0.#define pager
d170: 5f 70 61 67 65 68 61 73 68 28 58 29 20 20 30 0a  _pagehash(X)  0.
d180: 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 73 65  #define pager_se
d190: 74 5f 70 61 67 65 68 61 73 68 28 58 29 0a 23 64  t_pagehash(X).#d
d1a0: 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45  efine CHECK_PAGE
d1b0: 28 78 29 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53  (x).#endif  /* S
d1c0: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
d1d0: 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e  S */../*.** When
d1e0: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   this is called 
d1f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
d200: 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65   for pager pPage
d210: 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a  r must be open..
d220: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
d230: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 61   attempts to rea
d240: 64 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  d a master journ
d250: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 66 72 6f  al file name fro
d260: 6d 20 74 68 65 20 0a 2a 2a 20 65 6e 64 20 6f 66  m the .** end of
d270: 20 74 68 65 20 66 69 6c 65 20 61 6e 64 2c 20 69   the file and, i
d280: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 63 6f  f successful, co
d290: 70 69 65 73 20 69 74 20 69 6e 74 6f 20 6d 65 6d  pies it into mem
d2a0: 6f 72 79 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a  ory supplied .**
d2b0: 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20   by the caller. 
d2c0: 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f  See comments abo
d2d0: 76 65 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f  ve writeMasterJo
d2e0: 75 72 6e 61 6c 28 29 20 66 6f 72 20 74 68 65 20  urnal() for the 
d2f0: 66 6f 72 6d 61 74 0a 2a 2a 20 75 73 65 64 20 74  format.** used t
d300: 6f 20 73 74 6f 72 65 20 61 20 6d 61 73 74 65 72  o store a master
d310: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
d320: 6d 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  me at the end of
d330: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
d340: 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d  .**.** zMaster m
d350: 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62  ust point to a b
d360: 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73  uffer of at leas
d370: 74 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20  t nMaster bytes 
d380: 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20  allocated by.** 
d390: 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 69 73  the caller. This
d3a0: 20 73 68 6f 75 6c 64 20 62 65 20 73 71 6c 69 74   should be sqlit
d3b0: 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d  e3_vfs.mxPathnam
d3c0: 65 2b 31 20 28 74 6f 20 65 6e 73 75 72 65 20 74  e+1 (to ensure t
d3d0: 68 65 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67  here is.** enoug
d3e0: 68 20 73 70 61 63 65 20 74 6f 20 77 72 69 74 65  h space to write
d3f0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
d400: 6e 61 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74 68  nal name). If th
d410: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
d420: 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  .** name in the 
d430: 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65  journal is longe
d440: 72 20 74 68 61 6e 20 6e 4d 61 73 74 65 72 20 62  r than nMaster b
d450: 79 74 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20  ytes (including 
d460: 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  a.** nul-termina
d470: 74 6f 72 29 2c 20 74 68 65 6e 20 74 68 69 73 20  tor), then this 
d480: 69 73 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66  is handled as if
d490: 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
d4a0: 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20  al name.** were 
d4b0: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 6a  present in the j
d4c0: 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
d4d0: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
d4e0: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70  l file name is p
d4f0: 72 65 73 65 6e 74 20 61 74 20 74 68 65 20 65 6e  resent at the en
d500: 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d of the journal
d510: 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 69  .** file, then i
d520: 74 20 69 73 20 63 6f 70 69 65 64 20 69 6e 74 6f  t is copied into
d530: 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e   the buffer poin
d540: 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65  ted to by zMaste
d550: 72 2e 20 41 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d  r. A.** nul-term
d560: 69 6e 61 74 6f 72 20 62 79 74 65 20 69 73 20 61  inator byte is a
d570: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 62  ppended to the b
d580: 75 66 66 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20  uffer following 
d590: 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f  the master.** jo
d5a0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 2e  urnal file name.
d5b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20  .**.** If it is 
d5c0: 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20  determined that 
d5d0: 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
d5e0: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70  l file name is p
d5f0: 72 65 73 65 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74  resent .** zMast
d600: 65 72 5b 30 5d 20 69 73 20 73 65 74 20 74 6f 20  er[0] is set to 
d610: 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  0 and SQLITE_OK 
d620: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
d630: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
d640: 72 73 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67  rs while reading
d650: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
d660: 6c 20 66 69 6c 65 2c 20 61 6e 20 53 51 4c 69 74  l file, an SQLit
d670: 65 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20  e.** error code 
d680: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
d690: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d  static int readM
d6a0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c  asterJournal(sql
d6b0: 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c  ite3_file *pJrnl
d6c0: 2c 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c  , char *zMaster,
d6d0: 20 75 33 32 20 6e 4d 61 73 74 65 72 29 7b 0a 20   u32 nMaster){. 
d6e0: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
d6f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
d700: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
d710: 75 33 32 20 6c 65 6e 3b 20 20 20 20 20 20 20 20  u32 len;        
d720: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
d730: 6e 67 74 68 20 69 6e 20 62 79 74 65 73 20 6f 66  ngth in bytes of
d740: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
d750: 6e 61 6d 65 20 2a 2f 0a 20 20 69 36 34 20 73 7a  name */.  i64 sz
d760: 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
d770: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69       /* Total si
d780: 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6a  ze in bytes of j
d790: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 70 4a 72 6e  ournal file pJrn
d7a0: 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  l */.  u32 cksum
d7b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d7c0: 20 20 2f 2a 20 4d 4a 20 63 68 65 63 6b 73 75 6d    /* MJ checksum
d7d0: 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
d7e0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33   journal */.  u3
d7f0: 32 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20  2 u;            
d800: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69           /* Unsi
d810: 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65  gned loop counte
d820: 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  r */.  unsigned 
d830: 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20  char aMagic[8]; 
d840: 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f    /* A buffer to
d850: 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20   hold the magic 
d860: 68 65 61 64 65 72 20 2a 2f 0a 20 20 7a 4d 61 73  header */.  zMas
d870: 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a  ter[0] = '\0';..
d880: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
d890: 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
d8a0: 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20  FileSize(pJrnl, 
d8b0: 26 73 7a 4a 29 29 0a 20 20 20 7c 7c 20 73 7a 4a  &szJ)).   || szJ
d8c0: 3c 31 36 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  <16.   || SQLITE
d8d0: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
d8e0: 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a  2bits(pJrnl, szJ
d8f0: 2d 31 36 2c 20 26 6c 65 6e 29 29 0a 20 20 20 7c  -16, &len)).   |
d900: 7c 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a  | len>=nMaster .
d910: 20 20 20 7c 7c 20 6c 65 6e 3e 73 7a 4a 2d 31 36     || len>szJ-16
d920: 0a 20 20 20 7c 7c 20 6c 65 6e 3d 3d 30 20 0a 20  .   || len==0 . 
d930: 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
d940: 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73  (rc = read32bits
d950: 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20  (pJrnl, szJ-12, 
d960: 26 63 6b 73 75 6d 29 29 0a 20 20 20 7c 7c 20 53  &cksum)).   || S
d970: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
d980: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a  sqlite3OsRead(pJ
d990: 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20  rnl, aMagic, 8, 
d9a0: 73 7a 4a 2d 38 29 29 0a 20 20 20 7c 7c 20 6d 65  szJ-8)).   || me
d9b0: 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f  mcmp(aMagic, aJo
d9c0: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 0a 20  urnalMagic, 8). 
d9d0: 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
d9e0: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52  (rc = sqlite3OsR
d9f0: 65 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74  ead(pJrnl, zMast
da00: 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d  er, len, szJ-16-
da10: 6c 65 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  len)).  ){.    r
da20: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
da30: 20 2f 2a 20 53 65 65 20 69 66 20 74 68 65 20 63   /* See if the c
da40: 68 65 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20  hecksum matches 
da50: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
da60: 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72  al name */.  for
da70: 28 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b 2b  (u=0; u<len; u++
da80: 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20  ){.    cksum -= 
da90: 7a 4d 61 73 74 65 72 5b 75 5d 3b 0a 20 20 7d 0a  zMaster[u];.  }.
daa0: 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20    if( cksum ){. 
dab0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65     /* If the che
dac0: 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64  cksum doesn't ad
dad0: 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f  d up, then one o
dae0: 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69  r more of the di
daf0: 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a  sk sectors.    *
db00: 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
db10: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
db20: 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72  filename is corr
db30: 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e  upted. This mean
db40: 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74  s.    ** definit
db50: 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73  ely roll back, s
db60: 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51  o just return SQ
db70: 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f  LITE_OK and repo
db80: 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a  rt a (nul).    *
db90: 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  * master-journal
dba0: 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a   filename..    *
dbb0: 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20  /.    len = 0;. 
dbc0: 20 7d 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e   }.  zMaster[len
dbd0: 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 0a 20 20  ] = '\0';.   .  
dbe0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
dbf0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
dc00: 6e 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20  n the offset of 
dc10: 74 68 65 20 73 65 63 74 6f 72 20 62 6f 75 6e 64  the sector bound
dc20: 61 72 79 20 61 74 20 6f 72 20 69 6d 6d 65 64 69  ary at or immedi
dc30: 61 74 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c 6f 77  ately .** follow
dc40: 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 69 6e  ing the value in
dc50: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
dc60: 4f 66 66 2c 20 61 73 73 75 6d 69 6e 67 20 61 20  Off, assuming a 
dc70: 73 65 63 74 6f 72 20 0a 2a 2a 20 73 69 7a 65 20  sector .** size 
dc80: 6f 66 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  of pPager->secto
dc90: 72 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a  rSize bytes..**.
dca0: 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63  ** i.e for a sec
dcb0: 74 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a  tor size of 512:
dcc0: 0a 2a 2a 0a 2a 2a 20 20 20 50 61 67 65 72 2e 6a  .**.**   Pager.j
dcd0: 6f 75 72 6e 61 6c 4f 66 66 20 20 20 20 20 20 20  ournalOff       
dce0: 20 20 20 52 65 74 75 72 6e 20 76 61 6c 75 65 0a     Return value.
dcf0: 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  **   -----------
dd00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dd10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
dd20: 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
dd30: 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a              0.**
dd40: 20 20 20 35 31 32 20 20 20 20 20 20 20 20 20 20     512          
dd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32               512
dd60: 0a 2a 2a 20 20 20 31 30 30 20 20 20 20 20 20 20  .**   100       
dd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd80: 35 31 32 0a 2a 2a 20 20 20 32 30 30 30 20 20 20  512.**   2000   
dd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dda0: 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73     2048.** .*/.s
ddb0: 74 61 74 69 63 20 69 36 34 20 6a 6f 75 72 6e 61  tatic i64 journa
ddc0: 6c 48 64 72 4f 66 66 73 65 74 28 50 61 67 65 72  lHdrOffset(Pager
ddd0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34   *pPager){.  i64
dde0: 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69   offset = 0;.  i
ddf0: 36 34 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a  64 c = pPager->j
de00: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28  ournalOff;.  if(
de10: 20 63 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74   c ){.    offset
de20: 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41   = ((c-1)/JOURNA
de30: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
de40: 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f   + 1) * JOURNAL_
de50: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  HDR_SZ(pPager);.
de60: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66    }.  assert( of
de70: 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52  fset%JOURNAL_HDR
de80: 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29  _SZ(pPager)==0 )
de90: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  ;.  assert( offs
dea0: 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72  et>=c );.  asser
deb0: 74 28 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f  t( (offset-c)<JO
dec0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
ded0: 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  ger) );.  return
dee0: 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a   offset;.}../*.*
def0: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
df00: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
df10: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
df20: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  on is called..**
df30: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
df40: 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  n is a no-op if 
df50: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
df60: 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 77 72   has not been wr
df70: 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 77 69 74 68  itten to.** with
df80: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  in the current t
df90: 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 2e 65 2e  ransaction (i.e.
dfa0: 20 69 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61   if Pager.journa
dfb0: 6c 4f 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20  lOff==0)..**.** 
dfc0: 49 66 20 64 6f 54 72 75 6e 63 61 74 65 20 69 73  If doTruncate is
dfd0: 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74 68 65   non-zero or the
dfe0: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69   Pager.journalSi
dff0: 7a 65 4c 69 6d 69 74 20 76 61 72 69 61 62 6c 65  zeLimit variable
e000: 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2c   is.** set to 0,
e010: 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74   then truncate t
e020: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
e030: 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e  to zero bytes in
e040: 20 73 69 7a 65 2e 20 4f 74 68 65 72 77 69 73 65   size. Otherwise
e050: 2c 0a 2a 2a 20 7a 65 72 6f 20 74 68 65 20 32 38  ,.** zero the 28
e060: 2d 62 79 74 65 20 68 65 61 64 65 72 20 61 74 20  -byte header at 
e070: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
e080: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
e090: 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 0a  n either case, .
e0a0: 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 72 20  ** if the pager 
e0b0: 69 73 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e  is not in no-syn
e0c0: 63 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65  c mode, sync the
e0d0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d   journal file im
e0e0: 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 61 66  mediately .** af
e0f0: 74 65 72 20 77 72 69 74 69 6e 67 20 6f 72 20 74  ter writing or t
e100: 72 75 6e 63 61 74 69 6e 67 20 69 74 2e 0a 2a 2a  runcating it..**
e110: 0a 2a 2a 20 49 66 20 50 61 67 65 72 2e 6a 6f 75  .** If Pager.jou
e120: 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 69 73  rnalSizeLimit is
e130: 20 73 65 74 20 74 6f 20 61 20 70 6f 73 69 74 69   set to a positi
e140: 76 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  ve, non-zero val
e150: 75 65 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f  ue, and.** follo
e160: 77 69 6e 67 20 74 68 65 20 74 72 75 6e 63 61 74  wing the truncat
e170: 69 6f 6e 20 6f 72 20 7a 65 72 6f 69 6e 67 20 64  ion or zeroing d
e180: 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 20 74  escribed above t
e190: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a  he size of the .
e1a0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
e1b0: 69 6e 20 62 79 74 65 73 20 69 73 20 6c 61 72 67  in bytes is larg
e1c0: 65 72 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c  er than this val
e1d0: 75 65 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74  ue, then truncat
e1e0: 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  e the.** journal
e1f0: 20 66 69 6c 65 20 74 6f 20 50 61 67 65 72 2e 6a   file to Pager.j
e200: 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20  ournalSizeLimit 
e210: 62 79 74 65 73 2e 20 54 68 65 20 6a 6f 75 72 6e  bytes. The journ
e220: 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20  al file does.** 
e230: 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 73  not need to be s
e240: 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20  ynced following 
e250: 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  this operation..
e260: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65  **.** If an IO e
e270: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 62 61  rror occurs, aba
e280: 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  ndon processing 
e290: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 49  and return the I
e2a0: 4f 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a  O error code..**
e2b0: 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
e2c0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  rn SQLITE_OK..*/
e2d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 7a 65 72 6f  .static int zero
e2e0: 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72  JournalHdr(Pager
e2f0: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 64 6f   *pPager, int do
e300: 54 72 75 6e 63 61 74 65 29 7b 0a 20 20 69 6e 74  Truncate){.  int
e310: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
e320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e340: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
e350: 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
e360: 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
e370: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73 71 6c  ;.  assert( !sql
e380: 69 74 65 33 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d  ite3JournalIsInM
e390: 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 6a 66  emory(pPager->jf
e3a0: 64 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  d) );.  if( pPag
e3b0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
e3c0: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 36 34 20  {.    const i64 
e3d0: 69 4c 69 6d 69 74 20 3d 20 70 50 61 67 65 72 2d  iLimit = pPager-
e3e0: 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  >journalSizeLimi
e3f0: 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63  t;    /* Local c
e400: 61 63 68 65 20 6f 66 20 6a 73 6c 20 2a 2f 0a 0a  ache of jsl */..
e410: 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 5a      IOTRACE(("JZ
e420: 45 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20 70 50  EROHDR %p\n", pP
e430: 61 67 65 72 29 29 0a 20 20 20 20 69 66 28 20 64  ager)).    if( d
e440: 6f 54 72 75 6e 63 61 74 65 20 7c 7c 20 69 4c 69  oTruncate || iLi
e450: 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  mit==0 ){.      
e460: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
e470: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
e480: 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  fd, 0);.    }els
e490: 65 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  e{.      static 
e4a0: 63 6f 6e 73 74 20 63 68 61 72 20 7a 65 72 6f 48  const char zeroH
e4b0: 64 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a 20 20  dr[28] = {0};.  
e4c0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e4d0: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
e4e0: 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20 73 69  jfd, zeroHdr, si
e4f0: 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c 20 30  zeof(zeroHdr), 0
e500: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
e510: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
e520: 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  & !pPager->noSyn
e530: 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  c ){.      rc = 
e540: 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
e550: 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54  ager->jfd, SQLIT
e560: 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 7c  E_SYNC_DATAONLY|
e570: 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
e580: 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  s);.    }..    /
e590: 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
e5a0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
e5b0: 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 62 75 74  is committed but
e5c0: 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
e5d0: 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c  .    ** is still
e5e0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c   held on the fil
e5f0: 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  e. If there is a
e600: 20 73 69 7a 65 20 6c 69 6d 69 74 20 63 6f 6e 66   size limit conf
e610: 69 67 75 72 65 64 20 66 6f 72 20 0a 20 20 20 20  igured for .    
e620: 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  ** the persisten
e630: 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  t journal and th
e640: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  e journal file c
e650: 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 75 6d 65  urrently consume
e660: 73 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20 73 70  s more.    ** sp
e670: 61 63 65 20 74 68 61 6e 20 74 68 61 74 20 6c 69  ace than that li
e680: 6d 69 74 20 61 6c 6c 6f 77 73 20 66 6f 72 2c 20  mit allows for, 
e690: 74 72 75 6e 63 61 74 65 20 69 74 20 6e 6f 77 2e  truncate it now.
e6a0: 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   There is no nee
e6b0: 64 0a 20 20 20 20 2a 2a 20 74 6f 20 73 79 6e 63  d.    ** to sync
e6c0: 20 74 68 65 20 66 69 6c 65 20 66 6f 6c 6c 6f 77   the file follow
e6d0: 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74 69  ing this operati
e6e0: 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
e6f0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
e700: 20 26 26 20 69 4c 69 6d 69 74 3e 30 20 29 7b 0a   && iLimit>0 ){.
e710: 20 20 20 20 20 20 69 36 34 20 73 7a 3b 0a 20 20        i64 sz;.  
e720: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e730: 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
e740: 72 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a 20 20  r->jfd, &sz);.  
e750: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
e760: 54 45 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c 69 6d  TE_OK && sz>iLim
e770: 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  it ){.        rc
e780: 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
e790: 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  cate(pPager->jfd
e7a0: 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  , iLimit);.     
e7b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
e7c0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
e7d0: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
e7e0: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
e7f0: 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
e800: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20  ne is called. A 
e810: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65  journal.** heade
e820: 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  r (JOURNAL_HDR_S
e830: 5a 20 62 79 74 65 73 29 20 69 73 20 77 72 69 74  Z bytes) is writ
e840: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
e850: 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65  rnal file at the
e860: 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  .** current loca
e870: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
e880: 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a  format for the j
e890: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
e8a0: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20   as follows:.** 
e8b0: 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63  - 8 bytes: Magic
e8c0: 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75   identifying jou
e8d0: 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20  rnal format..** 
e8e0: 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65  - 4 bytes: Numbe
e8f0: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20  r of records in 
e900: 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e  journal, or -1 n
e910: 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f  o-sync mode is o
e920: 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  n..** - 4 bytes:
e930: 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75   Random number u
e940: 73 65 64 20 66 6f 72 20 70 61 67 65 20 68 61 73  sed for page has
e950: 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  h..** - 4 bytes:
e960: 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73   Initial databas
e970: 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a  e page count..**
e980: 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63 74   - 4 bytes: Sect
e990: 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62 79 20  or size used by 
e9a0: 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
e9b0: 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72   wrote this jour
e9c0: 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  nal..** - 4 byte
e9d0: 73 3a 20 44 61 74 61 62 61 73 65 20 70 61 67 65  s: Database page
e9e0: 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f   size..** .** Fo
e9f0: 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e  llowed by (JOURN
ea00: 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20  AL_HDR_SZ - 28) 
ea10: 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20  bytes of unused 
ea20: 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  space..*/.static
ea30: 20 69 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61   int writeJourna
ea40: 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67  lHdr(Pager *pPag
ea50: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
ea60: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
ea70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
ea80: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63  turn code */.  c
ea90: 68 61 72 20 2a 7a 48 65 61 64 65 72 20 3d 20 70  har *zHeader = p
eaa0: 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
eab0: 3b 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20  ;  /* Temporary 
eac0: 73 70 61 63 65 20 75 73 65 64 20 74 6f 20 62 75  space used to bu
ead0: 69 6c 64 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  ild header */.  
eae0: 75 33 32 20 6e 48 65 61 64 65 72 20 3d 20 28 75  u32 nHeader = (u
eaf0: 33 32 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  32)pPager->pageS
eb00: 69 7a 65 3b 2f 2a 20 53 69 7a 65 20 6f 66 20 62  ize;/* Size of b
eb10: 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f  uffer pointed to
eb20: 20 62 79 20 7a 48 65 61 64 65 72 20 2a 2f 0a 20   by zHeader */. 
eb30: 20 75 33 32 20 6e 57 72 69 74 65 3b 20 20 20 20   u32 nWrite;    
eb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb50: 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
eb60: 20 68 65 61 64 65 72 20 73 65 63 74 6f 72 20 77   header sector w
eb70: 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  ritten */.  int 
eb80: 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
eb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eba0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
ebb0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73  */..  assert( is
ebc0: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
ebd0: 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75  ) );      /* Jou
ebe0: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
ebf0: 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 69 66  e open. */..  if
ec00: 28 20 6e 48 65 61 64 65 72 3e 4a 4f 55 52 4e 41  ( nHeader>JOURNA
ec10: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
ec20: 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20   ){.    nHeader 
ec30: 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  = JOURNAL_HDR_SZ
ec40: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
ec50: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
ec60: 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
ec70: 74 73 20 61 6e 64 20 61 6e 79 20 6f 66 20 74 68  ts and any of th
ec80: 65 6d 20 77 65 72 65 20 63 72 65 61 74 65 64 20  em were created 
ec90: 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 20  .  ** since the 
eca0: 6d 6f 73 74 20 72 65 63 65 6e 74 20 6a 6f 75 72  most recent jour
ecb0: 6e 61 6c 20 68 65 61 64 65 72 20 77 61 73 20 77  nal header was w
ecc0: 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20 74  ritten, update t
ecd0: 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 53 61  he .  ** PagerSa
ece0: 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73  vepoint.iHdrOffs
ecf0: 65 74 20 66 69 65 6c 64 73 20 6e 6f 77 2e 0a 20  et fields now.. 
ed00: 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20   */.  for(ii=0; 
ed10: 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  ii<pPager->nSave
ed20: 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20  point; ii++){.  
ed30: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 53    if( pPager->aS
ed40: 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64  avepoint[ii].iHd
ed50: 72 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a 20 20  rOffset==0 ){.  
ed60: 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76      pPager->aSav
ed70: 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f  epoint[ii].iHdrO
ed80: 66 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e  ffset = pPager->
ed90: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20  journalOff;.    
eda0: 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d  }.  }..  pPager-
edb0: 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50  >journalHdr = pP
edc0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
edd0: 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66   = journalHdrOff
ede0: 73 65 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  set(pPager);..  
edf0: 2f 2a 20 0a 20 20 2a 2a 20 57 72 69 74 65 20 74  /* .  ** Write t
ee00: 68 65 20 6e 52 65 63 20 46 69 65 6c 64 20 2d 20  he nRec Field - 
ee10: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
ee20: 67 65 20 72 65 63 6f 72 64 73 20 74 68 61 74 20  ge records that 
ee30: 66 6f 6c 6c 6f 77 20 74 68 69 73 0a 20 20 2a 2a  follow this.  **
ee40: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
ee50: 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72 6f 20   Normally, zero 
ee60: 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  is written to th
ee70: 69 73 20 76 61 6c 75 65 20 61 74 20 74 68 69 73  is value at this
ee80: 20 74 69 6d 65 2e 0a 20 20 2a 2a 20 41 66 74 65   time..  ** Afte
ee90: 72 20 74 68 65 20 72 65 63 6f 72 64 73 20 61 72  r the records ar
eea0: 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6a  e added to the j
eeb0: 6f 75 72 6e 61 6c 20 28 61 6e 64 20 74 68 65 20  ournal (and the 
eec0: 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 65 64 2c 20  journal synced, 
eed0: 0a 20 20 2a 2a 20 69 66 20 69 6e 20 66 75 6c 6c  .  ** if in full
eee0: 2d 73 79 6e 63 20 6d 6f 64 65 29 2c 20 74 68 65  -sync mode), the
eef0: 20 7a 65 72 6f 20 69 73 20 6f 76 65 72 77 72 69   zero is overwri
ef00: 74 74 65 6e 20 77 69 74 68 20 74 68 65 20 74 72  tten with the tr
ef10: 75 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f  ue number.  ** o
ef20: 66 20 72 65 63 6f 72 64 73 20 28 73 65 65 20 73  f records (see s
ef30: 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 29 2e 0a 20  yncJournal()).. 
ef40: 20 2a 2a 0a 20 20 2a 2a 20 41 20 66 61 73 74 65   **.  ** A faste
ef50: 72 20 61 6c 74 65 72 6e 61 74 69 76 65 20 69 73  r alternative is
ef60: 20 74 6f 20 77 72 69 74 65 20 30 78 46 46 46 46   to write 0xFFFF
ef70: 46 46 46 46 20 74 6f 20 74 68 65 20 6e 52 65 63  FFFF to the nRec
ef80: 20 66 69 65 6c 64 2e 20 57 68 65 6e 0a 20 20 2a   field. When.  *
ef90: 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20 6a 6f  * reading the jo
efa0: 75 72 6e 61 6c 20 74 68 69 73 20 76 61 6c 75 65  urnal this value
efb0: 20 74 65 6c 6c 73 20 53 51 4c 69 74 65 20 74 6f   tells SQLite to
efc0: 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
efd0: 0a 20 20 2a 2a 20 72 65 73 74 20 6f 66 20 74 68  .  ** rest of th
efe0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  e journal file c
eff0: 6f 6e 74 61 69 6e 73 20 76 61 6c 69 64 20 70 61  ontains valid pa
f000: 67 65 20 72 65 63 6f 72 64 73 2e 20 54 68 69 73  ge records. This
f010: 20 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20 2a 2a   assumption.  **
f020: 20 69 73 20 64 61 6e 67 65 72 6f 75 73 2c 20 61   is dangerous, a
f030: 73 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f  s if a failure o
f040: 63 63 75 72 72 65 64 20 77 68 69 6c 73 74 20 77  ccurred whilst w
f050: 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f  riting to the jo
f060: 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20  urnal.  ** file 
f070: 69 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 73  it may contain s
f080: 6f 6d 65 20 67 61 72 62 61 67 65 20 64 61 74 61  ome garbage data
f090: 2e 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 20  . There are two 
f0a0: 73 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a 20 77  scenarios.  ** w
f0b0: 68 65 72 65 20 74 68 69 73 20 72 69 73 6b 20 63  here this risk c
f0c0: 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a 0a 20  an be ignored:. 
f0d0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65   **.  **   * Whe
f0e0: 6e 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  n the pager is i
f0f0: 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20  n no-sync mode. 
f100: 43 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e 20 66  Corruption can f
f110: 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20 20 20  ollow a.  **    
f120: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 69   power failure i
f130: 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e 79 77  n this case anyw
f140: 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ay..  **.  **   
f150: 2a 20 57 68 65 6e 20 74 68 65 20 53 51 4c 49 54  * When the SQLIT
f160: 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
f170: 45 4e 44 20 66 6c 61 67 20 69 73 20 73 65 74 2e  END flag is set.
f180: 20 54 68 69 73 20 67 75 61 72 61 6e 74 65 65 73   This guarantees
f190: 0a 20 20 2a 2a 20 20 20 20 20 74 68 61 74 20 67  .  **     that g
f1a0: 61 72 62 61 67 65 20 64 61 74 61 20 69 73 20 6e  arbage data is n
f1b0: 65 76 65 72 20 61 70 70 65 6e 64 65 64 20 74 6f  ever appended to
f1c0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
f1d0: 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
f1e0: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
f1f0: 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  >fd) || pPager->
f200: 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 69 66 28 20  noSync );.  if( 
f210: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c  pPager->noSync |
f220: 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  | (pPager->journ
f230: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
f240: 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
f250: 29 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33  ).   || (sqlite3
f260: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
f270: 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
f280: 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  fd)&SQLITE_IOCAP
f290: 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 0a 20  _SAFE_APPEND) . 
f2a0: 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a   ){.    memcpy(z
f2b0: 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c  Header, aJournal
f2c0: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a  Magic, sizeof(aJ
f2d0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20  ournalMagic));. 
f2e0: 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48     put32bits(&zH
f2f0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
f300: 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 78  urnalMagic)], 0x
f310: 66 66 66 66 66 66 66 66 29 3b 0a 20 20 7d 65 6c  ffffffff);.  }el
f320: 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a  se{.    memset(z
f330: 48 65 61 64 65 72 2c 20 30 2c 20 73 69 7a 65 6f  Header, 0, sizeo
f340: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
f350: 2b 34 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  +4);.  }..  /* T
f360: 68 65 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d  he random check-
f370: 68 61 73 68 20 69 6e 69 74 69 61 6c 69 7a 65 72  hash initializer
f380: 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f 72   */ .  sqlite3_r
f390: 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
f3a0: 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  (pPager->cksumIn
f3b0: 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b  it), &pPager->ck
f3c0: 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33  sumInit);.  put3
f3d0: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
f3e0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
f3f0: 67 69 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d  gic)+4], pPager-
f400: 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f  >cksumInit);.  /
f410: 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61  * The initial da
f420: 74 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20  tabase size */. 
f430: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
f440: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
f450: 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50  nalMagic)+8], pP
f460: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
f470: 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75  );.  /* The assu
f480: 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20  med sector size 
f490: 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73  for this process
f4a0: 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
f4b0: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
f4c0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31  aJournalMagic)+1
f4d0: 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74  2], pPager->sect
f4e0: 6f 72 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 54  orSize);..  /* T
f4f0: 68 65 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a  he page size */.
f500: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
f510: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
f520: 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20  rnalMagic)+16], 
f530: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
f540: 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c  );..  /* Initial
f550: 69 7a 69 6e 67 20 74 68 65 20 74 61 69 6c 20 6f  izing the tail o
f560: 66 20 74 68 65 20 62 75 66 66 65 72 20 69 73 20  f the buffer is 
f570: 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20  not necessary.  
f580: 45 76 65 72 79 74 68 69 6e 67 0a 20 20 2a 2a 20  Everything.  ** 
f590: 77 6f 72 6b 73 20 66 69 6e 64 20 69 66 20 74 68  works find if th
f5a0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73  e following mems
f5b0: 65 74 28 29 20 69 73 20 6f 6d 69 74 74 65 64 2e  et() is omitted.
f5c0: 20 20 42 75 74 20 69 6e 69 74 69 61 6c 69 7a 69    But initializi
f5d0: 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f  ng.  ** the memo
f5e0: 72 79 20 70 72 65 76 65 6e 74 73 20 76 61 6c 67  ry prevents valg
f5f0: 72 69 6e 64 20 66 72 6f 6d 20 63 6f 6d 70 6c 61  rind from compla
f600: 69 6e 69 6e 67 2c 20 73 6f 20 77 65 20 61 72 65  ining, so we are
f610: 20 77 69 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a   willing to.  **
f620: 20 74 61 6b 65 20 74 68 65 20 70 65 72 66 6f 72   take the perfor
f630: 6d 61 6e 63 65 20 68 69 74 2e 0a 20 20 2a 2f 0a  mance hit..  */.
f640: 20 20 6d 65 6d 73 65 74 28 26 7a 48 65 61 64 65    memset(&zHeade
f650: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
f660: 6c 4d 61 67 69 63 29 2b 32 30 5d 2c 20 30 2c 0a  lMagic)+20], 0,.
f670: 20 20 20 20 20 20 20 20 20 6e 48 65 61 64 65 72           nHeader
f680: 2d 28 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  -(sizeof(aJourna
f690: 6c 4d 61 67 69 63 29 2b 32 30 29 29 3b 0a 0a 20  lMagic)+20));.. 
f6a0: 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 69   /* In theory, i
f6b0: 74 20 69 73 20 6f 6e 6c 79 20 6e 65 63 65 73 73  t is only necess
f6c0: 61 72 79 20 74 6f 20 77 72 69 74 65 20 74 68 65  ary to write the
f6d0: 20 32 38 20 62 79 74 65 73 20 74 68 61 74 20 74   28 bytes that t
f6e0: 68 65 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  he .  ** journal
f6f0: 20 68 65 61 64 65 72 20 63 6f 6e 73 75 6d 65 73   header consumes
f700: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
f710: 66 69 6c 65 20 68 65 72 65 2e 20 54 68 65 6e 20  file here. Then 
f720: 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20  increment the . 
f730: 20 2a 2a 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61   ** Pager.journa
f740: 6c 4f 66 66 20 76 61 72 69 61 62 6c 65 20 62 79  lOff variable by
f750: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20   JOURNAL_HDR_SZ 
f760: 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78 74  so that the next
f770: 20 0a 20 20 2a 2a 20 72 65 63 6f 72 64 20 69 73   .  ** record is
f780: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
f790: 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 63 74 6f 72  following sector
f7a0: 20 28 6c 65 61 76 69 6e 67 20 61 20 67 61 70 20   (leaving a gap 
f7b0: 69 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a  in the file.  **
f7c0: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6d   that will be im
f7d0: 70 6c 69 63 69 74 6c 79 20 66 69 6c 6c 65 64 20  plicitly filled 
f7e0: 69 6e 20 62 79 20 74 68 65 20 4f 53 29 2e 0a 20  in by the OS).. 
f7f0: 20 2a 2a 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72   **.  ** However
f800: 20 69 74 20 68 61 73 20 62 65 65 6e 20 64 69 73   it has been dis
f810: 63 6f 76 65 72 65 64 20 74 68 61 74 20 6f 6e 20  covered that on 
f820: 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 74 68 69  some systems thi
f830: 73 20 70 61 74 74 65 72 6e 20 63 61 6e 20 0a 20  s pattern can . 
f840: 20 2a 2a 20 62 65 20 73 69 67 6e 69 66 69 63 61   ** be significa
f850: 6e 74 6c 79 20 73 6c 6f 77 65 72 20 74 68 61 6e  ntly slower than
f860: 20 63 6f 6e 74 69 67 75 6f 75 73 6c 79 20 77 72   contiguously wr
f870: 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68  iting data to th
f880: 65 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 65 76 65  e file,.  ** eve
f890: 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20  n if that means 
f8a0: 65 78 70 6c 69 63 69 74 6c 79 20 77 72 69 74 69  explicitly writi
f8b0: 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65 20 62  ng data to the b
f8c0: 6c 6f 63 6b 20 6f 66 20 0a 20 20 2a 2a 20 28 4a  lock of .  ** (J
f8d0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20  OURNAL_HDR_SZ - 
f8e0: 32 38 29 20 62 79 74 65 73 20 74 68 61 74 20 77  28) bytes that w
f8f0: 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e  ill not be used.
f900: 20 53 6f 20 74 68 61 74 20 69 73 20 77 68 61 74   So that is what
f910: 0a 20 20 2a 2a 20 69 73 20 64 6f 6e 65 2e 20 0a  .  ** is done. .
f920: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 6f    **.  ** The lo
f930: 6f 70 20 69 73 20 72 65 71 75 69 72 65 64 20 68  op is required h
f940: 65 72 65 20 69 6e 20 63 61 73 65 20 74 68 65 20  ere in case the 
f950: 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c  sector-size is l
f960: 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a  arger than the .
f970: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 70 61    ** database pa
f980: 67 65 20 73 69 7a 65 2e 20 53 69 6e 63 65 20 74  ge size. Since t
f990: 68 65 20 7a 48 65 61 64 65 72 20 62 75 66 66 65  he zHeader buffe
f9a0: 72 20 69 73 20 6f 6e 6c 79 20 50 61 67 65 72 2e  r is only Pager.
f9b0: 70 61 67 65 53 69 7a 65 0a 20 20 2a 2a 20 62 79  pageSize.  ** by
f9c0: 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 6d 6f 72  tes in size, mor
f9d0: 65 20 74 68 61 6e 20 6f 6e 65 20 63 61 6c 6c 20  e than one call 
f9e0: 74 6f 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74  to sqlite3OsWrit
f9f0: 65 28 29 20 6d 61 79 20 62 65 20 72 65 71 75 69  e() may be requi
fa00: 72 65 64 0a 20 20 2a 2a 20 74 6f 20 70 6f 70 75  red.  ** to popu
fa10: 6c 61 74 65 20 74 68 65 20 65 6e 74 69 72 65 20  late the entire 
fa20: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73  journal header s
fa30: 65 63 74 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20 66  ector..  */ .  f
fa40: 6f 72 28 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d  or(nWrite=0; rc=
fa50: 3d 53 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69  =SQLITE_OK&&nWri
fa60: 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  te<JOURNAL_HDR_S
fa70: 5a 28 70 50 61 67 65 72 29 3b 20 6e 57 72 69 74  Z(pPager); nWrit
fa80: 65 2b 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20 20  e+=nHeader){.   
fa90: 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20   IOTRACE(("JHDR 
faa0: 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70  %p %lld %d\n", p
fab0: 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  Pager, pPager->j
fac0: 6f 75 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64  ournalHdr, nHead
fad0: 65 72 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71  er)).    rc = sq
fae0: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
faf0: 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65  ger->jfd, zHeade
fb00: 72 2c 20 6e 48 65 61 64 65 72 2c 20 70 50 61 67  r, nHeader, pPag
fb10: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b  er->journalOff);
fb20: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
fb30: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
fb40: 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  <= pPager->journ
fb50: 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20 70 50 61  alOff );.    pPa
fb60: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
fb70: 2b 3d 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a  += nHeader;.  }.
fb80: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
fb90: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
fba0: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
fbb0: 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69  open when this i
fbc0: 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72  s called. A jour
fbd0: 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a  nal header file.
fbe0: 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ** (JOURNAL_HDR_
fbf0: 53 5a 20 62 79 74 65 73 29 20 69 73 20 72 65 61  SZ bytes) is rea
fc00: 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65  d from the curre
fc10: 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74  nt location in t
fc20: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
fc30: 6c 65 2e 20 54 68 65 20 63 75 72 72 65 6e 74 20  le. The current 
fc40: 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  location in the 
fc50: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
fc60: 67 69 76 65 6e 20 62 79 0a 2a 2a 20 70 50 61 67  given by.** pPag
fc70: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2e 20  er->journalOff. 
fc80: 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f  See comments abo
fc90: 76 65 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74  ve function writ
fca0: 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f  eJournalHdr() fo
fcb0: 72 0a 2a 2a 20 61 20 64 65 73 63 72 69 70 74 69  r.** a descripti
fcc0: 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  on of the journa
fcd0: 6c 20 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e  l header format.
fce0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65  .**.** If the he
fcf0: 61 64 65 72 20 69 73 20 72 65 61 64 20 73 75 63  ader is read suc
fd00: 63 65 73 73 66 75 6c 6c 79 2c 20 2a 70 4e 52 65  cessfully, *pNRe
fd10: 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  c is set to the 
fd20: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67  number of.** pag
fd30: 65 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77  e records follow
fd40: 69 6e 67 20 74 68 69 73 20 68 65 61 64 65 72 20  ing this header 
fd50: 61 6e 64 20 2a 70 44 62 53 69 7a 65 20 69 73 20  and *pDbSize is 
fd60: 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20  set to the size 
fd70: 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
fd80: 73 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 72  se before the tr
fd90: 61 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c  ansaction began,
fda0: 20 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c   in pages. Also,
fdb0: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
fdc0: 69 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  it.** is set to 
fdd0: 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
fde0: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
fdf0: 68 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f  header. SQLITE_O
fe00: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  K is returned.**
fe10: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
fe20: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
fe30: 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20  nal header file 
fe40: 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f  appears to be co
fe50: 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f  rrupted, SQLITE_
fe60: 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72  DONE is.** retur
fe70: 6e 65 64 20 61 6e 64 20 2a 70 4e 52 65 63 20 61  ned and *pNRec a
fe80: 6e 64 20 2a 50 44 62 53 69 7a 65 20 61 72 65 20  nd *PDbSize are 
fe90: 75 6e 64 65 66 69 6e 65 64 2e 20 20 49 66 20 4a  undefined.  If J
fea0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
feb0: 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65  tes.** cannot be
fec0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
fed0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65  ournal file an e
fee0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
fef0: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
ff00: 20 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c   int readJournal
ff10: 48 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50  Hdr(.  Pager *pP
ff20: 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ager,           
ff30: 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a      /* Pager obj
ff40: 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 48  ect */.  int isH
ff50: 6f 74 2c 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61  ot,.  i64 journa
ff60: 6c 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  lSize,          
ff70: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
ff80: 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66  e open journal f
ff90: 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ile in bytes */.
ffa0: 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 20 20    u32 *pNRec,   
ffb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ffc0: 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 72 65 61  * OUT: Value rea
ffd0: 64 20 66 72 6f 6d 20 74 68 65 20 6e 52 65 63 20  d from the nRec 
ffe0: 66 69 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20 2a  field */.  u32 *
fff0: 70 44 62 53 69 7a 65 20 20 20 20 20 20 20 20 20  pDbSize         
10000 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
10010 56 61 6c 75 65 20 6f 66 20 6f 72 69 67 69 6e 61  Value of origina
10020 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  l database size 
10030 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e  field */.){.  in
10040 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
10050 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
10060 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75  turn code */.  u
10070 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61  nsigned char aMa
10080 67 69 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20 41  gic[8];     /* A
10090 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
100a0 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72  the magic header
100b0 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66   */.  i64 iHdrOf
100c0 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
100d0 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
100e0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 62  journal header b
100f0 65 69 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 20 20  eing read */..  
10100 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
10110 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20  Pager->jfd) );  
10120 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66      /* Journal f
10130 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
10140 2e 20 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76 61 6e  . */..  /* Advan
10150 63 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  ce Pager.journal
10160 4f 66 66 20 74 6f 20 74 68 65 20 73 74 61 72 74  Off to the start
10170 20 6f 66 20 74 68 65 20 6e 65 78 74 20 73 65 63   of the next sec
10180 74 6f 72 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a  tor. If the.  **
10190 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
101a0 20 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74   too small for t
101b0 68 65 72 65 20 74 6f 20 62 65 20 61 20 68 65 61  here to be a hea
101c0 64 65 72 20 73 74 6f 72 65 64 20 61 74 20 74 68  der stored at th
101d0 69 73 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c 20 72  is.  ** point, r
101e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
101f0 45 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72  E..  */.  pPager
10200 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a  ->journalOff = j
10210 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28  ournalHdrOffset(
10220 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70  pPager);.  if( p
10230 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
10240 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  f+JOURNAL_HDR_SZ
10250 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e  (pPager) > journ
10260 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65  alSize ){.    re
10270 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
10280 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20  ;.  }.  iHdrOff 
10290 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
102a0 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 52 65 61 64  lOff;..  /* Read
102b0 20 69 6e 20 74 68 65 20 66 69 72 73 74 20 38 20   in the first 8 
102c0 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75  bytes of the jou
102d0 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 49 66 20  rnal header. If 
102e0 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63  they do not matc
102f0 68 0a 20 20 2a 2a 20 74 68 65 20 20 6d 61 67 69  h.  ** the  magi
10300 63 20 73 74 72 69 6e 67 20 66 6f 75 6e 64 20 61  c string found a
10310 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65  t the start of e
10320 61 63 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ach journal head
10330 65 72 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20  er, return.  ** 
10340 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66 20  SQLITE_DONE. If 
10350 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
10360 72 73 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72  rs, return an er
10370 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77  ror code. Otherw
10380 69 73 65 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 65  ise,.  ** procee
10390 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  d..  */.  if( is
103a0 48 6f 74 20 7c 7c 20 69 48 64 72 4f 66 66 21 3d  Hot || iHdrOff!=
103b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
103c0 64 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  dr ){.    rc = s
103d0 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
103e0 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63  ger->jfd, aMagic
103f0 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  , sizeof(aMagic)
10400 2c 20 69 48 64 72 4f 66 66 29 3b 0a 20 20 20 20  , iHdrOff);.    
10410 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
10420 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
10430 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28  .    if( memcmp(
10440 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c  aMagic, aJournal
10450 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d  Magic, sizeof(aM
10460 61 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20  agic))!=0 ){.   
10470 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10480 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _DONE;.    }.  }
10490 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
104a0 66 69 72 73 74 20 74 68 72 65 65 20 33 32 2d 62  first three 32-b
104b0 69 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  it fields of the
104c0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 3a   journal header:
104d0 20 54 68 65 20 6e 52 65 63 0a 20 20 2a 2a 20 66   The nRec.  ** f
104e0 69 65 6c 64 2c 20 74 68 65 20 63 68 65 63 6b 73  ield, the checks
104f0 75 6d 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20 61  um-initializer a
10500 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
10510 73 69 7a 65 20 61 74 20 74 68 65 20 73 74 61 72  size at the star
10520 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 72  t.  ** of the tr
10530 61 6e 73 61 63 74 69 6f 6e 2e 20 52 65 74 75 72  ansaction. Retur
10540 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
10550 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
10560 20 77 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69   wrong..  */.  i
10570 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  f( SQLITE_OK!=(r
10580 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
10590 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
105a0 4f 66 66 2b 38 2c 20 70 4e 52 65 63 29 29 0a 20  Off+8, pNRec)). 
105b0 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
105c0 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73  (rc = read32bits
105d0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
105e0 64 72 4f 66 66 2b 31 32 2c 20 26 70 50 61 67 65  drOff+12, &pPage
105f0 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 29 0a 20  r->cksumInit)). 
10600 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
10610 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73  (rc = read32bits
10620 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
10630 64 72 4f 66 66 2b 31 36 2c 20 70 44 62 53 69 7a  drOff+16, pDbSiz
10640 65 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  e)).  ){.    ret
10650 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69  urn rc;.  }..  i
10660 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
10670 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  alOff==0 ){.    
10680 75 33 32 20 69 50 61 67 65 53 69 7a 65 3b 20 20  u32 iPageSize;  
10690 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
106a0 50 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20  Page-size field 
106b0 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  of journal heade
106c0 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 69 53 65  r */.    u32 iSe
106d0 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20  ctorSize;       
106e0 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 2d        /* Sector-
106f0 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f  size field of jo
10700 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a  urnal header */.
10710 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
10720 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73   page-size and s
10730 65 63 74 6f 72 2d 73 69 7a 65 20 6a 6f 75 72 6e  ector-size journ
10740 61 6c 20 68 65 61 64 65 72 20 66 69 65 6c 64 73  al header fields
10750 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 53 51 4c  . */.    if( SQL
10760 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
10770 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
10780 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 30  >jfd, iHdrOff+20
10790 2c 20 26 69 53 65 63 74 6f 72 53 69 7a 65 29 29  , &iSectorSize))
107a0 0a 20 20 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  .     || SQLITE_
107b0 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
107c0 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
107d0 2c 20 69 48 64 72 4f 66 66 2b 32 34 2c 20 26 69  , iHdrOff+24, &i
107e0 50 61 67 65 53 69 7a 65 29 29 0a 20 20 20 20 29  PageSize)).    )
107f0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
10800 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
10810 20 56 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   Versions of SQL
10820 69 74 65 20 70 72 69 6f 72 20 74 6f 20 33 2e 35  ite prior to 3.5
10830 2e 38 20 73 65 74 20 74 68 65 20 70 61 67 65 2d  .8 set the page-
10840 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68  size field of th
10850 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  e.    ** journal
10860 20 68 65 61 64 65 72 20 74 6f 20 7a 65 72 6f 2e   header to zero.
10870 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 61   In this case, a
10880 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 50  ssume that the P
10890 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20  ager.pageSize.  
108a0 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73    ** variable is
108b0 20 61 6c 72 65 61 64 79 20 73 65 74 20 74 6f 20   already set to 
108c0 74 68 65 20 63 6f 72 72 65 63 74 20 70 61 67 65  the correct page
108d0 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   size..    */.  
108e0 20 20 69 66 28 20 69 50 61 67 65 53 69 7a 65 3d    if( iPageSize=
108f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 50 61 67  =0 ){.      iPag
10900 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  eSize = pPager->
10910 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a  pageSize;.    }.
10920 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  .    /* Check th
10930 61 74 20 74 68 65 20 76 61 6c 75 65 73 20 72 65  at the values re
10940 61 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ad from the page
10950 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72  -size and sector
10960 2d 73 69 7a 65 20 66 69 65 6c 64 73 0a 20 20 20  -size fields.   
10970 20 2a 2a 20 61 72 65 20 77 69 74 68 69 6e 20 72   ** are within r
10980 61 6e 67 65 2e 20 54 6f 20 62 65 20 27 69 6e 20  ange. To be 'in 
10990 72 61 6e 67 65 27 2c 20 62 6f 74 68 20 76 61 6c  range', both val
109a0 75 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 61  ues need to be a
109b0 20 70 6f 77 65 72 0a 20 20 20 20 2a 2a 20 6f 66   power.    ** of
109c0 20 74 77 6f 20 67 72 65 61 74 65 72 20 74 68 61   two greater tha
109d0 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 35 31  n or equal to 51
109e0 32 20 6f 72 20 33 32 2c 20 61 6e 64 20 6e 6f 74  2 or 32, and not
109f0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
10a00 65 69 72 20 0a 20 20 20 20 2a 2a 20 72 65 73 70  eir .    ** resp
10a10 65 63 74 69 76 65 20 63 6f 6d 70 69 6c 65 20 74  ective compile t
10a20 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6c 69 6d 69  ime maximum limi
10a30 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ts..    */.    i
10a40 66 28 20 69 50 61 67 65 53 69 7a 65 3c 35 31 32  f( iPageSize<512
10a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a60 20 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65    || iSectorSize
10a70 3c 33 32 0a 20 20 20 20 20 7c 7c 20 69 50 61 67  <32.     || iPag
10a80 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58  eSize>SQLITE_MAX
10a90 5f 50 41 47 45 5f 53 49 5a 45 20 7c 7c 20 69 53  _PAGE_SIZE || iS
10aa0 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45  ectorSize>MAX_SE
10ab0 43 54 4f 52 5f 53 49 5a 45 0a 20 20 20 20 20 7c  CTOR_SIZE.     |
10ac0 7c 20 28 28 69 50 61 67 65 53 69 7a 65 2d 31 29  | ((iPageSize-1)
10ad0 26 69 50 61 67 65 53 69 7a 65 29 21 3d 30 20 20  &iPageSize)!=0  
10ae0 20 7c 7c 20 28 28 69 53 65 63 74 6f 72 53 69 7a   || ((iSectorSiz
10af0 65 2d 31 29 26 69 53 65 63 74 6f 72 53 69 7a 65  e-1)&iSectorSize
10b00 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20  )!=0 .    ){.   
10b10 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65 69 74     /* If the eit
10b20 68 65 72 20 74 68 65 20 70 61 67 65 2d 73 69 7a  her the page-siz
10b30 65 20 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a 65  e or sector-size
10b40 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d   in the journal-
10b50 68 65 61 64 65 72 20 69 73 20 0a 20 20 20 20 20  header is .     
10b60 20 2a 2a 20 69 6e 76 61 6c 69 64 2c 20 74 68 65   ** invalid, the
10b70 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  n the process th
10b80 61 74 20 77 72 6f 74 65 20 74 68 65 20 6a 6f 75  at wrote the jou
10b90 72 6e 61 6c 2d 68 65 61 64 65 72 20 6d 75 73 74  rnal-header must
10ba0 20 68 61 76 65 20 0a 20 20 20 20 20 20 2a 2a 20   have .      ** 
10bb0 63 72 61 73 68 65 64 20 62 65 66 6f 72 65 20 74  crashed before t
10bc0 68 65 20 68 65 61 64 65 72 20 77 61 73 20 73 79  he header was sy
10bd0 6e 63 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  nced. In this ca
10be0 73 65 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20  se stop reading 
10bf0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f  .      ** the jo
10c00 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e  urnal file here.
10c10 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
10c20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
10c30 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  NE;.    }..    /
10c40 2a 20 55 70 64 61 74 65 20 74 68 65 20 70 61 67  * Update the pag
10c50 65 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20  e-size to match 
10c60 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
10c70 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  rom the journal.
10c80 20 0a 20 20 20 20 2a 2a 20 55 73 65 20 61 20 74   .    ** Use a t
10c90 65 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f 20  estcase() macro 
10ca0 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
10cb0 74 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  t malloc failure
10cc0 20 77 69 74 68 69 6e 20 0a 20 20 20 20 2a 2a 20   within .    ** 
10cd0 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
10ce0 28 29 20 69 73 20 74 65 73 74 65 64 2e 0a 20 20  () is tested..  
10cf0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
10d00 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
10d10 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26 69  esize(pPager, &i
10d20 50 61 67 65 53 69 7a 65 2c 20 2d 31 29 3b 0a 20  PageSize, -1);. 
10d30 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
10d40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20  =SQLITE_OK );.. 
10d50 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
10d60 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d   assumed sector-
10d70 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68  size to match th
10d80 65 20 76 61 6c 75 65 20 75 73 65 64 20 62 79 20  e value used by 
10d90 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63  .    ** the proc
10da0 65 73 73 20 74 68 61 74 20 63 72 65 61 74 65 64  ess that created
10db0 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49   this journal. I
10dc0 66 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77  f this journal w
10dd0 61 73 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65  as.    ** create
10de0 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 6f  d by a process o
10df0 74 68 65 72 20 74 68 61 6e 20 74 68 69 73 20 6f  ther than this o
10e00 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  ne, then this ro
10e10 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 69 73 20  utine.    ** is 
10e20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f  being called fro
10e30 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70  m within pager_p
10e40 6c 61 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c  layback(). The l
10e50 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20 20 20 2a  ocal value.    *
10e60 2a 20 6f 66 20 50 61 67 65 72 2e 73 65 63 74 6f  * of Pager.secto
10e70 72 53 69 7a 65 20 69 73 20 72 65 73 74 6f 72 65  rSize is restore
10e80 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  d at the end of 
10e90 74 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20  that routine..  
10ea0 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d    */.    pPager-
10eb0 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 69 53  >sectorSize = iS
10ec0 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 7d 0a 0a  ectorSize;.  }..
10ed0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
10ee0 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f  lOff += JOURNAL_
10ef0 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  HDR_SZ(pPager);.
10f00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
10f10 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  ./*.** Write the
10f20 20 73 75 70 70 6c 69 65 64 20 6d 61 73 74 65 72   supplied master
10f30 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e   journal name in
10f40 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
10f50 69 6c 65 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a  ile for pager.**
10f60 20 70 50 61 67 65 72 20 61 74 20 74 68 65 20 63   pPager at the c
10f70 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e  urrent location.
10f80 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
10f90 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62 65  nal name must be
10fa0 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69   the last.** thi
10fb0 6e 67 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20  ng written to a 
10fc0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
10fd0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
10fe0 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c   full-sync mode,
10ff0 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
11000 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
11010 69 73 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74  is advanced to t
11020 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62  he next sector b
11030 6f 75 6e 64 61 72 79 20 62 65 66 6f 72 65 0a 2a  oundary before.*
11040 2a 20 61 6e 79 74 68 69 6e 67 20 69 73 20 77 72  * anything is wr
11050 69 74 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61  itten. The forma
11060 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2b 20  t is:.**.**   + 
11070 34 20 62 79 74 65 73 3a 20 50 41 47 45 52 5f 4d  4 bytes: PAGER_M
11080 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20 20 2b 20 4e  J_PGNO..**   + N
11090 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a   bytes: Master j
110a0 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20  ournal filename 
110b0 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a 20 20 20 2b  in utf-8..**   +
110c0 20 34 20 62 79 74 65 73 3a 20 4e 20 28 6c 65 6e   4 bytes: N (len
110d0 67 74 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  gth of master jo
110e0 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 20 62 79  urnal name in by
110f0 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d 74 65 72 6d  tes, no nul-term
11100 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20 20 20 2b 20  inator)..**   + 
11110 34 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20  4 bytes: Master 
11120 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65  journal name che
11130 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20 2b 20 38 20  cksum..**   + 8 
11140 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d  bytes: aJournalM
11150 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68  agic[]..**.** Th
11160 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
11170 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69   page checksum i
11180 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  s the sum of the
11190 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61   bytes in the ma
111a0 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  ster.** journal 
111b0 6e 61 6d 65 2c 20 77 68 65 72 65 20 65 61 63 68  name, where each
111c0 20 62 79 74 65 20 69 73 20 69 6e 74 65 72 70 72   byte is interpr
111d0 65 74 65 64 20 61 73 20 61 20 73 69 67 6e 65 64  eted as a signed
111e0 20 38 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 0a   8-bit integer..
111f0 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72  **.** If zMaster
11200 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74   is a NULL point
11210 65 72 20 28 6f 63 63 75 72 73 20 66 6f 72 20 61  er (occurs for a
11220 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
11230 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a   transaction), .
11240 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20  ** this call is 
11250 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
11260 69 63 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74  ic int writeMast
11270 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  erJournal(Pager 
11280 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63  *pPager, const c
11290 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20  har *zMaster){. 
112a0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
112b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112c0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
112d0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65   */.  int nMaste
112e0 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
112f0 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
11300 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74   of string zMast
11310 65 72 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72  er */.  i64 iHdr
11320 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
11330 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
11340 65 74 20 6f 66 20 68 65 61 64 65 72 20 69 6e 20  et of header in 
11350 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
11360 20 20 69 36 34 20 6a 72 6e 6c 53 69 7a 65 3b 20    i64 jrnlSize; 
11370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11380 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f     /* Size of jo
11390 75 72 6e 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69  urnal file on di
113a0 73 6b 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75  sk */.  u32 cksu
113b0 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  m = 0;          
113c0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63           /* Chec
113d0 6b 73 75 6d 20 6f 66 20 73 74 72 69 6e 67 20 7a  ksum of string z
113e0 4d 61 73 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73  Master */..  ass
113f0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 65 74  ert( pPager->set
11400 4d 61 73 74 65 72 3d 3d 30 20 29 3b 0a 20 20 61  Master==0 );.  a
11410 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
11420 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  Wal(pPager) );..
11430 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 0a    if( !zMaster .
11440 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f     || pPager->jo
11450 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
11460 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
11470 4f 52 59 20 0a 20 20 20 7c 7c 20 21 69 73 4f 70  ORY .   || !isOp
11480 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 0a  en(pPager->jfd).
11490 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
114a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
114b0 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
114c0 65 72 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74  er = 1;.  assert
114d0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
114e0 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e  lHdr <= pPager->
114f0 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 0a 20  journalOff );.. 
11500 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 74 68   /* Calculate th
11510 65 20 6c 65 6e 67 74 68 20 69 6e 20 62 79 74 65  e length in byte
11520 73 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73  s and the checks
11530 75 6d 20 6f 66 20 7a 4d 61 73 74 65 72 20 2a 2f  um of zMaster */
11540 0a 20 20 66 6f 72 28 6e 4d 61 73 74 65 72 3d 30  .  for(nMaster=0
11550 3b 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65  ; zMaster[nMaste
11560 72 5d 3b 20 6e 4d 61 73 74 65 72 2b 2b 29 7b 0a  r]; nMaster++){.
11570 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61      cksum += zMa
11580 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 0a 20  ster[nMaster];. 
11590 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66   }..  /* If in f
115a0 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61  ull-sync mode, a
115b0 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  dvance to the ne
115c0 78 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62  xt disk sector b
115d0 65 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20  efore writing.  
115e0 2a 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** the master jo
115f0 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73  urnal name. This
11600 20 69 73 20 69 6e 20 63 61 73 65 20 74 68 65 20   is in case the 
11610 70 72 65 76 69 6f 75 73 20 70 61 67 65 20 77 72  previous page wr
11620 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68  itten to.  ** th
11630 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c  e journal has al
11640 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65  ready been synce
11650 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  d..  */.  if( pP
11660 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29  ager->fullSync )
11670 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
11680 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e  urnalOff = journ
11690 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67  alHdrOffset(pPag
116a0 65 72 29 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f  er);.  }.  iHdrO
116b0 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ff = pPager->jou
116c0 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57  rnalOff;..  /* W
116d0 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  rite the master 
116e0 6a 6f 75 72 6e 61 6c 20 64 61 74 61 20 74 6f 20  journal data to 
116f0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a  the end of the j
11700 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 0a  ournal file. If.
11710 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63    ** an error oc
11720 63 75 72 73 2c 20 72 65 74 75 72 6e 20 74 68 65  curs, return the
11730 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74   error code to t
11740 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a 2f 0a  he caller..  */.
11750 20 20 69 66 28 20 28 30 20 21 3d 20 28 72 63 20    if( (0 != (rc 
11760 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
11770 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
11780 66 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  ff, PAGER_MJ_PGN
11790 4f 28 70 50 61 67 65 72 29 29 29 29 0a 20 20 20  O(pPager)))).   
117a0 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73  || (0 != (rc = s
117b0 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
117c0 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74  ager->jfd, zMast
117d0 65 72 2c 20 6e 4d 61 73 74 65 72 2c 20 69 48 64  er, nMaster, iHd
117e0 72 4f 66 66 2b 34 29 29 29 0a 20 20 20 7c 7c 20  rOff+4))).   || 
117f0 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74  (0 != (rc = writ
11800 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
11810 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e  jfd, iHdrOff+4+n
11820 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 29  Master, nMaster)
11830 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28  )).   || (0 != (
11840 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
11850 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
11860 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b  drOff+4+nMaster+
11870 34 2c 20 63 6b 73 75 6d 29 29 29 0a 20 20 20 7c  4, cksum))).   |
11880 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71  | (0 != (rc = sq
11890 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
118a0 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e  ger->jfd, aJourn
118b0 61 6c 4d 61 67 69 63 2c 20 38 2c 0a 20 20 20 20  alMagic, 8,.    
118c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118d0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 48 64               iHd
118e0 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 38  rOff+4+nMaster+8
118f0 29 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  ))).  ){.    ret
11900 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50  urn rc;.  }.  pP
11910 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
11920 20 2b 3d 20 28 6e 4d 61 73 74 65 72 2b 32 30 29   += (nMaster+20)
11930 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  ;..  /* If the p
11940 61 67 65 72 20 69 73 20 69 6e 20 70 65 72 69 73  ager is in peris
11950 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64  tent-journal mod
11960 65 2c 20 74 68 65 6e 20 74 68 65 20 70 68 79 73  e, then the phys
11970 69 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e  ical .  ** journ
11980 61 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78 74 65  al-file may exte
11990 6e 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  nd past the end 
119a0 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f  of the master-jo
119b0 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20  urnal name.  ** 
119c0 61 6e 64 20 38 20 62 79 74 65 73 20 6f 66 20 6d  and 8 bytes of m
119d0 61 67 69 63 20 64 61 74 61 20 6a 75 73 74 20 77  agic data just w
119e0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 69  ritten to the fi
119f0 6c 65 2e 20 54 68 69 73 20 69 73 20 0a 20 20 2a  le. This is .  *
11a00 2a 20 64 61 6e 67 65 72 6f 75 73 20 62 65 63 61  * dangerous beca
11a10 75 73 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20  use the code to 
11a20 72 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a  rollback a hot-j
11a30 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a  ournal file.  **
11a40 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c   will not be abl
11a50 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 61  e to find the ma
11a60 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster-journal nam
11a70 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a  e to determine .
11a80 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20    ** whether or 
11a90 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  not the journal 
11aa0 69 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20  is hot. .  **.  
11ab0 2a 2a 20 45 61 73 69 65 73 74 20 74 68 69 6e 67  ** Easiest thing
11ac0 20 74 6f 20 64 6f 20 69 6e 20 74 68 69 73 20 73   to do in this s
11ad0 63 65 6e 61 72 69 6f 20 69 73 20 74 6f 20 74 72  cenario is to tr
11ae0 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e  uncate the journ
11af0 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74 6f  al .  ** file to
11b00 20 74 68 65 20 72 65 71 75 69 72 65 64 20 73 69   the required si
11b10 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20  ze..  */ .  if( 
11b20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d  SQLITE_OK==(rc =
11b30 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
11b40 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
11b50 26 6a 72 6e 6c 53 69 7a 65 29 29 0a 20 20 20 26  &jrnlSize)).   &
11b60 26 20 6a 72 6e 6c 53 69 7a 65 3e 70 50 61 67 65  & jrnlSize>pPage
11b70 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20  r->journalOff.  
11b80 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
11b90 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
11ba0 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
11bb0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a  r->journalOff);.
11bc0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
11bd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72  .}../*.** Discar
11be0 64 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e  d the entire con
11bf0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 69 6e 2d  tents of the in-
11c00 6d 65 6d 6f 72 79 20 70 61 67 65 2d 63 61 63 68  memory page-cach
11c10 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
11c20 64 20 70 61 67 65 72 5f 72 65 73 65 74 28 50 61  d pager_reset(Pa
11c30 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
11c40 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72  pPager->iDataVer
11c50 73 69 6f 6e 2b 2b 3b 0a 20 20 73 71 6c 69 74 65  sion++;.  sqlite
11c60 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 70  3BackupRestart(p
11c70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b  Pager->pBackup);
11c80 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
11c90 43 6c 65 61 72 28 70 50 61 67 65 72 2d 3e 70 50  Clear(pPager->pP
11ca0 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Cache);.}../*.**
11cb0 20 52 65 74 75 72 6e 20 74 68 65 20 70 50 61 67   Return the pPag
11cc0 65 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e  er->iDataVersion
11cd0 20 76 61 6c 75 65 0a 2a 2f 0a 75 33 32 20 73 71   value.*/.u32 sq
11ce0 6c 69 74 65 33 50 61 67 65 72 44 61 74 61 56 65  lite3PagerDataVe
11cf0 72 73 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61  rsion(Pager *pPa
11d00 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
11d10 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73  Pager->iDataVers
11d20 69 6f 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  ion;.}../*.** Fr
11d30 65 65 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65  ee all structure
11d40 73 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61  s in the Pager.a
11d50 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61  Savepoint[] arra
11d60 79 20 61 6e 64 20 73 65 74 20 62 6f 74 68 0a 2a  y and set both.*
11d70 2a 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  * Pager.aSavepoi
11d80 6e 74 20 61 6e 64 20 50 61 67 65 72 2e 6e 53 61  nt and Pager.nSa
11d90 76 65 70 6f 69 6e 74 20 74 6f 20 7a 65 72 6f 2e  vepoint to zero.
11da0 20 43 6c 6f 73 65 20 74 68 65 20 73 75 62 2d 6a   Close the sub-j
11db0 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66 20 69 74 20  ournal.** if it 
11dc0 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
11dd0 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20  pager is not in 
11de0 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a  exclusive mode..
11df0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
11e00 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69  eleaseAllSavepoi
11e10 6e 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  nts(Pager *pPage
11e20 72 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20  r){.  int ii;   
11e30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
11e40 74 65 72 61 74 6f 72 20 66 6f 72 20 6c 6f 6f 70  terator for loop
11e50 69 6e 67 20 74 68 72 6f 75 67 68 20 50 61 67 65  ing through Page
11e60 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  r.aSavepoint */.
11e70 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
11e80 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
11e90 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73 71  t; ii++){.    sq
11ea0 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
11eb0 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65  oy(pPager->aSave
11ec0 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76  point[ii].pInSav
11ed0 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20 69  epoint);.  }.  i
11ee0 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
11ef0 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 73 71 6c  usiveMode || sql
11f00 69 74 65 33 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d  ite3JournalIsInM
11f10 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 73 6a  emory(pPager->sj
11f20 66 64 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  fd) ){.    sqlit
11f30 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
11f40 2d 3e 73 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73  ->sjfd);.  }.  s
11f50 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
11f60 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 29 3b  er->aSavepoint);
11f70 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65  .  pPager->aSave
11f80 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61  point = 0;.  pPa
11f90 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20  ger->nSavepoint 
11fa0 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
11fb0 53 75 62 52 65 63 20 3d 20 30 3b 0a 7d 0a 0a 2f  SubRec = 0;.}../
11fc0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 69 74  *.** Set the bit
11fd0 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20   number pgno in 
11fe0 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69  the PagerSavepoi
11ff0 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20  nt.pInSavepoint 
12000 0a 2a 2a 20 62 69 74 76 65 63 73 20 6f 66 20 61  .** bitvecs of a
12010 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  ll open savepoin
12020 74 73 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  ts. Return SQLIT
12030 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66  E_OK if successf
12040 75 6c 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f  ul.** or SQLITE_
12050 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f  NOMEM if a mallo
12060 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  c failure occurs
12070 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12080 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69  addToSavepointBi
12090 74 76 65 63 73 28 50 61 67 65 72 20 2a 70 50 61  tvecs(Pager *pPa
120a0 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
120b0 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20  .  int ii;      
120c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
120d0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
120e0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
120f0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 2f 2a 20 52  E_OK;       /* R
12100 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a 20  esult code */.. 
12110 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50   for(ii=0; ii<pP
12120 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
12130 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67  ; ii++){.    Pag
12140 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d  erSavepoint *p =
12150 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70   &pPager->aSavep
12160 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20 20 20 69 66  oint[ii];.    if
12170 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69 67  ( pgno<=p->nOrig
12180 20 29 7b 0a 20 20 20 20 20 20 72 63 20 7c 3d 20   ){.      rc |= 
12190 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
121a0 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74  (p->pInSavepoint
121b0 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 74  , pgno);.      t
121c0 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c  estcase( rc==SQL
121d0 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
121e0 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
121f0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d  QLITE_OK || rc==
12200 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
12210 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
12220 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
12230 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
12240 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
12250 70 61 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c  pager is in excl
12260 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 20 6e  usive mode and n
12270 6f 74 0a 2a 2a 20 69 6e 20 74 68 65 20 45 52 52  ot.** in the ERR
12280 4f 52 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77  OR state. Otherw
12290 69 73 65 2c 20 69 74 20 73 77 69 74 63 68 65 73  ise, it switches
122a0 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 50 41   the pager to PA
122b0 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 73 74 61 74  GER_OPEN.** stat
122c0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
122d0 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20  pager is not in 
122e0 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73  exclusive-access
122f0 20 6d 6f 64 65 2c 20 74 68 65 20 64 61 74 61 62   mode, the datab
12300 61 73 65 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63  ase file is.** c
12310 6f 6d 70 6c 65 74 65 6c 79 20 75 6e 6c 6f 63 6b  ompletely unlock
12320 65 64 2e 20 49 66 20 74 68 65 20 66 69 6c 65 20  ed. If the file 
12330 69 73 20 75 6e 6c 6f 63 6b 65 64 20 61 6e 64 20  is unlocked and 
12340 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
12350 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 68 69  does.** not exhi
12360 62 69 74 20 74 68 65 20 55 4e 44 45 4c 45 54 41  bit the UNDELETA
12370 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 70 72  BLE_WHEN_OPEN pr
12380 6f 70 65 72 74 79 2c 20 74 68 65 20 6a 6f 75 72  operty, the jour
12390 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63  nal file is.** c
123a0 6c 6f 73 65 64 20 28 69 66 20 69 74 20 69 73 20  losed (if it is 
123b0 6f 70 65 6e 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  open)..**.** If 
123c0 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
123d0 45 52 52 4f 52 20 73 74 61 74 65 20 77 68 65 6e  ERROR state when
123e0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
123f0 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 0a 2a  s called, the .*
12400 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  * contents of th
12410 65 20 70 61 67 65 72 20 63 61 63 68 65 20 61 72  e pager cache ar
12420 65 20 64 69 73 63 61 72 64 65 64 20 62 65 66 6f  e discarded befo
12430 72 65 20 73 77 69 74 63 68 69 6e 67 20 62 61 63  re switching bac
12440 6b 20 74 6f 20 0a 2a 2a 20 74 68 65 20 4f 50 45  k to .** the OPE
12450 4e 20 73 74 61 74 65 2e 20 52 65 67 61 72 64 6c  N state. Regardl
12460 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 74  ess of whether t
12470 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65  he pager is in e
12480 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 0a 2a 2a  xclusive-mode.**
12490 20 6f 72 20 6e 6f 74 2c 20 61 6e 79 20 6a 6f 75   or not, any jou
124a0 72 6e 61 6c 20 66 69 6c 65 20 6c 65 66 74 20 69  rnal file left i
124b0 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
124c0 6d 20 77 69 6c 6c 20 62 65 20 74 72 65 61 74 65  m will be treate
124d0 64 0a 2a 2a 20 61 73 20 61 20 68 6f 74 2d 6a 6f  d.** as a hot-jo
124e0 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c 65 64  urnal and rolled
124f0 20 62 61 63 6b 20 74 68 65 20 6e 65 78 74 20 74   back the next t
12500 69 6d 65 20 61 20 72 65 61 64 2d 74 72 61 6e 73  ime a read-trans
12510 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 6f 70 65  action.** is ope
12520 6e 65 64 20 28 62 79 20 74 68 69 73 20 6f 72 20  ned (by this or 
12530 62 79 20 61 6e 79 20 6f 74 68 65 72 20 63 6f 6e  by any other con
12540 6e 65 63 74 69 6f 6e 29 2e 0a 2a 2f 0a 73 74 61  nection)..*/.sta
12550 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75  tic void pager_u
12560 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  nlock(Pager *pPa
12570 67 65 72 29 7b 0a 0a 20 20 61 73 73 65 72 74 28  ger){..  assert(
12580 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
12590 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 0a 20  =PAGER_READER . 
125a0 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
125b0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
125c0 50 45 4e 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  PEN .       || p
125d0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
125e0 41 47 45 52 5f 45 52 52 4f 52 20 0a 20 20 29 3b  AGER_ERROR .  );
125f0 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65  ..  sqlite3Bitve
12600 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
12610 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  >pInJournal);.  
12620 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
12630 61 6c 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61 73  al = 0;.  releas
12640 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70  eAllSavepoints(p
12650 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28 20 70  Pager);..  if( p
12660 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
12670 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  r) ){.    assert
12680 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
12690 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 73 71  ->jfd) );.    sq
126a0 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54  lite3WalEndReadT
126b0 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
126c0 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 70 50  r->pWal);.    pP
126d0 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
126e0 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d 65 6c  AGER_OPEN;.  }el
126f0 73 65 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  se if( !pPager->
12700 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b  exclusiveMode ){
12710 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20  .    int rc;    
12720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12730 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65     /* Error code
12740 20 72 65 74 75 72 6e 65 64 20 62 79 20 70 61 67   returned by pag
12750 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 2a 2f 0a  erUnlockDb() */.
12760 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 69 73      int iDc = is
12770 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
12780 3f 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65  ?sqlite3OsDevice
12790 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
127a0 70 50 61 67 65 72 2d 3e 66 64 29 3a 30 3b 0a 0a  pPager->fd):0;..
127b0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70      /* If the op
127c0 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 73  erating system s
127d0 75 70 70 6f 72 74 20 64 65 6c 65 74 69 6f 6e 20  upport deletion 
127e0 6f 66 20 6f 70 65 6e 20 66 69 6c 65 73 2c 20 74  of open files, t
127f0 68 65 6e 0a 20 20 20 20 2a 2a 20 63 6c 6f 73 65  hen.    ** close
12800 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
12810 65 20 77 68 65 6e 20 64 72 6f 70 70 69 6e 67 20  e when dropping 
12820 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63  the database loc
12830 6b 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 20 20  k.  Otherwise.  
12840 20 20 2a 2a 20 61 6e 6f 74 68 65 72 20 63 6f 6e    ** another con
12850 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6a 6f 75  nection with jou
12860 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74 65  rnal_mode=delete
12870 20 6d 69 67 68 74 20 64 65 6c 65 74 65 20 74 68   might delete th
12880 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6f 75  e file.    ** ou
12890 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 75 73 2e  t from under us.
128a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
128b0 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
128c0 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20  ALMODE_MEMORY   
128d0 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61  & 5)!=1 );.    a
128e0 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
128f0 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20 20  URNALMODE_OFF   
12900 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20     & 5)!=1 );.  
12910 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52    assert( (PAGER
12920 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
12930 20 20 20 20 20 20 26 20 35 29 21 3d 31 20 29 3b        & 5)!=1 );
12940 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41  .    assert( (PA
12950 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
12960 44 45 4c 45 54 45 20 20 20 26 20 35 29 21 3d 31  DELETE   & 5)!=1
12970 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
12980 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  (PAGER_JOURNALMO
12990 44 45 5f 54 52 55 4e 43 41 54 45 20 26 20 35 29  DE_TRUNCATE & 5)
129a0 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==1 );.    asser
129b0 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
129c0 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 20 26  LMODE_PERSIST  &
129d0 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66   5)==1 );.    if
129e0 28 20 30 3d 3d 28 69 44 63 20 26 20 53 51 4c 49  ( 0==(iDc & SQLI
129f0 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54  TE_IOCAP_UNDELET
12a00 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 29 0a  ABLE_WHEN_OPEN).
12a10 20 20 20 20 20 7c 7c 20 31 21 3d 28 70 50 61 67       || 1!=(pPag
12a20 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  er->journalMode 
12a30 26 20 35 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  & 5).    ){.    
12a40 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
12a50 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
12a60 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
12a70 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
12a80 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20  the ERROR state 
12a90 61 6e 64 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  and the call to 
12aa0 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  unlock the datab
12ab0 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  ase.    ** file 
12ac0 66 61 69 6c 73 2c 20 73 65 74 20 74 68 65 20 63  fails, set the c
12ad0 75 72 72 65 6e 74 20 6c 6f 63 6b 20 74 6f 20 55  urrent lock to U
12ae0 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65  NKNOWN_LOCK. See
12af0 20 74 68 65 20 63 6f 6d 6d 65 6e 74 0a 20 20 20   the comment.   
12b00 20 2a 2a 20 61 62 6f 76 65 20 74 68 65 20 23 64   ** above the #d
12b10 65 66 69 6e 65 20 66 6f 72 20 55 4e 4b 4e 4f 57  efine for UNKNOW
12b20 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78  N_LOCK for an ex
12b30 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 77 68 79  planation of why
12b40 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20   this.    ** is 
12b50 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20 20 2a  necessary..    *
12b60 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  /.    rc = pager
12b70 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  UnlockDb(pPager,
12b80 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69   NO_LOCK);.    i
12b90 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
12ba0 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61   && pPager->eSta
12bb0 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te==PAGER_ERROR 
12bc0 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
12bd0 3e 65 4c 6f 63 6b 20 3d 20 55 4e 4b 4e 4f 57 4e  >eLock = UNKNOWN
12be0 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20  _LOCK;.    }..  
12bf0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 73    /* The pager s
12c00 74 61 74 65 20 6d 61 79 20 62 65 20 63 68 61 6e  tate may be chan
12c10 67 65 64 20 66 72 6f 6d 20 50 41 47 45 52 5f 45  ged from PAGER_E
12c20 52 52 4f 52 20 74 6f 20 50 41 47 45 52 5f 4f 50  RROR to PAGER_OP
12c30 45 4e 20 68 65 72 65 0a 20 20 20 20 2a 2a 20 77  EN here.    ** w
12c40 69 74 68 6f 75 74 20 63 6c 65 61 72 69 6e 67 20  ithout clearing 
12c50 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  the error code. 
12c60 54 68 69 73 20 69 73 20 69 6e 74 65 6e 74 69 6f  This is intentio
12c70 6e 61 6c 20 2d 20 74 68 65 20 65 72 72 6f 72 0a  nal - the error.
12c80 20 20 20 20 2a 2a 20 63 6f 64 65 20 69 73 20 63      ** code is c
12c90 6c 65 61 72 65 64 20 61 6e 64 20 74 68 65 20 63  leared and the c
12ca0 61 63 68 65 20 72 65 73 65 74 20 69 6e 20 74 68  ache reset in th
12cb0 65 20 62 6c 6f 63 6b 20 62 65 6c 6f 77 2e 0a 20  e block below.. 
12cc0 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
12cd0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
12ce0 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  e || pPager->eSt
12cf0 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
12d00 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
12d10 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
12d20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
12d30 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
12d40 4f 50 45 4e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OPEN;.  }..  /* 
12d50 49 66 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  If Pager.errCode
12d60 20 69 73 20 73 65 74 2c 20 74 68 65 20 63 6f 6e   is set, the con
12d70 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
12d80 65 72 20 63 61 63 68 65 20 63 61 6e 6e 6f 74 20  er cache cannot 
12d90 62 65 0a 20 20 2a 2a 20 74 72 75 73 74 65 64 2e  be.  ** trusted.
12da0 20 4e 6f 77 20 74 68 61 74 20 74 68 65 72 65 20   Now that there 
12db0 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  are no outstandi
12dc0 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ng references to
12dd0 20 74 68 65 20 70 61 67 65 72 2c 0a 20 20 2a 2a   the pager,.  **
12de0 20 69 74 20 63 61 6e 20 73 61 66 65 6c 79 20 6d   it can safely m
12df0 6f 76 65 20 62 61 63 6b 20 74 6f 20 50 41 47 45  ove back to PAGE
12e00 52 5f 4f 50 45 4e 20 73 74 61 74 65 2e 20 54 68  R_OPEN state. Th
12e10 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20 62 6f  is happens in bo
12e20 74 68 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 61  th.  ** normal a
12e30 6e 64 20 65 78 63 6c 75 73 69 76 65 2d 6c 6f 63  nd exclusive-loc
12e40 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a  king mode..  */.
12e50 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
12e60 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
12e70 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42 20 29  E_OK || !MEMDB )
12e80 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
12e90 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 69  errCode ){.    i
12ea0 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  f( pPager->tempF
12eb0 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ile==0 ){.      
12ec0 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
12ed0 65 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  er);.      pPage
12ee0 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
12ef0 6e 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ne = 0;.      pP
12f00 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
12f10 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 7d  AGER_OPEN;.    }
12f20 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67  else{.      pPag
12f30 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 28 69 73  er->eState = (is
12f40 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
12f50 29 20 3f 20 50 41 47 45 52 5f 4f 50 45 4e 20 3a  ) ? PAGER_OPEN :
12f60 20 50 41 47 45 52 5f 52 45 41 44 45 52 29 3b 0a   PAGER_READER);.
12f70 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 55 53      }.    if( US
12f80 45 46 45 54 43 48 28 70 50 61 67 65 72 29 20 29  EFETCH(pPager) )
12f90 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63   sqlite3OsUnfetc
12fa0 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 2c  h(pPager->fd, 0,
12fb0 20 30 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d   0);.    pPager-
12fc0 3e 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54  >errCode = SQLIT
12fd0 45 5f 4f 4b 3b 0a 20 20 20 20 73 65 74 47 65 74  E_OK;.    setGet
12fe0 74 65 72 4d 65 74 68 6f 64 28 70 50 61 67 65 72  terMethod(pPager
12ff0 29 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72  );.  }..  pPager
13000 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
13010 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
13020 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 70 50  nalHdr = 0;.  pP
13030 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
13040 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  = 0;.}../*.** Th
13050 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
13060 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20 61  alled whenever a
13070 6e 20 49 4f 45 52 52 20 6f 72 20 46 55 4c 4c 20  n IOERR or FULL 
13080 65 72 72 6f 72 20 74 68 61 74 20 72 65 71 75 69  error that requi
13090 72 65 73 0a 2a 2a 20 74 68 65 20 70 61 67 65 72  res.** the pager
130a0 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 20 69   to transition i
130b0 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74  nto the ERROR st
130c0 61 74 65 20 6d 61 79 20 61 68 76 65 20 6f 63 63  ate may ahve occ
130d0 75 72 72 65 64 2e 0a 2a 2a 20 54 68 65 20 66 69  urred..** The fi
130e0 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
130f0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
13100 20 70 61 67 65 72 20 73 74 72 75 63 74 75 72 65   pager structure
13110 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a  , the second .**
13120 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20   the error-code 
13130 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75  about to be retu
13140 72 6e 65 64 20 62 79 20 61 20 70 61 67 65 72 20  rned by a pager 
13150 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68  API function. Th
13160 65 20 0a 2a 2a 20 76 61 6c 75 65 20 72 65 74 75  e .** value retu
13170 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f  rned is a copy o
13180 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
13190 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
131a0 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49  nction. .**.** I
131b0 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
131c0 75 6d 65 6e 74 20 69 73 20 53 51 4c 49 54 45 5f  ument is SQLITE_
131d0 46 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45  FULL, SQLITE_IOE
131e0 52 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  RR or one of the
131f0 0a 2a 2a 20 49 4f 45 52 52 20 73 75 62 2d 63 6f  .** IOERR sub-co
13200 64 65 73 2c 20 74 68 65 20 70 61 67 65 72 20 65  des, the pager e
13210 6e 74 65 72 73 20 74 68 65 20 45 52 52 4f 52 20  nters the ERROR 
13220 73 74 61 74 65 20 61 6e 64 20 74 68 65 20 65 72  state and the er
13230 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20 73  ror code.** is s
13240 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e 65  tored in Pager.e
13250 72 72 43 6f 64 65 2e 20 57 68 69 6c 65 20 74 68  rrCode. While th
13260 65 20 70 61 67 65 72 20 72 65 6d 61 69 6e 73 20  e pager remains 
13270 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  in the ERROR sta
13280 74 65 2c 0a 2a 2a 20 61 6c 6c 20 6d 61 6a 6f 72  te,.** all major
13290 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68   API calls on th
132a0 65 20 50 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d  e Pager will imm
132b0 65 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e 20  ediately return 
132c0 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e 0a 2a  Pager.errCode..*
132d0 2a 0a 2a 2a 20 54 68 65 20 45 52 52 4f 52 20 73  *.** The ERROR s
132e0 74 61 74 65 20 69 6e 64 69 63 61 74 65 73 20 74  tate indicates t
132f0 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  hat the contents
13300 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61   of the pager-ca
13310 63 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62  che .** cannot b
13320 65 20 74 72 75 73 74 65 64 2e 20 54 68 69 73 20  e trusted. This 
13330 73 74 61 74 65 20 63 61 6e 20 62 65 20 63 6c 65  state can be cle
13340 61 72 65 64 20 62 79 20 63 6f 6d 70 6c 65 74 65  ared by complete
13350 6c 79 20 64 69 73 63 61 72 64 69 6e 67 20 0a 2a  ly discarding .*
13360 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * the contents o
13370 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  f the pager-cach
13380 65 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  e. If a transact
13390 69 6f 6e 20 77 61 73 20 61 63 74 69 76 65 20 77  ion was active w
133a0 68 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73 69  hen.** the persi
133b0 73 74 65 6e 74 20 65 72 72 6f 72 20 6f 63 63 75  stent error occu
133c0 72 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72  rred, then the r
133d0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
133e0 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62  may need.** to b
133f0 65 20 72 65 70 6c 61 79 65 64 20 74 6f 20 72 65  e replayed to re
13400 73 74 6f 72 65 20 74 68 65 20 63 6f 6e 74 65 6e  store the conten
13410 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ts of the databa
13420 73 65 20 66 69 6c 65 20 28 61 73 20 69 66 0a 2a  se file (as if.*
13430 2a 20 69 74 20 77 65 72 65 20 61 20 68 6f 74 2d  * it were a hot-
13440 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61  journal)..*/.sta
13450 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72  tic int pager_er
13460 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ror(Pager *pPage
13470 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e  r, int rc){.  in
13480 74 20 72 63 32 20 3d 20 72 63 20 26 20 30 78 66  t rc2 = rc & 0xf
13490 66 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  f;.  assert( rc=
134a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d  =SQLITE_OK || !M
134b0 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  EMDB );.  assert
134c0 28 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  (.       pPager-
134d0 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
134e0 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20  _FULL ||.       
134f0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
13500 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20  =SQLITE_OK ||.  
13510 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72       (pPager->er
13520 72 43 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53  rCode & 0xff)==S
13530 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b  QLITE_IOERR.  );
13540 0a 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49  .  if( rc2==SQLI
13550 54 45 5f 46 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d  TE_FULL || rc2==
13560 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a  SQLITE_IOERR ){.
13570 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
13580 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 70 50  ode = rc;.    pP
13590 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
135a0 41 47 45 52 5f 45 52 52 4f 52 3b 0a 20 20 20 20  AGER_ERROR;.    
135b0 73 65 74 47 65 74 74 65 72 4d 65 74 68 6f 64 28  setGetterMethod(
135c0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72  pPager);.  }.  r
135d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61  eturn rc;.}..sta
135e0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72  tic int pager_tr
135f0 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50  uncate(Pager *pP
13600 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65  ager, Pgno nPage
13610 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 77 72  );../*.** The wr
13620 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
13630 6f 70 65 6e 20 6f 6e 20 70 50 61 67 65 72 20 69  open on pPager i
13640 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65  s being committe
13650 64 20 28 62 43 6f 6d 6d 69 74 3d 3d 31 29 0a 2a  d (bCommit==1).*
13660 2a 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b  * or rolled back
13670 20 28 62 43 6f 6d 6d 69 74 3d 3d 30 29 2e 0a 2a   (bCommit==0)..*
13680 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
13690 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20   if and only if 
136a0 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20  all dirty pages 
136b0 73 68 6f 75 6c 64 20 62 65 20 66 6c 75 73 68 65  should be flushe
136c0 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a  d to disk..**.**
136d0 20 52 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   Rules:.**.**   
136e0 2a 20 20 46 6f 72 20 6e 6f 6e 2d 54 45 4d 50 20  *  For non-TEMP 
136f0 64 61 74 61 62 61 73 65 73 2c 20 61 6c 77 61 79  databases, alway
13700 73 20 73 79 6e 63 20 74 6f 20 64 69 73 6b 2e 20  s sync to disk. 
13710 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
13720 72 79 0a 2a 2a 20 20 20 20 20 20 66 6f 72 20 74  ry.**      for t
13730 72 61 6e 73 61 63 74 69 6f 6e 73 20 74 6f 20 62  ransactions to b
13740 65 20 64 75 72 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  e durable..**.**
13750 20 20 20 2a 20 20 53 79 6e 63 20 54 45 4d 50 20     *  Sync TEMP 
13760 64 61 74 61 62 61 73 65 20 6f 6e 6c 79 20 6f 6e  database only on
13770 20 61 20 43 4f 4d 4d 49 54 20 28 6e 6f 74 20 61   a COMMIT (not a
13780 20 52 4f 4c 4c 42 41 43 4b 29 20 77 68 65 6e 20   ROLLBACK) when 
13790 74 68 65 20 62 61 63 6b 69 6e 67 0a 2a 2a 20 20  the backing.**  
137a0 20 20 20 20 66 69 6c 65 20 68 61 73 20 62 65 65      file has bee
137b0 6e 20 63 72 65 61 74 65 64 20 61 6c 72 65 61 64  n created alread
137c0 79 20 28 76 69 61 20 61 20 73 70 69 6c 6c 20 6f  y (via a spill o
137d0 6e 20 70 61 67 65 72 53 74 72 65 73 73 28 29 29  n pagerStress())
137e0 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 77 68 65   and.**      whe
137f0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
13800 64 69 72 74 79 20 70 61 67 65 73 20 69 6e 20 6d  dirty pages in m
13810 65 6d 6f 72 79 20 65 78 63 65 65 64 73 20 32 35  emory exceeds 25
13820 25 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 0a 2a  % of the total.*
13830 2a 20 20 20 20 20 20 63 61 63 68 65 20 73 69 7a  *      cache siz
13840 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
13850 20 70 61 67 65 72 46 6c 75 73 68 4f 6e 43 6f 6d   pagerFlushOnCom
13860 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  mit(Pager *pPage
13870 72 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b  r, int bCommit){
13880 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74  .  if( pPager->t
13890 65 6d 70 46 69 6c 65 3d 3d 30 20 29 20 72 65 74  empFile==0 ) ret
138a0 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 21 62 43  urn 1;.  if( !bC
138b0 6f 6d 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30  ommit ) return 0
138c0 3b 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28  ;.  if( !isOpen(
138d0 70 50 61 67 65 72 2d 3e 66 64 29 20 29 20 72 65  pPager->fd) ) re
138e0 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e  turn 0;.  return
138f0 20 28 73 71 6c 69 74 65 33 50 43 61 63 68 65 50   (sqlite3PCacheP
13900 65 72 63 65 6e 74 44 69 72 74 79 28 70 50 61 67  ercentDirty(pPag
13910 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 3d 32 35  er->pPCache)>=25
13920 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
13930 20 72 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20   routine ends a 
13940 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74  transaction. A t
13950 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 75 73  ransaction is us
13960 75 61 6c 6c 79 20 65 6e 64 65 64 20 62 79 20 0a  ually ended by .
13970 2a 2a 20 65 69 74 68 65 72 20 61 20 43 4f 4d 4d  ** either a COMM
13980 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b  IT or a ROLLBACK
13990 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 69 73   operation. This
139a0 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 62 65 20   routine may be 
139b0 63 61 6c 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72  called .** after
139c0 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68   rollback of a h
139d0 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69  ot-journal, or i
139e0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
139f0 73 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a  s while opening.
13a00 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** the journal f
13a10 69 6c 65 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ile or writing t
13a20 68 65 20 76 65 72 79 20 66 69 72 73 74 20 6a 6f  he very first jo
13a30 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6f 66 20  urnal-header of 
13a40 61 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 72  a.** database tr
13a50 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a  ansaction..** .*
13a60 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
13a70 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69  s never called i
13a80 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74  n PAGER_ERROR st
13a90 61 74 65 2e 20 49 66 20 69 74 20 69 73 20 63 61  ate. If it is ca
13aa0 6c 6c 65 64 0a 2a 2a 20 69 6e 20 50 41 47 45 52  lled.** in PAGER
13ab0 5f 4e 4f 4e 45 20 6f 72 20 50 41 47 45 52 5f 53  _NONE or PAGER_S
13ac0 48 41 52 45 44 20 73 74 61 74 65 20 61 6e 64 20  HARED state and 
13ad0 74 68 65 20 6c 6f 63 6b 20 68 65 6c 64 20 69 73  the lock held is
13ae0 20 6c 65 73 73 0a 2a 2a 20 65 78 63 6c 75 73 69   less.** exclusi
13af0 76 65 20 74 68 61 6e 20 61 20 52 45 53 45 52 56  ve than a RESERV
13b00 45 44 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 61  ED lock, it is a
13b10 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4f 74   no-op..**.** Ot
13b20 68 65 72 77 69 73 65 2c 20 61 6e 79 20 61 63 74  herwise, any act
13b30 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61  ive savepoints a
13b40 72 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a  re released..**.
13b50 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
13b60 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20  l file is open, 
13b70 74 68 65 6e 20 69 74 20 69 73 20 22 66 69 6e 61  then it is "fina
13b80 6c 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a  lized". Once a j
13b90 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20  ournal .** file 
13ba0 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a  has been finaliz
13bb0 65 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  ed it is not pos
13bc0 73 69 62 6c 65 20 74 6f 20 75 73 65 20 69 74 20  sible to use it 
13bd0 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a  to roll back a .
13be0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
13bf0 4e 6f 72 20 77 69 6c 6c 20 69 74 20 62 65 20 63  Nor will it be c
13c00 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20  onsidered to be 
13c10 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79  a hot-journal by
13c20 20 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20   this.** or any 
13c30 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  other database c
13c40 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63 74  onnection. Exact
13c50 6c 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c  ly how a journal
13c60 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a   is finalized.**
13c70 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74   depends on whet
13c80 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70  her or not the p
13c90 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
13ca0 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
13cb0 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72  e and.** the cur
13cc0 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64  rent journal-mod
13cd0 65 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  e (Pager.journal
13ce0 4d 6f 64 65 20 76 61 6c 75 65 29 2c 20 61 73 20  Mode value), as 
13cf0 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
13d00 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45   journalMode==ME
13d10 4d 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72  MORY.**     Jour
13d20 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
13d30 74 6f 72 20 69 73 20 73 69 6d 70 6c 79 20 63 6c  tor is simply cl
13d40 6f 73 65 64 2e 20 54 68 69 73 20 64 65 73 74 72  osed. This destr
13d50 6f 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69  oys an .**     i
13d60 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
13d70 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61  ..**.**   journa
13d80 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a  lMode==TRUNCATE.
13d90 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66  **     Journal f
13da0 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ile is truncated
13db0 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69   to zero bytes i
13dc0 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  n size..**.**   
13dd0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52  journalMode==PER
13de0 53 49 53 54 0a 2a 2a 20 20 20 20 20 54 68 65 20  SIST.**     The 
13df0 66 69 72 73 74 20 32 38 20 62 79 74 65 73 20 6f  first 28 bytes o
13e00 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
13e10 6c 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 54  le are zeroed. T
13e20 68 69 73 20 69 6e 76 61 6c 69 64 61 74 65 73 0a  his invalidates.
13e30 2a 2a 20 20 20 20 20 74 68 65 20 66 69 72 73 74  **     the first
13e40 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
13e50 69 6e 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64  in the file, and
13e60 20 68 65 6e 63 65 20 74 68 65 20 65 6e 74 69 72   hence the entir
13e70 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  e journal.**    
13e80 20 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69   file. An invali
13e90 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  d journal file c
13ea0 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20  annot be rolled 
13eb0 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  back..**.**   jo
13ec0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54  urnalMode==DELET
13ed0 45 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f 75  E.**     The jou
13ee0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f  rnal file is clo
13ef0 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64 20  sed and deleted 
13f00 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44  using sqlite3OsD
13f10 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20  elete()..**.**  
13f20 20 20 20 49 66 20 74 68 65 20 70 61 67 65 72 20     If the pager 
13f30 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  is running in ex
13f40 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68  clusive mode, th
13f50 69 73 20 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e  is method of fin
13f60 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74  alizing.**     t
13f70 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
13f80 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e 20 49  is never used. I
13f90 6e 73 74 65 61 64 2c 20 69 66 20 74 68 65 20 6a  nstead, if the j
13fa0 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a  ournalMode is.**
13fb0 20 20 20 20 20 44 45 4c 45 54 45 20 61 6e 64 20       DELETE and 
13fc0 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
13fd0 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20  exclusive mode, 
13fe0 74 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72  the method descr
13ff0 69 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20  ibed under.**   
14000 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50    journalMode==P
14010 45 52 53 49 53 54 20 69 73 20 75 73 65 64 20 69  ERSIST is used i
14020 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66  nstead..**.** Af
14030 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
14040 69 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68  is finalized, th
14050 65 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f  e pager moves to
14060 20 50 41 47 45 52 5f 52 45 41 44 45 52 20 73 74   PAGER_READER st
14070 61 74 65 2e 0a 2a 2a 20 49 66 20 72 75 6e 6e 69  ate..** If runni
14080 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75 73  ng in non-exclus
14090 69 76 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64  ive rollback mod
140a0 65 2c 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  e, the lock on t
140b0 68 65 20 66 69 6c 65 20 69 73 20 0a 2a 2a 20 64  he file is .** d
140c0 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20 53  owngraded to a S
140d0 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
140e0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
140f0 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72  eturned if no er
14100 72 6f 72 20 6f 63 63 75 72 73 2e 20 49 66 20 61  ror occurs. If a
14110 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  n error occurs d
14120 75 72 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66 20  uring.** any of 
14130 74 68 65 20 49 4f 20 6f 70 65 72 61 74 69 6f 6e  the IO operation
14140 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68  s to finalize th
14150 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
14160 72 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20  r unlock the.** 
14170 64 61 74 61 62 61 73 65 20 74 68 65 6e 20 74 68  database then th
14180 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
14190 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
141a0 68 65 20 75 73 65 72 2e 20 49 66 20 74 68 65 20  he user. If the 
141b0 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f  .** operation to
141c0 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f   finalize the jo
141d0 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73  urnal file fails
141e0 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 64 65 20  , then the code 
141f0 73 74 69 6c 6c 0a 2a 2a 20 74 72 69 65 73 20 74  still.** tries t
14200 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  o unlock the dat
14210 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 6e 6f  abase file if no
14220 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  t in exclusive m
14230 6f 64 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 75  ode. If the.** u
14240 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20  nlock operation 
14250 66 61 69 6c 73 20 61 73 20 77 65 6c 6c 2c 20 74  fails as well, t
14260 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 65 72  hen the first er
14270 72 6f 72 20 63 6f 64 65 20 72 65 6c 61 74 65 64  ror code related
14280 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74  .** to the first
14290 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72   error encounter
142a0 65 64 20 28 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ed (the journal 
142b0 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65  finalization one
142c0 29 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  ) is.** returned
142d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
142e0 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
142f0 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61  ction(Pager *pPa
14300 67 65 72 2c 20 69 6e 74 20 68 61 73 4d 61 73 74  ger, int hasMast
14310 65 72 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29  er, int bCommit)
14320 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
14330 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20  ITE_OK;      /* 
14340 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20  Error code from 
14350 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61  journal finaliza
14360 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a  tion operation *
14370 2f 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51  /.  int rc2 = SQ
14380 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20  LITE_OK;     /* 
14390 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20  Error code from 
143a0 64 62 20 66 69 6c 65 20 75 6e 6c 6f 63 6b 20 6f  db file unlock o
143b0 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f  peration */..  /
143c0 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20  * Do nothing if 
143d0 74 68 65 20 70 61 67 65 72 20 64 6f 65 73 20 6e  the pager does n
143e0 6f 74 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20  ot have an open 
143f0 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
14400 6e 0a 20 20 2a 2a 20 6f 72 20 61 74 20 6c 65 61  n.  ** or at lea
14410 73 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  st a RESERVED lo
14420 63 6b 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ck. This functio
14430 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  n may be called 
14440 77 68 65 6e 20 74 68 65 72 65 0a 20 20 2a 2a 20  when there.  ** 
14450 69 73 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e  is no write-tran
14460 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 20 62  saction active b
14470 75 74 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  ut a RESERVED or
14480 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73   greater lock is
14490 0a 20 20 2a 2a 20 68 65 6c 64 20 75 6e 64 65 72  .  ** held under
144a0 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63   two circumstanc
144b0 65 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  es:.  **.  **   
144c0 31 2e 20 41 66 74 65 72 20 61 20 73 75 63 63 65  1. After a succe
144d0 73 73 66 75 6c 20 68 6f 74 2d 6a 6f 75 72 6e 61  ssful hot-journa
144e0 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69  l rollback, it i
144f0 73 20 63 61 6c 6c 65 64 20 77 69 74 68 0a 20 20  s called with.  
14500 2a 2a 20 20 20 20 20 20 65 53 74 61 74 65 3d 3d  **      eState==
14510 50 41 47 45 52 5f 4e 4f 4e 45 20 61 6e 64 20 65  PAGER_NONE and e
14520 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
14530 4c 4f 43 4b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  LOCK..  **.  ** 
14540 20 20 32 2e 20 49 66 20 61 20 63 6f 6e 6e 65 63    2. If a connec
14550 74 69 6f 6e 20 77 69 74 68 20 6c 6f 63 6b 69 6e  tion with lockin
14560 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
14570 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c   holding an EXCL
14580 55 53 49 56 45 20 0a 20 20 2a 2a 20 20 20 20 20  USIVE .  **     
14590 20 6c 6f 63 6b 20 73 77 69 74 63 68 65 73 20 62   lock switches b
145a0 61 63 6b 20 74 6f 20 6c 6f 63 6b 69 6e 67 5f 6d  ack to locking_m
145b0 6f 64 65 3d 6e 6f 72 6d 61 6c 20 61 6e 64 20 74  ode=normal and t
145c0 68 65 6e 20 65 78 65 63 75 74 65 73 20 61 0a 20  hen executes a. 
145d0 20 2a 2a 20 20 20 20 20 20 72 65 61 64 2d 74 72   **      read-tr
145e0 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 69 73 20  ansaction, this 
145f0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
14600 65 64 20 77 69 74 68 20 65 53 74 61 74 65 3d 3d  ed with eState==
14610 50 41 47 45 52 5f 52 45 41 44 45 52 20 0a 20 20  PAGER_READER .  
14620 2a 2a 20 20 20 20 20 20 61 6e 64 20 65 4c 6f 63  **      and eLoc
14630 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
14640 4b 20 77 68 65 6e 20 74 68 65 20 72 65 61 64 2d  K when the read-
14650 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
14660 6c 6f 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73  losed..  */.  as
14670 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
14680 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
14690 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
146a0 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
146b0 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69  GER_ERROR );.  i
146c0 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  f( pPager->eStat
146d0 65 3c 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  e<PAGER_WRITER_L
146e0 4f 43 4b 45 44 20 26 26 20 70 50 61 67 65 72 2d  OCKED && pPager-
146f0 3e 65 4c 6f 63 6b 3c 52 45 53 45 52 56 45 44 5f  >eLock<RESERVED_
14700 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  LOCK ){.    retu
14710 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
14720 7d 0a 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53  }..  releaseAllS
14730 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72  avepoints(pPager
14740 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  );.  assert( isO
14750 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
14760 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a   || pPager->pInJ
14770 6f 75 72 6e 61 6c 3d 3d 30 20 0a 20 20 20 20 20  ournal==0 .     
14780 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65   || (sqlite3OsDe
14790 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
147a0 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26  ics(pPager->fd)&
147b0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 42 41 54  SQLITE_IOCAP_BAT
147c0 43 48 5f 41 54 4f 4d 49 43 29 0a 20 20 29 3b 0a  CH_ATOMIC).  );.
147d0 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
147e0 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
147f0 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
14800 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
14810 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a  ..    /* Finaliz
14820 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
14830 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  le. */.    if( s
14840 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 49 73 49  qlite3JournalIsI
14850 6e 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e  nMemory(pPager->
14860 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  jfd) ){.      /*
14870 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
14880 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
14890 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
148a0 4d 45 4d 4f 52 59 20 29 3b 20 2a 2f 0a 20 20 20  MEMORY ); */.   
148b0 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
148c0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
148d0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
148e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
148f0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
14900 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 29 7b  MODE_TRUNCATE ){
14910 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
14920 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30  r->journalOff==0
14930 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
14940 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
14950 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
14960 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
14970 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
14980 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  jfd, 0);.       
14990 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
149a0 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 66 75  OK && pPager->fu
149b0 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  llSync ){.      
149c0 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
149d0 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20 73 69   the new file si
149e0 7a 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ze is written in
149f0 74 6f 20 74 68 65 20 69 6e 6f 64 65 20 72 69 67  to the inode rig
14a00 68 74 20 61 77 61 79 2e 0a 20 20 20 20 20 20 20  ht away..       
14a10 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 20     ** Otherwise 
14a20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  the journal migh
14a30 74 20 72 65 73 75 72 72 65 63 74 20 66 6f 6c 6c  t resurrect foll
14a40 6f 77 69 6e 67 20 61 20 70 6f 77 65 72 20 6c 6f  owing a power lo
14a50 73 73 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20  ss and.         
14a60 20 2a 2a 20 63 61 75 73 65 20 74 68 65 20 6c 61   ** cause the la
14a70 73 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  st transaction t
14a80 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 20 53 65  o roll back.  Se
14a90 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68  e.          ** h
14aa0 74 74 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c 61 2e  ttps://bugzilla.
14ab0 6d 6f 7a 69 6c 6c 61 2e 6f 72 67 2f 73 68 6f 77  mozilla.org/show
14ac0 5f 62 75 67 2e 63 67 69 3f 69 64 3d 31 30 37 32  _bug.cgi?id=1072
14ad0 37 37 33 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  773.          */
14ae0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
14af0 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
14b00 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
14b10 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20  r->syncFlags);. 
14b20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
14b30 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
14b40 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
14b50 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61     }else if( pPa
14b60 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
14b70 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
14b80 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20  ODE_PERSIST.    
14b90 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 78    || (pPager->ex
14ba0 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70  clusiveMode && p
14bb0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
14bc0 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
14bd0 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20 20 20 20 29  LMODE_WAL).    )
14be0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a 65 72  {.      rc = zer
14bf0 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  oJournalHdr(pPag
14c00 65 72 2c 20 68 61 73 4d 61 73 74 65 72 7c 7c 70  er, hasMaster||p
14c10 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29  Pager->tempFile)
14c20 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
14c30 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
14c40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14c50 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
14c60 6d 61 79 20 62 65 20 65 78 65 63 75 74 65 64 20  may be executed 
14c70 77 69 74 68 20 50 61 67 65 72 2e 6a 6f 75 72 6e  with Pager.journ
14c80 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 20 69  alMode==MEMORY i
14c90 66 0a 20 20 20 20 20 20 2a 2a 20 61 20 68 6f 74  f.      ** a hot
14ca0 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6a 75 73  -journal was jus
14cb0 74 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49  t rolled back. I
14cc0 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
14cd0 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a  journal.      **
14ce0 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20   file should be 
14cf0 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74  closed and delet
14d00 65 64 2e 20 49 66 20 74 68 69 73 20 63 6f 6e 6e  ed. If this conn
14d10 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20 74 6f  ection writes to
14d20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61  .      ** the da
14d30 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74 20  tabase file, it 
14d40 77 69 6c 6c 20 64 6f 20 73 6f 20 75 73 69 6e 67  will do so using
14d50 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f   an in-memory jo
14d60 75 72 6e 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a  urnal..      */.
14d70 20 20 20 20 20 20 69 6e 74 20 62 44 65 6c 65 74        int bDelet
14d80 65 20 3d 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  e = !pPager->tem
14d90 70 46 69 6c 65 3b 0a 20 20 20 20 20 20 61 73 73  pFile;.      ass
14da0 65 72 74 28 20 73 71 6c 69 74 65 33 4a 6f 75 72  ert( sqlite3Jour
14db0 6e 61 6c 49 73 49 6e 4d 65 6d 6f 72 79 28 70 50  nalIsInMemory(pP
14dc0 61 67 65 72 2d 3e 6a 66 64 29 3d 3d 30 20 29 3b  ager->jfd)==0 );
14dd0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
14de0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
14df0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
14e00 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 0a 20 20  LMODE_DELETE .  
14e10 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67           || pPag
14e20 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
14e30 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
14e40 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20 20  DE_MEMORY .     
14e50 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
14e60 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
14e70 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
14e80 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20  WAL .      );.  
14e90 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
14ea0 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
14eb0 0a 20 20 20 20 20 20 69 66 28 20 62 44 65 6c 65  .      if( bDele
14ec0 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  te ){.        rc
14ed0 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65   = sqlite3OsDele
14ee0 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c  te(pPager->pVfs,
14ef0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
14f00 6c 2c 20 70 50 61 67 65 72 2d 3e 65 78 74 72 61  l, pPager->extra
14f10 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Sync);.      }. 
14f20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66     }.  }..#ifdef
14f30 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
14f40 47 45 53 0a 20 20 73 71 6c 69 74 65 33 50 63 61  GES.  sqlite3Pca
14f50 63 68 65 49 74 65 72 61 74 65 44 69 72 74 79 28  cheIterateDirty(
14f60 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
14f70 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68   pager_set_pageh
14f80 61 73 68 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ash);.  if( pPag
14f90 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 20 26 26  er->dbSize==0 &&
14fa0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
14fb0 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
14fc0 50 43 61 63 68 65 29 3e 30 20 29 7b 0a 20 20 20  PCache)>0 ){.   
14fd0 20 50 67 48 64 72 20 2a 70 20 3d 20 73 71 6c 69   PgHdr *p = sqli
14fe0 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70  te3PagerLookup(p
14ff0 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 69  Pager, 1);.    i
15000 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 70 2d  f( p ){.      p-
15010 3e 70 61 67 65 48 61 73 68 20 3d 20 30 3b 0a 20  >pageHash = 0;. 
15020 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
15030 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 29  rUnrefNotNull(p)
15040 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
15050 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74  if..  sqlite3Bit
15060 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
15070 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->pInJournal);.
15080 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
15090 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67  rnal = 0;.  pPag
150a0 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
150b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
150c0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 4d 45 4d  K ){.    if( MEM
150d0 44 42 20 7c 7c 20 70 61 67 65 72 46 6c 75 73 68  DB || pagerFlush
150e0 4f 6e 43 6f 6d 6d 69 74 28 70 50 61 67 65 72 2c  OnCommit(pPager,
150f0 20 62 43 6f 6d 6d 69 74 29 20 29 7b 0a 20 20 20   bCommit) ){.   
15100 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
15110 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d  CleanAll(pPager-
15120 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20 7d  >pPCache);.    }
15130 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
15140 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 57 72  te3PcacheClearWr
15150 69 74 61 62 6c 65 28 70 50 61 67 65 72 2d 3e 70  itable(pPager->p
15160 50 43 61 63 68 65 29 3b 0a 20 20 20 20 7d 0a 20  PCache);.    }. 
15170 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
15180 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
15190 3e 70 50 43 61 63 68 65 2c 20 70 50 61 67 65 72  >pPCache, pPager
151a0 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a  ->dbSize);.  }..
151b0 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
151c0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
151d0 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 57 41 4c   /* Drop the WAL
151e0 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 69 66 20   write-lock, if 
151f0 61 6e 79 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68  any. Also, if th
15200 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73  e connection was
15210 20 69 6e 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b   in .    ** lock
15220 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
15230 76 65 20 6d 6f 64 65 20 62 75 74 20 69 73 20 6e  ve mode but is n
15240 6f 20 6c 6f 6e 67 65 72 2c 20 64 72 6f 70 20 74  o longer, drop t
15250 68 65 20 45 58 43 4c 55 53 49 56 45 20 0a 20 20  he EXCLUSIVE .  
15260 20 20 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 6f    ** lock held o
15270 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
15280 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
15290 72 63 32 20 3d 20 73 71 6c 69 74 65 33 57 61 6c  rc2 = sqlite3Wal
152a0 45 6e 64 57 72 69 74 65 54 72 61 6e 73 61 63 74  EndWriteTransact
152b0 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ion(pPager->pWal
152c0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
152d0 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  c2==SQLITE_OK );
152e0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d  .  }else if( rc=
152f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43  =SQLITE_OK && bC
15300 6f 6d 6d 69 74 20 26 26 20 70 50 61 67 65 72 2d  ommit && pPager-
15310 3e 64 62 46 69 6c 65 53 69 7a 65 3e 70 50 61 67  >dbFileSize>pPag
15320 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20  er->dbSize ){.  
15330 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
15340 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 63   is taken when c
15350 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e  ommitting a tran
15360 73 61 63 74 69 6f 6e 20 69 6e 20 72 6f 6c 6c 62  saction in rollb
15370 61 63 6b 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  ack-journal.    
15380 2a 2a 20 6d 6f 64 65 20 69 66 20 74 68 65 20 64  ** mode if the d
15390 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
153a0 64 69 73 6b 20 69 73 20 6c 61 72 67 65 72 20 74  disk is larger t
153b0 68 61 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  han the database
153c0 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 20 41   image..    ** A
153d0 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  t this point the
153e0 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65   journal has bee
153f0 6e 20 66 69 6e 61 6c 69 7a 65 64 20 61 6e 64 20  n finalized and 
15400 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
15410 0a 20 20 20 20 2a 2a 20 73 75 63 63 65 73 73 66  .    ** successf
15420 75 6c 6c 79 20 63 6f 6d 6d 69 74 74 65 64 2c 20  ully committed, 
15430 62 75 74 20 74 68 65 20 45 58 43 4c 55 53 49 56  but the EXCLUSIV
15440 45 20 6c 6f 63 6b 20 69 73 20 73 74 69 6c 6c 20  E lock is still 
15450 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 20 20  held on the.    
15460 2a 2a 20 66 69 6c 65 2e 20 53 6f 20 69 74 20 69  ** file. So it i
15470 73 20 73 61 66 65 20 74 6f 20 74 72 75 6e 63 61  s safe to trunca
15480 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
15490 66 69 6c 65 20 74 6f 20 69 74 73 20 6d 69 6e 69  file to its mini
154a0 6d 75 6d 0a 20 20 20 20 2a 2a 20 72 65 71 75 69  mum.    ** requi
154b0 72 65 64 20 73 69 7a 65 2e 20 20 2a 2f 0a 20 20  red size.  */.  
154c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
154d0 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
154e0 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72  VE_LOCK );.    r
154f0 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61  c = pager_trunca
15500 74 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  te(pPager, pPage
15510 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a  r->dbSize);.  }.
15520 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
15530 45 5f 4f 4b 20 26 26 20 62 43 6f 6d 6d 69 74 20  E_OK && bCommit 
15540 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
15550 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
15560 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c  (pPager->fd, SQL
15570 49 54 45 5f 46 43 4e 54 4c 5f 43 4f 4d 4d 49 54  ITE_FCNTL_COMMIT
15580 5f 50 48 41 53 45 54 57 4f 2c 20 30 29 3b 0a 20  _PHASETWO, 0);. 
15590 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
155a0 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 20 72 63 20  E_NOTFOUND ) rc 
155b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
155c0 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ..  if( !pPager-
155d0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a  >exclusiveMode .
155e0 20 20 20 26 26 20 28 21 70 61 67 65 72 55 73 65     && (!pagerUse
155f0 57 61 6c 28 70 50 61 67 65 72 29 20 7c 7c 20 73  Wal(pPager) || s
15600 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69  qlite3WalExclusi
15610 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70  veMode(pPager->p
15620 57 61 6c 2c 20 30 29 29 0a 20 20 29 7b 0a 20 20  Wal, 0)).  ){.  
15630 20 20 72 63 32 20 3d 20 70 61 67 65 72 55 6e 6c    rc2 = pagerUnl
15640 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48  ockDb(pPager, SH
15650 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
15660 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
15670 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d  untDone = 0;.  }
15680 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  .  pPager->eStat
15690 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52  e = PAGER_READER
156a0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  ;.  pPager->setM
156b0 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72 65  aster = 0;..  re
156c0 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45  turn (rc==SQLITE
156d0 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a  _OK?rc2:rc);.}..
156e0 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20  /*.** Execute a 
156f0 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72  rollback if a tr
15700 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
15710 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ive and unlock t
15720 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  he .** database 
15730 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  file. .**.** If 
15740 74 68 65 20 70 61 67 65 72 20 68 61 73 20 61 6c  the pager has al
15750 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68  ready entered th
15760 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 64  e ERROR state, d
15770 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a  o not attempt .*
15780 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61  * the rollback a
15790 74 20 74 68 69 73 20 74 69 6d 65 2e 20 49 6e 73  t this time. Ins
157a0 74 65 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f  tead, pager_unlo
157b0 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20  ck() is called. 
157c0 54 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70  The.** call to p
157d0 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69  ager_unlock() wi
157e0 6c 6c 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69  ll discard all i
157f0 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c 20  n-memory pages, 
15800 75 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61  unlock.** the da
15810 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
15820 6d 6f 76 65 20 74 68 65 20 70 61 67 65 72 20 62  move the pager b
15830 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ack to OPEN stat
15840 65 2e 20 49 66 20 74 68 69 73 20 0a 2a 2a 20 6d  e. If this .** m
15850 65 61 6e 73 20 74 68 61 74 20 74 68 65 72 65 20  eans that there 
15860 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  is a hot-journal
15870 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c   left in the fil
15880 65 2d 73 79 73 74 65 6d 2c 20 74 68 65 20 6e 65  e-system, the ne
15890 78 74 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  xt .** connectio
158a0 6e 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68  n to obtain a sh
158b0 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ared lock on the
158c0 20 70 61 67 65 72 20 28 77 68 69 63 68 20 6d 61   pager (which ma
158d0 79 20 62 65 20 74 68 69 73 20 6f 6e 65 29 20 0a  y be this one) .
158e0 2a 2a 20 77 69 6c 6c 20 72 6f 6c 6c 20 69 74 20  ** will roll it 
158f0 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
15900 68 65 20 70 61 67 65 72 20 68 61 73 20 6e 6f 74  he pager has not
15910 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64   already entered
15920 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
15930 2c 20 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a  , but an IO or.*
15940 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f  * malloc error o
15950 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 72  ccurs during a r
15960 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74 68  ollback, then th
15970 69 73 20 77 69 6c 6c 20 69 74 73 65 6c 66 20 63  is will itself c
15980 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67  ause .** the pag
15990 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20  er to enter the 
159a0 45 52 52 4f 52 20 73 74 61 74 65 2e 20 57 68 69  ERROR state. Whi
159b0 63 68 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72  ch will be clear
159c0 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c  ed by the.** cal
159d0 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63  l to pager_unloc
159e0 6b 28 29 2c 20 61 73 20 64 65 73 63 72 69 62 65  k(), as describe
159f0 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74  d above..*/.stat
15a00 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c  ic void pagerUnl
15a10 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50  ockAndRollback(P
15a20 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
15a30 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
15a40 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
15a50 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61   && pPager->eSta
15a60 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te!=PAGER_OPEN )
15a70 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 73  {.    assert( as
15a80 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
15a90 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
15aa0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  if( pPager->eSta
15ab0 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
15ac0 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 20  _LOCKED ){.     
15ad0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
15ae0 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
15af0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
15b00 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
15b10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e  .      sqlite3En
15b20 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
15b30 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21  .    }else if( !
15b40 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
15b50 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 61  eMode ){.      a
15b60 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
15b70 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
15b80 44 45 52 20 29 3b 0a 20 20 20 20 20 20 70 61 67  DER );.      pag
15b90 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
15ba0 6f 6e 28 70 50 61 67 65 72 2c 20 30 2c 20 30 29  on(pPager, 0, 0)
15bb0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61  ;.    }.  }.  pa
15bc0 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65  ger_unlock(pPage
15bd0 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  r);.}../*.** Par
15be0 61 6d 65 74 65 72 20 61 44 61 74 61 20 6d 75 73  ameter aData mus
15bf0 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  t point to a buf
15c00 66 65 72 20 6f 66 20 70 50 61 67 65 72 2d 3e 70  fer of pPager->p
15c10 61 67 65 53 69 7a 65 20 62 79 74 65 73 0a 2a 2a  ageSize bytes.**
15c20 20 6f 66 20 64 61 74 61 2e 20 43 6f 6d 70 75 74   of data. Comput
15c30 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63  e and return a c
15c40 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e  hecksum based on
15c50 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  t the contents o
15c60 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 6f  f the .** page o
15c70 66 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 63  f data and the c
15c80 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20  urrent value of 
15c90 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
15ca0 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  t..**.** This is
15cb0 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63   not a real chec
15cc0 6b 73 75 6d 2e 20 49 74 20 69 73 20 72 65 61 6c  ksum. It is real
15cd0 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20  ly just the sum 
15ce0 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f  of the .** rando
15cf0 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  m initial value 
15d00 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  (pPager->cksumIn
15d10 69 74 29 20 61 6e 64 20 65 76 65 72 79 20 32 30  it) and every 20
15d20 30 74 68 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74  0th byte.** of t
15d30 68 65 20 70 61 67 65 20 64 61 74 61 2c 20 73 74  he page data, st
15d40 61 72 74 69 6e 67 20 77 69 74 68 20 62 79 74 65  arting with byte
15d50 20 6f 66 66 73 65 74 20 28 70 50 61 67 65 72 2d   offset (pPager-
15d60 3e 70 61 67 65 53 69 7a 65 25 32 30 30 29 2e 0a  >pageSize%200)..
15d70 2a 2a 20 45 61 63 68 20 62 79 74 65 20 69 73 20  ** Each byte is 
15d80 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61  interpreted as a
15d90 6e 20 38 2d 62 69 74 20 75 6e 73 69 67 6e 65 64  n 8-bit unsigned
15da0 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20   integer..**.** 
15db0 43 68 61 6e 67 69 6e 67 20 74 68 65 20 66 6f 72  Changing the for
15dc0 6d 75 6c 61 20 75 73 65 64 20 74 6f 20 63 6f 6d  mula used to com
15dd0 70 75 74 65 20 74 68 69 73 20 63 68 65 63 6b 73  pute this checks
15de0 75 6d 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e  um results in an
15df0 0a 2a 2a 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65  .** incompatible
15e00 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
15e10 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a  rmat..**.** If j
15e20 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f  ournal corruptio
15e30 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20  n occurs due to 
15e40 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c  a power failure,
15e50 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79   the most likely
15e60 20 0a 2a 2a 20 73 63 65 6e 61 72 69 6f 20 69 73   .** scenario is
15e70 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72   that one end or
15e80 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68   the other of th
15e90 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65  e record will be
15ea0 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 74   changed. .** It
15eb0 20 69 73 20 6d 75 63 68 20 6c 65 73 73 20 6c 69   is much less li
15ec0 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20 74 77  kely that the tw
15ed0 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f  o ends of the jo
15ee0 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c  urnal record wil
15ef0 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20  l be.** correct 
15f00 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62  and the middle b
15f10 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73  e corrupt.  Thus
15f20 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d  , this "checksum
15f30 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f  " scheme,.** tho
15f40 75 67 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d  ugh fast and sim
15f50 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68 65  ple, catches the
15f60 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b   mostly likely k
15f70 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f  ind of corruptio
15f80 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  n..*/.static u32
15f90 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67   pager_cksum(Pag
15fa0 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
15fb0 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20 20  t u8 *aData){.  
15fc0 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67  u32 cksum = pPag
15fd0 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 20 20  er->cksumInit;  
15fe0 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
15ff0 75 6d 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75  um value to retu
16000 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20  rn */.  int i = 
16010 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
16020 2d 32 30 30 3b 20 20 20 20 20 20 20 20 20 20 2f  -200;          /
16030 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
16040 2f 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29  /.  while( i>0 )
16050 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61  {.    cksum += a
16060 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d  Data[i];.    i -
16070 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74  = 200;.  }.  ret
16080 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a  urn cksum;.}../*
16090 0a 2a 2a 20 52 65 70 6f 72 74 20 74 68 65 20 63  .** Report the c
160a0 75 72 72 65 6e 74 20 70 61 67 65 20 73 69 7a 65  urrent page size
160b0 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 72   and number of r
160c0 65 73 65 72 76 65 64 20 62 79 74 65 73 20 62 61  eserved bytes ba
160d0 63 6b 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f 64  ck.** to the cod
160e0 65 63 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ec..*/.#ifdef SQ
160f0 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 73  LITE_HAS_CODEC.s
16100 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
16110 52 65 70 6f 72 74 53 69 7a 65 28 50 61 67 65 72  ReportSize(Pager
16120 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
16130 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53   pPager->xCodecS
16140 69 7a 65 43 68 6e 67 20 29 7b 0a 20 20 20 20 70  izeChng ){.    p
16150 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a  Pager->xCodecSiz
16160 65 43 68 6e 67 28 70 50 61 67 65 72 2d 3e 70 43  eChng(pPager->pC
16170 6f 64 65 63 2c 20 70 50 61 67 65 72 2d 3e 70 61  odec, pPager->pa
16180 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20  geSize,.        
16190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161a0 20 20 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e     (int)pPager->
161b0 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 7d 0a 7d  nReserve);.  }.}
161c0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
161d0 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28  pagerReportSize(
161e0 58 29 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20  X)     /* No-op 
161f0 69 66 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70  if we do not sup
16200 70 6f 72 74 20 61 20 63 6f 64 65 63 20 2a 2f 0a  port a codec */.
16210 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
16220 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
16230 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
16240 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
16250 73 65 72 76 65 64 20 62 69 74 73 20 69 73 20 74  served bits is t
16260 68 65 20 73 61 6d 65 20 69 6e 20 74 68 65 20 64  he same in the d
16270 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 70 61  estination.** pa
16280 67 65 72 20 61 73 20 69 74 20 69 73 20 69 6e 20  ger as it is in 
16290 74 68 65 20 73 6f 75 72 63 65 2e 20 20 54 68 69  the source.  Thi
162a0 73 20 63 6f 6d 65 73 20 75 70 20 77 68 65 6e 20  s comes up when 
162b0 61 20 56 41 43 55 55 4d 20 63 68 61 6e 67 65 73  a VACUUM changes
162c0 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f   the.** number o
162d0 66 20 72 65 73 65 72 76 65 64 20 62 69 74 73 20  f reserved bits 
162e0 74 6f 20 74 68 65 20 22 6f 70 74 69 6d 61 6c 22  to the "optimal"
162f0 20 61 6d 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64   amount..*/.void
16300 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 6c 69   sqlite3PagerAli
16310 67 6e 52 65 73 65 72 76 65 28 50 61 67 65 72 20  gnReserve(Pager 
16320 2a 70 44 65 73 74 2c 20 50 61 67 65 72 20 2a 70  *pDest, Pager *p
16330 53 72 63 29 7b 0a 20 20 69 66 28 20 70 44 65 73  Src){.  if( pDes
16340 74 2d 3e 6e 52 65 73 65 72 76 65 21 3d 70 53 72  t->nReserve!=pSr
16350 63 2d 3e 6e 52 65 73 65 72 76 65 20 29 7b 0a 20  c->nReserve ){. 
16360 20 20 20 70 44 65 73 74 2d 3e 6e 52 65 73 65 72     pDest->nReser
16370 76 65 20 3d 20 70 53 72 63 2d 3e 6e 52 65 73 65  ve = pSrc->nRese
16380 72 76 65 3b 0a 20 20 20 20 70 61 67 65 72 52 65  rve;.    pagerRe
16390 70 6f 72 74 53 69 7a 65 28 70 44 65 73 74 29 3b  portSize(pDest);
163a0 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
163b0 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67  *.** Read a sing
163c0 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 65 69 74  le page from eit
163d0 68 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  her the journal 
163e0 66 69 6c 65 20 28 69 66 20 69 73 4d 61 69 6e 4a  file (if isMainJ
163f0 72 6e 6c 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66 72  rnl==1) or.** fr
16400 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
16410 61 6c 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e  al (if isMainJrn
16420 6c 3d 3d 30 29 20 61 6e 64 20 70 6c 61 79 62 61  l==0) and playba
16430 63 6b 20 74 68 61 74 20 70 61 67 65 2e 0a 2a 2a  ck that page..**
16440 20 54 68 65 20 70 61 67 65 20 62 65 67 69 6e 73   The page begins
16450 20 61 74 20 6f 66 66 73 65 74 20 2a 70 4f 66 66   at offset *pOff
16460 73 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c  set into the fil
16470 65 2e 20 54 68 65 20 2a 70 4f 66 66 73 65 74 0a  e. The *pOffset.
16480 2a 2a 20 76 61 6c 75 65 20 69 73 20 69 6e 63 72  ** value is incr
16490 65 61 73 65 64 20 74 6f 20 74 68 65 20 73 74 61  eased to the sta
164a0 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70  rt of the next p
164b0 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  age in the journ
164c0 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  al..**.** The ma
164d0 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  in rollback jour
164e0 6e 61 6c 20 75 73 65 73 20 63 68 65 63 6b 73 75  nal uses checksu
164f0 6d 73 20 2d 20 74 68 65 20 73 74 61 74 65 6d 65  ms - the stateme
16500 6e 74 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20  nt journal does 
16510 0a 2a 2a 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49  .** not..**.** I
16520 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  f the page numbe
16530 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 72 65  r of the page re
16540 63 6f 72 64 20 72 65 61 64 20 66 72 6f 6d 20 74  cord read from t
16550 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c  he (sub-)journal
16560 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61   file.** is grea
16570 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72  ter than the cur
16580 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 50 61  rent value of Pa
16590 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 65 6e  ger.dbSize, then
165a0 20 70 6c 61 79 62 61 63 6b 20 69 73 0a 2a 2a 20   playback is.** 
165b0 73 6b 69 70 70 65 64 20 61 6e 64 20 53 51 4c 49  skipped and SQLI
165c0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
165d0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e  d..**.** If pDon
165e0 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  e is not NULL, t
165f0 68 65 6e 20 69 74 20 69 73 20 61 20 72 65 63 6f  hen it is a reco
16600 72 64 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  rd of pages that
16610 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a   have already.**
16620 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63   been played bac
16630 6b 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  k.  If the page 
16640 61 74 20 2a 70 4f 66 66 73 65 74 20 68 61 73 20  at *pOffset has 
16650 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61  already been pla
16660 79 65 64 20 62 61 63 6b 0a 2a 2a 20 28 69 66 20  yed back.** (if 
16670 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
16680 67 20 70 44 6f 6e 65 20 62 69 74 20 69 73 20 73  g pDone bit is s
16690 65 74 29 20 74 68 65 6e 20 73 6b 69 70 20 74 68  et) then skip th
166a0 65 20 70 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d  e playback..** M
166b0 61 6b 65 20 73 75 72 65 20 74 68 65 20 70 44 6f  ake sure the pDo
166c0 6e 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e  ne bit correspon
166d0 64 69 6e 67 20 74 6f 20 74 68 65 20 2a 70 4f 66  ding to the *pOf
166e0 66 73 65 74 20 70 61 67 65 20 69 73 20 73 65 74  fset page is set
166f0 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 72 65 74  .** prior to ret
16700 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  urning..**.** If
16710 20 74 68 65 20 70 61 67 65 20 72 65 63 6f 72 64   the page record
16720 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79   is successfully
16730 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28   read from the (
16740 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c  sub-)journal fil
16750 65 0a 2a 2a 20 61 6e 64 20 70 6c 61 79 65 64 20  e.** and played 
16760 62 61 63 6b 2c 20 74 68 65 6e 20 53 51 4c 49 54  back, then SQLIT
16770 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
16780 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
16790 20 6f 63 63 75 72 73 0a 2a 2a 20 77 68 69 6c 65   occurs.** while
167a0 20 72 65 61 64 69 6e 67 20 74 68 65 20 72 65 63   reading the rec
167b0 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75  ord from the (su
167c0 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  b-)journal file 
167d0 6f 72 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67  or while writing
167e0 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62  .** to the datab
167f0 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 74  ase file, then t
16800 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
16810 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
16820 20 64 61 74 61 0a 2a 2a 20 69 73 20 73 75 63 63   data.** is succ
16830 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72  essfully read fr
16840 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75  om the (sub-)jou
16850 72 6e 61 6c 20 66 69 6c 65 20 62 75 74 20 61 70  rnal file but ap
16860 70 65 61 72 73 20 74 6f 20 62 65 0a 2a 2a 20 63  pears to be.** c
16870 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45  orrupted, SQLITE
16880 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65  _DONE is returne
16890 64 2e 20 44 61 74 61 20 69 73 20 63 6f 6e 73 69  d. Data is consi
168a0 64 65 72 65 64 20 63 6f 72 72 75 70 74 65 64 20  dered corrupted 
168b0 69 6e 0a 2a 2a 20 74 77 6f 20 63 69 72 63 75 6d  in.** two circum
168c0 73 74 61 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20  stances:.** .** 
168d0 20 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72    * If the recor
168e0 64 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73  d page-number is
168f0 20 69 6c 6c 65 67 61 6c 20 28 30 20 6f 72 20 50   illegal (0 or P
16900 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f  AGER_MJ_PGNO), o
16910 72 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20  r.**   * If the 
16920 72 65 63 6f 72 64 20 69 73 20 62 65 69 6e 67 20  record is being 
16930 72 6f 6c 6c 65 64 20 62 61 63 6b 20 66 72 6f 6d  rolled back from
16940 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
16950 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61 6e  l file.**     an
16960 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 66  d the checksum f
16970 69 65 6c 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61  ield does not ma
16980 74 63 68 20 74 68 65 20 72 65 63 6f 72 64 20 63  tch the record c
16990 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65  ontent..**.** Ne
169a0 69 74 68 65 72 20 6f 66 20 74 68 65 73 65 20 74  ither of these t
169b0 77 6f 20 73 63 65 6e 61 72 69 6f 73 20 61 72 65  wo scenarios are
169c0 20 70 6f 73 73 69 62 6c 65 20 64 75 72 69 6e 67   possible during
169d0 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c   a savepoint rol
169e0 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  lback..**.** If 
169f0 74 68 69 73 20 69 73 20 61 20 73 61 76 65 70 6f  this is a savepo
16a00 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  int rollback, th
16a10 65 6e 20 6d 65 6d 6f 72 79 20 6d 61 79 20 68 61  en memory may ha
16a20 76 65 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63  ve to be dynamic
16a30 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65  ally.** allocate
16a40 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
16a50 6f 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  on. If this is t
16a60 68 65 20 63 61 73 65 20 61 6e 64 20 61 6e 20 61  he case and an a
16a70 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c  llocation fails,
16a80 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
16a90 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
16aa0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
16ab0 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
16ac0 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50  age(.  Pager *pP
16ad0 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ager,           
16ae0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
16af0 72 20 62 65 69 6e 67 20 70 6c 61 79 65 64 20 62  r being played b
16b00 61 63 6b 20 2a 2f 0a 20 20 69 36 34 20 2a 70 4f  ack */.  i64 *pO
16b10 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20  ffset,          
16b20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
16b30 20 6f 66 20 72 65 63 6f 72 64 20 74 6f 20 70 6c   of record to pl
16b40 61 79 62 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76  ayback */.  Bitv
16b50 65 63 20 2a 70 44 6f 6e 65 2c 20 20 20 20 20 20  ec *pDone,      
16b60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74            /* Bit
16b70 76 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72  vec of pages alr
16b80 65 61 64 79 20 70 6c 61 79 65 64 20 62 61 63 6b  eady played back
16b90 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61 69 6e   */.  int isMain
16ba0 4a 72 6e 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Jrnl,           
16bb0 20 20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e      /* 1 -> main
16bc0 20 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e 20 73   journal. 0 -> s
16bd0 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20  ub-journal. */. 
16be0 20 69 6e 74 20 69 73 53 61 76 65 70 6e 74 20 20   int isSavepnt  
16bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16c00 2a 20 54 72 75 65 20 66 6f 72 20 61 20 73 61 76  * True for a sav
16c10 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20  epoint rollback 
16c20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
16c30 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20    PgHdr *pPg;   
16c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c50 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70  /* An existing p
16c60 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65  age in the cache
16c70 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b   */.  Pgno pgno;
16c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c90 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
16ca0 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65  number of a page
16cb0 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   in journal */. 
16cc0 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20   u32 cksum;     
16cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16ce0 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20  * Checksum used 
16cf0 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b  for sanity check
16d00 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61  ing */.  char *a
16d10 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
16d20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
16d30 61 72 79 20 73 74 6f 72 61 67 65 20 66 6f 72 20  ary storage for 
16d40 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 73 71  the page */.  sq
16d50 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b  lite3_file *jfd;
16d60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
16d70 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
16d80 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  or for the journ
16d90 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  al file */.  int
16da0 20 69 73 53 79 6e 63 65 64 3b 20 20 20 20 20 20   isSynced;      
16db0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
16dc0 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 70 61  ue if journal pa
16dd0 67 65 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a  ge is synced */.
16de0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
16df0 53 5f 43 4f 44 45 43 0a 20 20 2f 2a 20 54 68 65  S_CODEC.  /* The
16e00 20 6a 72 6e 6c 45 6e 63 20 66 6c 61 67 20 69 73   jrnlEnc flag is
16e10 20 74 72 75 65 20 69 66 20 4a 6f 75 72 6e 61 6c   true if Journal
16e20 20 70 61 67 65 73 20 73 68 6f 75 6c 64 20 62 65   pages should be
16e30 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 0a   passed through.
16e40 20 20 2a 2a 20 74 68 65 20 63 6f 64 65 63 2e 20    ** the codec. 
16e50 20 49 74 20 69 73 20 66 61 6c 73 65 20 66 6f 72   It is false for
16e60 20 70 75 72 65 20 69 6e 2d 6d 65 6d 6f 72 79 20   pure in-memory 
16e70 6a 6f 75 72 6e 61 6c 73 2e 20 2a 2f 0a 20 20 63  journals. */.  c
16e80 6f 6e 73 74 20 69 6e 74 20 6a 72 6e 6c 45 6e 63  onst int jrnlEnc
16e90 20 3d 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c   = (isMainJrnl |
16ea0 7c 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e  | pPager->subjIn
16eb0 4d 65 6d 6f 72 79 3d 3d 30 29 3b 0a 23 65 6e 64  Memory==0);.#end
16ec0 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 28 69  if..  assert( (i
16ed0 73 4d 61 69 6e 4a 72 6e 6c 26 7e 31 29 3d 3d 30  sMainJrnl&~1)==0
16ee0 20 29 3b 20 20 20 20 20 20 2f 2a 20 69 73 4d 61   );      /* isMa
16ef0 69 6e 4a 72 6e 6c 20 69 73 20 30 20 6f 72 20 31  inJrnl is 0 or 1
16f00 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 69   */.  assert( (i
16f10 73 53 61 76 65 70 6e 74 26 7e 31 29 3d 3d 30 20  sSavepnt&~1)==0 
16f20 29 3b 20 20 20 20 20 20 20 2f 2a 20 69 73 53 61  );       /* isSa
16f30 76 65 70 6e 74 20 69 73 20 30 20 6f 72 20 31 20  vepnt is 0 or 1 
16f40 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4d  */.  assert( isM
16f50 61 69 6e 4a 72 6e 6c 20 7c 7c 20 70 44 6f 6e 65  ainJrnl || pDone
16f60 20 29 3b 20 20 20 20 20 2f 2a 20 70 44 6f 6e 65   );     /* pDone
16f70 20 61 6c 77 61 79 73 20 75 73 65 64 20 6f 6e 20   always used on 
16f80 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a  sub-journals */.
16f90 20 20 61 73 73 65 72 74 28 20 69 73 53 61 76 65    assert( isSave
16fa0 70 6e 74 20 7c 7c 20 70 44 6f 6e 65 3d 3d 30 20  pnt || pDone==0 
16fb0 29 3b 20 20 20 2f 2a 20 70 44 6f 6e 65 20 6e 65  );   /* pDone ne
16fc0 76 65 72 20 75 73 65 64 20 6f 6e 20 6e 6f 6e 2d  ver used on non-
16fd0 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20  savepoint */..  
16fe0 61 44 61 74 61 20 3d 20 70 50 61 67 65 72 2d 3e  aData = pPager->
16ff0 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 61 73 73  pTmpSpace;.  ass
17000 65 72 74 28 20 61 44 61 74 61 20 29 3b 20 20 20  ert( aData );   
17010 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74        /* Temp st
17020 6f 72 61 67 65 20 6d 75 73 74 20 68 61 76 65 20  orage must have 
17030 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c  already been all
17040 6f 63 61 74 65 64 20 2a 2f 0a 20 20 61 73 73 65  ocated */.  asse
17050 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  rt( pagerUseWal(
17060 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20 28 21  pPager)==0 || (!
17070 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 69 73  isMainJrnl && is
17080 53 61 76 65 70 6e 74 29 20 29 3b 0a 0a 20 20 2f  Savepnt) );..  /
17090 2a 20 45 69 74 68 65 72 20 74 68 65 20 73 74 61  * Either the sta
170a0 74 65 20 69 73 20 67 72 65 61 74 65 72 20 74 68  te is greater th
170b0 61 6e 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  an PAGER_WRITER_
170c0 43 41 43 48 45 4d 4f 44 20 28 61 20 74 72 61 6e  CACHEMOD (a tran
170d0 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 72  saction .  ** or
170e0 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62   savepoint rollb
170f0 61 63 6b 20 64 6f 6e 65 20 61 74 20 74 68 65 20  ack done at the 
17100 72 65 71 75 65 73 74 20 6f 66 20 74 68 65 20 63  request of the c
17110 61 6c 6c 65 72 29 20 6f 72 20 74 68 69 73 20 69  aller) or this i
17120 73 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75  s.  ** a hot-jou
17130 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49  rnal rollback. I
17140 66 20 69 74 20 69 73 20 61 20 68 6f 74 2d 6a 6f  f it is a hot-jo
17150 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20  urnal rollback, 
17160 74 68 65 20 70 61 67 65 72 0a 20 20 2a 2a 20 69  the pager.  ** i
17170 73 20 69 6e 20 73 74 61 74 65 20 4f 50 45 4e 20  s in state OPEN 
17180 61 6e 64 20 68 6f 6c 64 73 20 61 6e 20 45 58 43  and holds an EXC
17190 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 48 6f 74  LUSIVE lock. Hot
171a0 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
171b0 6b 0a 20 20 2a 2a 20 6f 6e 6c 79 20 72 65 61 64  k.  ** only read
171c0 73 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20  s from the main 
171d0 6a 6f 75 72 6e 61 6c 2c 20 6e 6f 74 20 74 68 65  journal, not the
171e0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20   sub-journal..  
171f0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
17200 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
17210 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
17220 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50  OD.       || (pP
17230 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
17240 47 45 52 5f 4f 50 45 4e 20 26 26 20 70 50 61 67  GER_OPEN && pPag
17250 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  er->eLock==EXCLU
17260 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a  SIVE_LOCK).  );.
17270 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
17280 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
17290 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20  WRITER_CACHEMOD 
172a0 7c 7c 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 3b  || isMainJrnl );
172b0 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
172c0 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20  page number and 
172d0 70 61 67 65 20 64 61 74 61 20 66 72 6f 6d 20 74  page data from t
172e0 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75  he journal or su
172f0 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  b-journal.  ** f
17300 69 6c 65 2e 20 52 65 74 75 72 6e 20 61 6e 20 65  ile. Return an e
17310 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65  rror code to the
17320 20 63 61 6c 6c 65 72 20 69 66 20 61 6e 20 49 4f   caller if an IO
17330 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 20   error occurs.. 
17340 20 2a 2f 0a 20 20 6a 66 64 20 3d 20 69 73 4d 61   */.  jfd = isMa
17350 69 6e 4a 72 6e 6c 20 3f 20 70 50 61 67 65 72 2d  inJrnl ? pPager-
17360 3e 6a 66 64 20 3a 20 70 50 61 67 65 72 2d 3e 73  >jfd : pPager->s
17370 6a 66 64 3b 0a 20 20 72 63 20 3d 20 72 65 61 64  jfd;.  rc = read
17380 33 32 62 69 74 73 28 6a 66 64 2c 20 2a 70 4f 66  32bits(jfd, *pOf
17390 66 73 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20  fset, &pgno);.  
173a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
173b0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
173c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
173d0 65 61 64 28 6a 66 64 2c 20 28 75 38 2a 29 61 44  ead(jfd, (u8*)aD
173e0 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
173f0 65 53 69 7a 65 2c 20 28 2a 70 4f 66 66 73 65 74  eSize, (*pOffset
17400 29 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  )+4);.  if( rc!=
17410 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
17420 72 6e 20 72 63 3b 0a 20 20 2a 70 4f 66 66 73 65  rn rc;.  *pOffse
17430 74 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  t += pPager->pag
17440 65 53 69 7a 65 20 2b 20 34 20 2b 20 69 73 4d 61  eSize + 4 + isMa
17450 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20  inJrnl*4;..  /* 
17460 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  Sanity checking 
17470 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54 68  on the page.  Th
17480 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72  is is more impor
17490 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67  tant that I orig
174a0 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75  inally.  ** thou
174b0 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72  ght.  If a power
174c0 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20   failure occurs 
174d0 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
174e0 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74  l is being writt
174f0 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c  en,.  ** it coul
17500 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20  d cause invalid 
17510 64 61 74 61 20 74 6f 20 62 65 20 77 72 69 74 74  data to be writt
17520 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
17530 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f  nal.  We need to
17540 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69  .  ** detect thi
17550 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28  s invalid data (
17560 77 69 74 68 20 68 69 67 68 20 70 72 6f 62 61 62  with high probab
17570 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72  ility) and ignor
17580 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  e it..  */.  if(
17590 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f   pgno==0 || pgno
175a0 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  ==PAGER_MJ_PGNO(
175b0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61  pPager) ){.    a
175c0 73 73 65 72 74 28 20 21 69 73 53 61 76 65 70 6e  ssert( !isSavepn
175d0 74 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  t );.    return 
175e0 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
175f0 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 50 67 6e  .  if( pgno>(Pgn
17600 6f 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  o)pPager->dbSize
17610 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65   || sqlite3Bitve
17620 63 54 65 73 74 28 70 44 6f 6e 65 2c 20 70 67 6e  cTest(pDone, pgn
17630 6f 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  o) ){.    return
17640 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
17650 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c    if( isMainJrnl
17660 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61   ){.    rc = rea
17670 64 33 32 62 69 74 73 28 6a 66 64 2c 20 28 2a 70  d32bits(jfd, (*p
17680 4f 66 66 73 65 74 29 2d 34 2c 20 26 63 6b 73 75  Offset)-4, &cksu
17690 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  m);.    if( rc )
176a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
176b0 69 66 28 20 21 69 73 53 61 76 65 70 6e 74 20 26  if( !isSavepnt &
176c0 26 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50  & pager_cksum(pP
176d0 61 67 65 72 2c 20 28 75 38 2a 29 61 44 61 74 61  ager, (u8*)aData
176e0 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20  )!=cksum ){.    
176f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17700 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  DONE;.    }.  }.
17710 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61  .  /* If this pa
17720 67 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ge has already b
17730 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20  een played back 
17740 62 65 66 6f 72 65 20 64 75 72 69 6e 67 20 74 68  before during th
17750 65 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20 72  e current.  ** r
17760 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 64 6f  ollback, then do
17770 6e 27 74 20 62 6f 74 68 65 72 20 74 6f 20 70 6c  n't bother to pl
17780 61 79 20 69 74 20 62 61 63 6b 20 61 67 61 69 6e  ay it back again
17790 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 6f  ..  */.  if( pDo
177a0 6e 65 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69  ne && (rc = sqli
177b0 74 65 33 42 69 74 76 65 63 53 65 74 28 70 44 6f  te3BitvecSet(pDo
177c0 6e 65 2c 20 70 67 6e 6f 29 29 21 3d 53 51 4c 49  ne, pgno))!=SQLI
177d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
177e0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
177f0 2a 20 57 68 65 6e 20 70 6c 61 79 69 6e 67 20 62  * When playing b
17800 61 63 6b 20 70 61 67 65 20 31 2c 20 72 65 73 74  ack page 1, rest
17810 6f 72 65 20 74 68 65 20 6e 52 65 73 65 72 76 65  ore the nReserve
17820 20 73 65 74 74 69 6e 67 0a 20 20 2a 2f 0a 20 20   setting.  */.  
17830 69 66 28 20 70 67 6e 6f 3d 3d 31 20 26 26 20 70  if( pgno==1 && p
17840 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 21  Pager->nReserve!
17850 3d 28 28 75 38 2a 29 61 44 61 74 61 29 5b 32 30  =((u8*)aData)[20
17860 5d 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  ] ){.    pPager-
17870 3e 6e 52 65 73 65 72 76 65 20 3d 20 28 28 75 38  >nReserve = ((u8
17880 2a 29 61 44 61 74 61 29 5b 32 30 5d 3b 0a 20 20  *)aData)[20];.  
17890 20 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a    pagerReportSiz
178a0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  e(pPager);.  }..
178b0 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
178c0 72 20 69 73 20 69 6e 20 43 41 43 48 45 4d 4f 44  r is in CACHEMOD
178d0 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68 65   state, then the
178e0 72 65 20 6d 75 73 74 20 62 65 20 61 20 63 6f 70  re must be a cop
178f0 79 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20 70  y of this.  ** p
17900 61 67 65 20 69 6e 20 74 68 65 20 70 61 67 65 72  age in the pager
17910 20 63 61 63 68 65 2e 20 49 6e 20 74 68 69 73 20   cache. In this 
17920 63 61 73 65 20 6a 75 73 74 20 75 70 64 61 74 65  case just update
17930 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
17940 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64  ,.  ** not the d
17950 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
17960 65 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 6d  e page is left m
17970 61 72 6b 65 64 20 64 69 72 74 79 20 69 6e 20 74  arked dirty in t
17980 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20  his case..  **. 
17990 20 2a 2a 20 41 6e 20 65 78 63 65 70 74 69 6f 6e   ** An exception
179a0 20 74 6f 20 74 68 65 20 61 62 6f 76 65 20 72 75   to the above ru
179b0 6c 65 3a 20 49 66 20 74 68 65 20 64 61 74 61 62  le: If the datab
179c0 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e  ase is in no-syn
179d0 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20  c mode.  ** and 
179e0 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20  a page is moved 
179f0 64 75 72 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d  during an increm
17a00 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 74 68 65  ental vacuum the
17a10 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79 0a 20  n the page may. 
17a20 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e 20 74 68   ** not be in th
17a30 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 4c  e pager cache. L
17a40 61 74 65 72 3a 20 69 66 20 61 20 6d 61 6c 6c 6f  ater: if a mallo
17a50 63 28 29 20 6f 72 20 49 4f 20 65 72 72 6f 72 20  c() or IO error 
17a60 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69  occurs.  ** duri
17a70 6e 67 20 61 20 4d 6f 76 65 70 61 67 65 28 29 20  ng a Movepage() 
17a80 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 70  call, then the p
17a90 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 69  age may not be i
17aa0 6e 20 74 68 65 20 63 61 63 68 65 0a 20 20 2a 2a  n the cache.  **
17ab0 20 65 69 74 68 65 72 2e 20 53 6f 20 74 68 65 20   either. So the 
17ac0 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69  condition descri
17ad0 62 65 64 20 69 6e 20 74 68 65 20 61 62 6f 76 65  bed in the above
17ae0 20 70 61 72 61 67 72 61 70 68 20 69 73 20 6e 6f   paragraph is no
17af0 74 0a 20 20 2a 2a 20 61 73 73 65 72 74 28 29 61  t.  ** assert()a
17b00 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ble..  **.  ** I
17b10 66 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f  f in WRITER_DBMO
17b20 44 2c 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48  D, WRITER_FINISH
17b30 45 44 20 6f 72 20 4f 50 45 4e 20 73 74 61 74 65  ED or OPEN state
17b40 2c 20 74 68 65 6e 20 77 65 20 75 70 64 61 74 65  , then we update
17b50 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 72 20   the.  ** pager 
17b60 63 61 63 68 65 20 69 66 20 69 74 20 65 78 69 73  cache if it exis
17b70 74 73 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20  ts and the main 
17b80 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69  file. The page i
17b90 73 20 74 68 65 6e 20 6d 61 72 6b 65 64 20 0a 20  s then marked . 
17ba0 20 2a 2a 20 6e 6f 74 20 64 69 72 74 79 2e 20 53   ** not dirty. S
17bb0 69 6e 63 65 20 74 68 69 73 20 63 6f 64 65 20 69  ince this code i
17bc0 73 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 64 20  s only executed 
17bd0 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74  in PAGER_OPEN st
17be0 61 74 65 20 66 6f 72 0a 20 20 2a 2a 20 61 20 68  ate for.  ** a h
17bf0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
17c00 61 63 6b 2c 20 69 74 20 69 73 20 67 75 61 72 61  ack, it is guara
17c10 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 20 70  nteed that the p
17c20 61 67 65 2d 63 61 63 68 65 20 69 73 20 65 6d 70  age-cache is emp
17c30 74 79 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 70  ty.  ** if the p
17c40 61 67 65 72 20 69 73 20 69 6e 20 4f 50 45 4e 20  ager is in OPEN 
17c50 73 74 61 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  state..  **.  **
17c60 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20   Ticket #1171:  
17c70 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  The statement jo
17c80 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74  urnal might cont
17c90 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  ain page content
17ca0 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69   that is.  ** di
17cb0 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65  fferent from the
17cc0 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74   page content at
17cd0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
17ce0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  e transaction.. 
17cf0 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20   ** This occurs 
17d00 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 20 63  when a page is c
17d10 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20  hanged prior to 
17d20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 73  the start of a s
17d30 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68  tatement.  ** th
17d40 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e  en changed again
17d50 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74   within the stat
17d60 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c  ement.  When rol
17d70 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61  ling back such a
17d80 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
17d90 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74  we must not writ
17da0 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  e to the origina
17db0 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73  l database unles
17dc0 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66  s we know.  ** f
17dd0 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61 74 20  or certain that 
17de0 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f  original page co
17df0 6e 74 65 6e 74 73 20 61 72 65 20 73 79 6e 63 65  ntents are synce
17e00 64 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  d into the main 
17e10 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f  rollback.  ** jo
17e20 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73  urnal.  Otherwis
17e30 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20  e, a power loss 
17e40 6d 69 67 68 74 20 6c 65 61 76 65 20 6d 6f 64 69  might leave modi
17e50 66 69 65 64 20 64 61 74 61 20 69 6e 20 74 68 65  fied data in the
17e60 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
17e70 69 6c 65 20 77 69 74 68 6f 75 74 20 61 6e 20 65  ile without an e
17e80 6e 74 72 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c  ntry in the roll
17e90 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61  back journal tha
17ea0 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f  t can.  ** resto
17eb0 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
17ec0 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
17ed0 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69  form.  Two condi
17ee0 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20 20  tions must be.  
17ef0 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72  ** met before wr
17f00 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  iting to the dat
17f10 61 62 61 73 65 20 66 69 6c 65 73 2e 20 28 31 29  abase files. (1)
17f20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   the database mu
17f30 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65  st be.  ** locke
17f40 64 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20  d.  (2) we know 
17f50 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61  that the origina
17f60 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69  l page content i
17f70 73 20 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20  s fully synced. 
17f80 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e 20   ** in the main 
17f90 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62  journal either b
17fa0 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20  ecause the page 
17fb0 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20  is not in cache 
17fc0 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65  or else.  ** the
17fd0 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20   page is marked 
17fe0 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a  as needSync==0..
17ff0 20 20 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30    **.  ** 2008-0
18000 34 2d 31 34 3a 20 20 57 68 65 6e 20 61 74 74 65  4-14:  When atte
18010 6d 70 74 69 6e 67 20 74 6f 20 76 61 63 75 75 6d  mpting to vacuum
18020 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
18030 61 73 65 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a  ase file, it.  *
18040 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  * is possible to
18050 20 66 61 69 6c 20 61 20 73 74 61 74 65 6d 65 6e   fail a statemen
18060 74 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20  t on a database 
18070 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 79 65  that does not ye
18080 74 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f  t exist..  ** Do
18090 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20   not attempt to 
180a0 77 72 69 74 65 20 69 66 20 64 61 74 61 62 61 73  write if databas
180b0 65 20 66 69 6c 65 20 68 61 73 20 6e 65 76 65 72  e file has never
180c0 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20   been opened..  
180d0 2a 2f 0a 20 20 69 66 28 20 70 61 67 65 72 55 73  */.  if( pagerUs
180e0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
180f0 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d      pPg = 0;.  }
18100 65 6c 73 65 7b 0a 20 20 20 20 70 50 67 20 3d 20  else{.    pPg = 
18110 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
18120 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
18130 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
18140 70 50 67 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b  pPg || !MEMDB );
18150 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
18160 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
18170 5f 4f 50 45 4e 20 7c 7c 20 70 50 67 3d 3d 30 20  _OPEN || pPg==0 
18180 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
18190 69 6c 65 20 29 3b 0a 20 20 50 41 47 45 52 54 52  ile );.  PAGERTR
181a0 41 43 45 28 28 22 50 4c 41 59 42 41 43 4b 20 25  ACE(("PLAYBACK %
181b0 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25  d page %d hash(%
181c0 30 38 78 29 20 25 73 5c 6e 22 2c 0a 20 20 20 20  08x) %s\n",.    
181d0 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
181e0 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61  Pager), pgno, pa
181f0 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61  ger_datahash(pPa
18200 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28  ger->pageSize, (
18210 75 38 2a 29 61 44 61 74 61 29 2c 0a 20 20 20 20  u8*)aData),.    
18220 20 20 20 20 20 20 20 28 69 73 4d 61 69 6e 4a 72         (isMainJr
18230 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c  nl?"main-journal
18240 22 3a 22 73 75 62 2d 6a 6f 75 72 6e 61 6c 22 29  ":"sub-journal")
18250 0a 20 20 29 29 3b 0a 20 20 69 66 28 20 69 73 4d  .  ));.  if( isM
18260 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 69  ainJrnl ){.    i
18270 73 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72  sSynced = pPager
18280 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 2a 70 4f  ->noSync || (*pO
18290 66 66 73 65 74 20 3c 3d 20 70 50 61 67 65 72 2d  ffset <= pPager-
182a0 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20  >journalHdr);.  
182b0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73 53 79 6e  }else{.    isSyn
182c0 63 65 64 20 3d 20 28 70 50 67 3d 3d 30 20 7c 7c  ced = (pPg==0 ||
182d0 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61 67 73 20   0==(pPg->flags 
182e0 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  & PGHDR_NEED_SYN
182f0 43 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  C));.  }.  if( i
18300 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
18310 29 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d  ).   && (pPager-
18320 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
18330 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70  RITER_DBMOD || p
18340 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
18350 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20 20 26 26  AGER_OPEN).   &&
18360 20 69 73 53 79 6e 63 65 64 0a 20 20 29 7b 0a 20   isSynced.  ){. 
18370 20 20 20 69 36 34 20 6f 66 73 74 20 3d 20 28 70     i64 ofst = (p
18380 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
18390 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
183a0 20 20 74 65 73 74 63 61 73 65 28 20 21 69 73 53    testcase( !isS
183b0 61 76 65 70 6e 74 20 26 26 20 70 50 67 21 3d 30  avepnt && pPg!=0
183c0 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67 73 26   && (pPg->flags&
183d0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
183e0 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
183f0 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
18400 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 20 20  pPager) );..    
18410 2f 2a 20 57 72 69 74 65 20 74 68 65 20 64 61 74  /* Write the dat
18420 61 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  a read from the 
18430 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 20 69 6e 74  journal back int
18440 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
18450 69 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73  ile..    ** This
18460 20 69 73 20 75 73 75 61 6c 6c 79 20 73 61 66 65   is usually safe
18470 20 65 76 65 6e 20 66 6f 72 20 61 6e 20 65 6e 63   even for an enc
18480 72 79 70 74 65 64 20 64 61 74 61 62 61 73 65 20  rypted database 
18490 2d 20 61 73 20 74 68 65 20 64 61 74 61 0a 20 20  - as the data.  
184a0 20 20 2a 2a 20 77 61 73 20 65 6e 63 72 79 70 74    ** was encrypt
184b0 65 64 20 62 65 66 6f 72 65 20 69 74 20 77 61 73  ed before it was
184c0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
184d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
184e0 65 20 65 78 63 65 70 74 69 6f 6e 0a 20 20 20 20  e exception.    
184f0 2a 2a 20 69 73 20 69 66 20 74 68 65 20 64 61 74  ** is if the dat
18500 61 20 77 61 73 20 6a 75 73 74 20 72 65 61 64 20  a was just read 
18510 66 72 6f 6d 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  from an in-memor
18520 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49  y sub-journal. I
18530 6e 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 63 61  n that.    ** ca
18540 73 65 20 69 74 20 6d 75 73 74 20 62 65 20 65 6e  se it must be en
18550 63 72 79 70 74 65 64 20 68 65 72 65 20 62 65 66  crypted here bef
18560 6f 72 65 20 69 74 20 69 73 20 63 6f 70 69 65 64  ore it is copied
18570 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
18580 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20  se.    ** file. 
18590 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
185a0 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20  E_HAS_CODEC.    
185b0 69 66 28 20 21 6a 72 6e 6c 45 6e 63 20 29 7b 0a  if( !jrnlEnc ){.
185c0 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61        CODEC2(pPa
185d0 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f  ger, aData, pgno
185e0 2c 20 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 7, rc=SQLITE_N
185f0 4f 4d 45 4d 5f 42 4b 50 54 2c 20 61 44 61 74 61  OMEM_BKPT, aData
18600 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
18610 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
18620 67 65 72 2d 3e 66 64 2c 20 28 75 38 20 2a 29 61  ger->fd, (u8 *)a
18630 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
18640 67 65 53 69 7a 65 2c 20 6f 66 73 74 29 3b 0a 20  geSize, ofst);. 
18650 20 20 20 20 20 43 4f 44 45 43 31 28 70 50 61 67       CODEC1(pPag
18660 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c  er, aData, pgno,
18670 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f   3, rc=SQLITE_NO
18680 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20 20 20 20 7d  MEM_BKPT);.    }
18690 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
186a0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
186b0 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
186c0 28 75 38 20 2a 29 61 44 61 74 61 2c 20 70 50 61  (u8 *)aData, pPa
186d0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
186e0 66 73 74 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  fst);..    if( p
186f0 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69  gno>pPager->dbFi
18700 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
18710 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
18720 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d  ze = pgno;.    }
18730 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
18740 3e 70 42 61 63 6b 75 70 20 29 7b 0a 23 69 66 64  >pBackup ){.#ifd
18750 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
18760 44 45 43 0a 20 20 20 20 20 20 69 66 28 20 6a 72  DEC.      if( jr
18770 6e 6c 45 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  nlEnc ){.       
18780 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
18790 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20  aData, pgno, 3, 
187a0 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rc=SQLITE_NOMEM_
187b0 42 4b 50 54 29 3b 0a 20 20 20 20 20 20 20 20 73  BKPT);.        s
187c0 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61  qlite3BackupUpda
187d0 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  te(pPager->pBack
187e0 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 61  up, pgno, (u8*)a
187f0 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 43  Data);.        C
18800 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 61 44  ODEC2(pPager, aD
18810 61 74 61 2c 20 70 67 6e 6f 2c 20 37 2c 20 72 63  ata, pgno, 7, rc
18820 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b  =SQLITE_NOMEM_BK
18830 50 54 2c 61 44 61 74 61 29 3b 0a 20 20 20 20 20  PT,aData);.     
18840 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
18850 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75      sqlite3Backu
18860 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e  pUpdate(pPager->
18870 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28  pBackup, pgno, (
18880 75 38 2a 29 61 44 61 74 61 29 3b 0a 20 20 20 20  u8*)aData);.    
18890 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69  }.  }else if( !i
188a0 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67  sMainJrnl && pPg
188b0 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ==0 ){.    /* If
188c0 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c 6c 62   this is a rollb
188d0 61 63 6b 20 6f 66 20 61 20 73 61 76 65 70 6f 69  ack of a savepoi
188e0 6e 74 20 61 6e 64 20 64 61 74 61 20 77 61 73 20  nt and data was 
188f0 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 0a 20  not written to. 
18900 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
18910 73 65 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  se and the page 
18920 69 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79  is not in-memory
18930 2c 20 74 68 65 72 65 20 69 73 20 61 20 70 6f 74  , there is a pot
18940 65 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72  ential.    ** pr
18950 6f 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65 20  oblem. When the 
18960 70 61 67 65 20 69 73 20 6e 65 78 74 20 66 65 74  page is next fet
18970 63 68 65 64 20 62 79 20 74 68 65 20 62 2d 74 72  ched by the b-tr
18980 65 65 20 6c 61 79 65 72 2c 20 69 74 20 0a 20 20  ee layer, it .  
18990 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 61    ** will be rea
189a0 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
189b0 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20  ase file, which 
189c0 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62  may or may not b
189d0 65 20 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e  e .    ** curren
189e0 74 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  t. .    **.    *
189f0 2a 20 54 68 65 72 65 20 61 72 65 20 61 20 63 6f  * There are a co
18a00 75 70 6c 65 20 6f 66 20 64 69 66 66 65 72 65 6e  uple of differen
18a10 74 20 77 61 79 73 20 74 68 69 73 20 63 61 6e 20  t ways this can 
18a20 68 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20  happen. All are 
18a30 71 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73  quite.    ** obs
18a40 63 75 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69  cure. When runni
18a50 6e 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75  ng in synchronou
18a60 73 20 6d 6f 64 65 2c 20 74 68 69 73 20 63 61 6e  s mode, this can
18a70 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20 20   only happen .  
18a80 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65    ** if the page
18a90 20 69 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d   is on the free-
18aa0 6c 69 73 74 20 61 74 20 74 68 65 20 73 74 61 72  list at the star
18ab0 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
18ac0 74 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a  tion, then.    *
18ad0 2a 20 70 6f 70 75 6c 61 74 65 64 2c 20 74 68 65  * populated, the
18ae0 6e 20 6d 6f 76 65 64 20 75 73 69 6e 67 20 73 71  n moved using sq
18af0 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61  lite3PagerMovepa
18b00 67 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ge()..    **.   
18b10 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e   ** The solution
18b20 20 69 73 20 74 6f 20 61 64 64 20 61 6e 20 69 6e   is to add an in
18b30 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 74 6f 20  -memory page to 
18b40 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69  the cache contai
18b50 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20  ning.    ** the 
18b60 64 61 74 61 20 6a 75 73 74 20 72 65 61 64 20 66  data just read f
18b70 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
18b80 6e 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70 61  nal. Mark the pa
18b90 67 65 20 61 73 20 64 69 72 74 79 20 0a 20 20 20  ge as dirty .   
18ba0 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65 20 70   ** and if the p
18bb0 61 67 65 72 20 72 65 71 75 69 72 65 73 20 61 20  ager requires a 
18bc0 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68  journal-sync, th
18bd0 65 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65  en mark the page
18be0 20 61 73 20 0a 20 20 20 20 2a 2a 20 72 65 71 75   as .    ** requ
18bf0 69 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d  iring a journal-
18c00 73 79 6e 63 20 62 65 66 6f 72 65 20 69 74 20 69  sync before it i
18c10 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a  s written..    *
18c20 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  /.    assert( is
18c30 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 61  Savepnt );.    a
18c40 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e  ssert( (pPager->
18c50 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49  doNotSpill & SPI
18c60 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 29  LLFLAG_ROLLBACK)
18c70 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ==0 );.    pPage
18c80 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d  r->doNotSpill |=
18c90 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42   SPILLFLAG_ROLLB
18ca0 41 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ACK;.    rc = sq
18cb0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50  lite3PagerGet(pP
18cc0 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67  ager, pgno, &pPg
18cd0 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 1);.    assert
18ce0 28 20 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  ( (pPager->doNot
18cf0 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41  Spill & SPILLFLA
18d00 47 5f 52 4f 4c 4c 42 41 43 4b 29 21 3d 30 20 29  G_ROLLBACK)!=0 )
18d10 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  ;.    pPager->do
18d20 4e 6f 74 53 70 69 6c 6c 20 26 3d 20 7e 53 50 49  NotSpill &= ~SPI
18d30 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 3b  LLFLAG_ROLLBACK;
18d40 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
18d50 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
18d60 72 63 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  rc;.    sqlite3P
18d70 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70  cacheMakeDirty(p
18d80 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  Pg);.  }.  if( p
18d90 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20  Pg ){.    /* No 
18da0 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72  page should ever
18db0 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72   be explicitly r
18dc0 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20  olled back that 
18dd0 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70  is in use, excep
18de0 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67  t.    ** for pag
18df0 65 20 31 20 77 68 69 63 68 20 69 73 20 68 65 6c  e 1 which is hel
18e00 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65  d in use in orde
18e10 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f  r to keep the lo
18e20 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ck on the.    **
18e30 20 64 61 74 61 62 61 73 65 20 61 63 74 69 76 65   database active
18e40 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68 20 61  . However such a
18e50 20 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c   page may be rol
18e60 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65  led back as a re
18e70 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61  sult.    ** of a
18e80 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72  n internal error
18e90 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e   resulting in an
18ea0 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20   automatic call 
18eb0 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  to.    ** sqlite
18ec0 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29  3PagerRollback()
18ed0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69  ..    */.    voi
18ee0 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 70 44  d *pData;.    pD
18ef0 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61  ata = pPg->pData
18f00 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61  ;.    memcpy(pDa
18f10 74 61 2c 20 28 75 38 2a 29 61 44 61 74 61 2c 20  ta, (u8*)aData, 
18f20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
18f30 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78  );.    pPager->x
18f40 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20  Reiniter(pPg);. 
18f50 20 20 20 2f 2a 20 49 74 20 75 73 65 64 20 74 6f     /* It used to
18f60 20 62 65 20 74 68 61 74 20 73 71 6c 69 74 65 33   be that sqlite3
18f70 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28  PcacheMakeClean(
18f80 70 50 67 29 20 77 61 73 20 63 61 6c 6c 65 64 20  pPg) was called 
18f90 68 65 72 65 2e 20 20 42 75 74 0a 20 20 20 20 2a  here.  But.    *
18fa0 2a 20 74 68 61 74 20 63 61 6c 6c 20 77 61 73 20  * that call was 
18fb0 64 61 6e 67 65 72 6f 75 73 20 61 6e 64 20 68 61  dangerous and ha
18fc0 64 20 6e 6f 20 64 65 74 65 63 74 61 62 6c 65 20  d no detectable 
18fd0 62 65 6e 65 66 69 74 20 73 69 6e 63 65 20 74 68  benefit since th
18fe0 65 20 63 61 63 68 65 0a 20 20 20 20 2a 2a 20 69  e cache.    ** i
18ff0 73 20 6e 6f 72 6d 61 6c 6c 79 20 63 6c 65 61 6e  s normally clean
19000 65 64 20 62 79 20 73 71 6c 69 74 65 33 50 63 61  ed by sqlite3Pca
19010 63 68 65 43 6c 65 61 6e 41 6c 6c 28 29 20 61 66  cheCleanAll() af
19020 74 65 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64  ter rollback and
19030 20 73 6f 0a 20 20 20 20 2a 2a 20 68 61 73 20 62   so.    ** has b
19040 65 65 6e 20 72 65 6d 6f 76 65 64 2e 20 2a 2f 0a  een removed. */.
19050 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61      pager_set_pa
19060 67 65 68 61 73 68 28 70 50 67 29 3b 0a 0a 20 20  gehash(pPg);..  
19070 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73    /* If this was
19080 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20 72 65   page 1, then re
19090 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20  store the value 
190a0 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  of Pager.dbFileV
190b0 65 72 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74  ers..    ** Do t
190c0 68 69 73 20 62 65 66 6f 72 65 20 61 6e 79 20 64  his before any d
190d0 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  ecoding. */.    
190e0 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20  if( pgno==1 ){. 
190f0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
19100 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
19110 20 26 28 28 75 38 2a 29 70 44 61 74 61 29 5b 32   &((u8*)pData)[2
19120 34 5d 2c 73 69 7a 65 6f 66 28 70 50 61 67 65 72  4],sizeof(pPager
19130 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
19140 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
19150 63 6f 64 65 20 74 68 65 20 70 61 67 65 20 6a 75  code the page ju
19160 73 74 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73  st read from dis
19170 6b 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  k */.#if SQLITE_
19180 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 69 66  HAS_CODEC.    if
19190 28 20 6a 72 6e 6c 45 6e 63 20 29 7b 20 43 4f 44  ( jrnlEnc ){ COD
191a0 45 43 31 28 70 50 61 67 65 72 2c 20 70 44 61 74  EC1(pPager, pDat
191b0 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 2c  a, pPg->pgno, 3,
191c0 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   rc=SQLITE_NOMEM
191d0 5f 42 4b 50 54 29 3b 20 7d 0a 23 65 6e 64 69 66  _BKPT); }.#endif
191e0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
191f0 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a  heRelease(pPg);.
19200 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
19210 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65  .}../*.** Parame
19220 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74  ter zMaster is t
19230 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73  he name of a mas
19240 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
19250 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e  . A single journ
19260 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20  al.** file that 
19270 72 65 66 65 72 72 65 64 20 74 6f 20 74 68 65 20  referred to the 
19280 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
19290 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65 65  ile has just bee
192a0 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  n rolled back..*
192b0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
192c0 68 65 63 6b 73 20 69 66 20 69 74 20 69 73 20 70  hecks if it is p
192d0 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74  ossible to delet
192e0 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
192f0 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e  rnal file,.** an
19300 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20  d does so if it 
19310 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65  is..**.** Argume
19320 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 70  nt zMaster may p
19330 6f 69 6e 74 20 74 6f 20 50 61 67 65 72 2e 70 54  oint to Pager.pT
19340 6d 70 53 70 61 63 65 2e 20 53 6f 20 74 68 61 74  mpSpace. So that
19350 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20 0a   buffer is not .
19360 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ** available for
19370 20 75 73 65 20 77 69 74 68 69 6e 20 74 68 69 73   use within this
19380 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
19390 20 57 68 65 6e 20 61 20 6d 61 73 74 65 72 20 6a   When a master j
193a0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63  ournal file is c
193b0 72 65 61 74 65 64 2c 20 69 74 20 69 73 20 70 6f  reated, it is po
193c0 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 65  pulated with the
193d0 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 61 6c   names .** of al
193e0 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20 6a  l of its child j
193f0 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65 20 61 66 74  ournals, one aft
19400 65 72 20 61 6e 6f 74 68 65 72 2c 20 66 6f 72 6d  er another, form
19410 61 74 74 65 64 20 61 73 20 75 74 66 2d 38 20 0a  atted as utf-8 .
19420 2a 2a 20 65 6e 63 6f 64 65 64 20 74 65 78 74 2e  ** encoded text.
19430 20 54 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68   The end of each
19440 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 66   child journal f
19450 69 6c 65 20 69 73 20 6d 61 72 6b 65 64 20 77 69  ile is marked wi
19460 74 68 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72  th a .** nul-ter
19470 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 28 30 78  minator byte (0x
19480 30 30 29 2e 20 69 2e 65 2e 20 74 68 65 20 65 6e  00). i.e. the en
19490 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66  tire contents of
194a0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
194b0 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 61 20  l.** file for a 
194c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 76 6f  transaction invo
194d0 6c 76 69 6e 67 20 74 77 6f 20 64 61 74 61 62 61  lving two databa
194e0 73 65 73 20 6d 69 67 68 74 20 62 65 3a 0a 2a 2a  ses might be:.**
194f0 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65 2f 62 69 6c  .**   "/home/bil
19500 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78  l/a.db-journal\x
19510 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64  00/home/bill/b.d
19520 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 22 0a 2a  b-journal\x00".*
19530 2a 0a 2a 2a 20 41 20 6d 61 73 74 65 72 20 6a 6f  *.** A master jo
19540 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f  urnal file may o
19550 6e 6c 79 20 62 65 20 64 65 6c 65 74 65 64 20 6f  nly be deleted o
19560 6e 63 65 20 61 6c 6c 20 6f 66 20 69 74 73 20 63  nce all of its c
19570 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  hild .** journal
19580 73 20 68 61 76 65 20 62 65 65 6e 20 72 6f 6c 6c  s have been roll
19590 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ed back..**.** T
195a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 61  his function rea
195b0 64 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ds the contents 
195c0 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f  of the master-jo
195d0 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20  urnal file into 
195e0 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6c  .** memory and l
195f0 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 65 61 63  oops through eac
19600 68 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6a  h of the child j
19610 6f 75 72 6e 61 6c 20 6e 61 6d 65 73 2e 20 46 6f  ournal names. Fo
19620 72 0a 2a 2a 20 65 61 63 68 20 63 68 69 6c 64 20  r.** each child 
19630 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 63 68 65 63  journal, it chec
19640 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  ks if:.**.**   *
19650 20 69 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f   if the child jo
19660 75 72 6e 61 6c 20 65 78 69 73 74 73 2c 20 61 6e  urnal exists, an
19670 64 20 69 66 20 73 6f 0a 2a 2a 20 20 20 2a 20 69  d if so.**   * i
19680 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72  f the child jour
19690 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 61 20 72  nal contains a r
196a0 65 66 65 72 65 6e 63 65 20 74 6f 20 6d 61 73 74  eference to mast
196b0 65 72 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20  er journal .**  
196c0 20 20 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 0a     file zMaster.
196d0 2a 2a 0a 2a 2a 20 49 66 20 61 20 63 68 69 6c 64  **.** If a child
196e0 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20   journal can be 
196f0 66 6f 75 6e 64 20 74 68 61 74 20 6d 61 74 63 68  found that match
19700 65 73 20 62 6f 74 68 20 6f 66 20 74 68 65 20 63  es both of the c
19710 72 69 74 65 72 69 61 0a 2a 2a 20 61 62 6f 76 65  riteria.** above
19720 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
19730 72 65 74 75 72 6e 73 20 77 69 74 68 6f 75 74 20  returns without 
19740 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20  doing anything. 
19750 4f 74 68 65 72 77 69 73 65 2c 20 69 66 0a 2a 2a  Otherwise, if.**
19760 20 6e 6f 20 73 75 63 68 20 63 68 69 6c 64 20 6a   no such child j
19770 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f  ournal can be fo
19780 75 6e 64 2c 20 66 69 6c 65 20 7a 4d 61 73 74 65  und, file zMaste
19790 72 20 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f  r is deleted fro
197a0 6d 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79  m.** the file-sy
197b0 73 74 65 6d 20 75 73 69 6e 67 20 73 71 6c 69 74  stem using sqlit
197c0 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a  e3OsDelete()..**
197d0 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72  .** If an IO err
197e0 6f 72 20 77 69 74 68 69 6e 20 74 68 69 73 20 66  or within this f
197f0 75 6e 63 74 69 6f 6e 2c 20 61 6e 20 65 72 72 6f  unction, an erro
19800 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
19810 65 64 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  ed. This.** func
19820 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 6d  tion allocates m
19830 65 6d 6f 72 79 20 62 79 20 63 61 6c 6c 69 6e 67  emory by calling
19840 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29   sqlite3Malloc()
19850 2e 20 49 66 20 61 6e 20 61 6c 6c 6f 63 61 74 69  . If an allocati
19860 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c  on.** fails, SQL
19870 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74  ITE_NOMEM is ret
19880 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
19890 2c 20 69 66 20 6e 6f 20 49 4f 20 6f 72 20 6d 61  , if no IO or ma
198a0 6c 6c 6f 63 20 65 72 72 6f 72 73 20 0a 2a 2a 20  lloc errors .** 
198b0 6f 63 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b  occur, SQLITE_OK
198c0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
198d0 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20 66  .** TODO: This f
198e0 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65  unction allocate
198f0 73 20 61 20 73 69 6e 67 6c 65 20 62 6c 6f 63 6b  s a single block
19900 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f   of memory to lo
19910 61 64 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65  ad.** the entire
19920 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
19930 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
19940 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 75 6c 64  file. This could
19950 20 62 65 0a 2a 2a 20 61 20 63 6f 75 70 6c 65 20   be.** a couple 
19960 6f 66 20 6b 69 6c 6f 62 79 74 65 73 20 6f 72 20  of kilobytes or 
19970 73 6f 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79  so - potentially
19980 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
19990 20 70 61 67 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a   page .** size..
199a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
199b0 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 50 61  ger_delmaster(Pa
199c0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
199d0 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
199e0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
199f0 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d   *pVfs = pPager-
19a00 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b  >pVfs;.  int rc;
19a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
19a30 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  e */.  sqlite3_f
19a40 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b 20 20 20  ile *pMaster;   
19a50 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d 61 73   /* Malloc'd mas
19a60 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
19a70 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20   descriptor */. 
19a80 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
19a90 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61  Journal;   /* Ma
19aa0 6c 6c 6f 63 27 64 20 63 68 69 6c 64 2d 6a 6f 75  lloc'd child-jou
19ab0 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
19ac0 70 74 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ptor */.  char *
19ad0 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d  zMasterJournal =
19ae0 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20   0; /* Contents 
19af0 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
19b00 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20  l file */.  i64 
19b10 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20  nMasterJournal; 
19b20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
19b30 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
19b40 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
19b50 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  zJournal;       
19b60 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
19b70 6f 20 6f 6e 65 20 6a 6f 75 72 6e 61 6c 20 77 69  o one journal wi
19b80 74 68 69 6e 20 4d 4a 20 66 69 6c 65 20 2a 2f 0a  thin MJ file */.
19b90 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50    char *zMasterP
19ba0 74 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  tr;         /* S
19bb0 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 4d 4a 20  pace to hold MJ 
19bc0 66 69 6c 65 6e 61 6d 65 20 66 72 6f 6d 20 61 20  filename from a 
19bd0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
19be0 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 50 74 72    int nMasterPtr
19bf0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
19c00 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20 61  mount of space a
19c10 6c 6c 6f 63 61 74 65 64 20 74 6f 20 7a 4d 61 73  llocated to zMas
19c20 74 65 72 50 74 72 5b 5d 20 2a 2f 0a 0a 20 20 2f  terPtr[] */..  /
19c30 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
19c40 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20 70 4a   for both the pJ
19c50 6f 75 72 6e 61 6c 20 61 6e 64 20 70 4d 61 73 74  ournal and pMast
19c60 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  er file descript
19c70 6f 72 73 2e 0a 20 20 2a 2a 20 49 66 20 73 75 63  ors..  ** If suc
19c80 63 65 73 73 66 75 6c 2c 20 6f 70 65 6e 20 74 68  cessful, open th
19c90 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
19ca0 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e   file for readin
19cb0 67 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65  g..  */.  pMaste
19cc0 72 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  r = (sqlite3_fil
19cd0 65 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  e *)sqlite3Mallo
19ce0 63 5a 65 72 6f 28 70 56 66 73 2d 3e 73 7a 4f 73  cZero(pVfs->szOs
19cf0 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f  File * 2);.  pJo
19d00 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65 33  urnal = (sqlite3
19d10 5f 66 69 6c 65 20 2a 29 28 28 28 75 38 20 2a 29  _file *)(((u8 *)
19d20 70 4d 61 73 74 65 72 29 20 2b 20 70 56 66 73 2d  pMaster) + pVfs-
19d30 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66  >szOsFile);.  if
19d40 28 20 21 70 4d 61 73 74 65 72 20 29 7b 0a 20 20  ( !pMaster ){.  
19d50 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
19d60 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73  MEM_BKPT;.  }els
19d70 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  e{.    const int
19d80 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45   flags = (SQLITE
19d90 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53  _OPEN_READONLY|S
19da0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
19db0 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20  R_JOURNAL);.    
19dc0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
19dd0 65 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  en(pVfs, zMaster
19de0 2c 20 70 4d 61 73 74 65 72 2c 20 66 6c 61 67 73  , pMaster, flags
19df0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
19e00 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
19e10 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
19e20 75 74 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74  ut;..  /* Load t
19e30 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72  he entire master
19e40 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
19e50 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65  to space obtaine
19e60 64 20 66 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c 69  d from.  ** sqli
19e70 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64  te3_malloc() and
19e80 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
19e90 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 20  MasterJournal.  
19ea0 20 41 6c 73 6f 20 6f 62 74 61 69 6e 0a 20 20 2a   Also obtain.  *
19eb0 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  * sufficient spa
19ec0 63 65 20 28 69 6e 20 7a 4d 61 73 74 65 72 50 74  ce (in zMasterPt
19ed0 72 29 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e  r) to hold the n
19ee0 61 6d 65 73 20 6f 66 20 6d 61 73 74 65 72 0a 20  ames of master. 
19ef0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
19f00 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
19f10 20 72 65 67 75 6c 61 72 20 72 6f 6c 6c 62 61 63   regular rollbac
19f20 6b 2d 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f  k-journals..  */
19f30 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
19f40 73 46 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65  sFileSize(pMaste
19f50 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  r, &nMasterJourn
19f60 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  al);.  if( rc!=S
19f70 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
19f80 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
19f90 20 6e 4d 61 73 74 65 72 50 74 72 20 3d 20 70 56   nMasterPtr = pV
19fa0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
19fb0 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ;.  zMasterJourn
19fc0 61 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  al = sqlite3Mall
19fd0 6f 63 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  oc(nMasterJourna
19fe0 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74 72 20 2b  l + nMasterPtr +
19ff0 20 31 29 3b 0a 20 20 69 66 28 20 21 7a 4d 61 73   1);.  if( !zMas
1a000 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  terJournal ){.  
1a010 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
1a020 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f  MEM_BKPT;.    go
1a030 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
1a040 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 50  ;.  }.  zMasterP
1a050 74 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75  tr = &zMasterJou
1a060 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72  rnal[nMasterJour
1a070 6e 61 6c 2b 31 5d 3b 0a 20 20 72 63 20 3d 20 73  nal+1];.  rc = s
1a080 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61  qlite3OsRead(pMa
1a090 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75  ster, zMasterJou
1a0a0 72 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74  rnal, (int)nMast
1a0b0 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20  erJournal, 0);. 
1a0c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1a0d0 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
1a0e0 74 65 72 5f 6f 75 74 3b 0a 20 20 7a 4d 61 73 74  ter_out;.  zMast
1a0f0 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65  erJournal[nMaste
1a100 72 4a 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a  rJournal] = 0;..
1a110 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61    zJournal = zMa
1a120 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 77  sterJournal;.  w
1a130 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d  hile( (zJournal-
1a140 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c  zMasterJournal)<
1a150 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  nMasterJournal )
1a160 7b 0a 20 20 20 20 69 6e 74 20 65 78 69 73 74 73  {.    int exists
1a170 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1a180 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
1a190 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54   zJournal, SQLIT
1a1a0 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
1a1b0 20 26 65 78 69 73 74 73 29 3b 0a 20 20 20 20 69   &exists);.    i
1a1c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1a1d0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64   ){.      goto d
1a1e0 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
1a1f0 20 20 7d 0a 20 20 20 20 69 66 28 20 65 78 69 73    }.    if( exis
1a200 74 73 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f  ts ){.      /* O
1a210 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ne of the journa
1a220 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ls pointed to by
1a230 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
1a240 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20  nal exists..    
1a250 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64    ** Open it and
1a260 20 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69   check if it poi
1a270 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73 74 65  nts at the maste
1a280 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20  r journal. If.  
1a290 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72      ** so, retur
1a2a0 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69  n without deleti
1a2b0 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ng the master jo
1a2c0 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
1a2d0 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63    */.      int c
1a2e0 3b 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67  ;.      int flag
1a2f0 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e  s = (SQLITE_OPEN
1a300 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45  _READONLY|SQLITE
1a310 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
1a320 41 4c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  AL);.      rc = 
1a330 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
1a340 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a  fs, zJournal, pJ
1a350 6f 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30  ournal, flags, 0
1a360 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1a370 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a380 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
1a390 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
1a3a0 7d 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65  }..      rc = re
1a3b0 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
1a3c0 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65  pJournal, zMaste
1a3d0 72 50 74 72 2c 20 6e 4d 61 73 74 65 72 50 74 72  rPtr, nMasterPtr
1a3e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1a3f0 4f 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c  OsClose(pJournal
1a400 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1a410 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a420 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
1a430 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
1a440 7d 0a 0a 20 20 20 20 20 20 63 20 3d 20 7a 4d 61  }..      c = zMa
1a450 73 74 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26  sterPtr[0]!=0 &&
1a460 20 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50   strcmp(zMasterP
1a470 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b  tr, zMaster)==0;
1a480 0a 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a  .      if( c ){.
1a490 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61          /* We ha
1a4a0 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e  ve a match. Do n
1a4b0 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  ot delete the ma
1a4c0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1a4d0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f  e. */.        go
1a4e0 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
1a4f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1a500 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20      zJournal += 
1a510 28 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  (sqlite3Strlen30
1a520 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20  (zJournal)+1);. 
1a530 20 7d 0a 20 0a 20 20 73 71 6c 69 74 65 33 4f 73   }. .  sqlite3Os
1a540 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a  Close(pMaster);.
1a550 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1a560 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61  Delete(pVfs, zMa
1a570 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61  ster, 0);..delma
1a580 73 74 65 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69  ster_out:.  sqli
1a590 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72  te3_free(zMaster
1a5a0 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20  Journal);.  if( 
1a5b0 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 73  pMaster ){.    s
1a5c0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d  qlite3OsClose(pM
1a5d0 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65  aster);.    asse
1a5e0 72 74 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f 75  rt( !isOpen(pJou
1a5f0 72 6e 61 6c 29 20 29 3b 0a 20 20 20 20 73 71 6c  rnal) );.    sql
1a600 69 74 65 33 5f 66 72 65 65 28 70 4d 61 73 74 65  ite3_free(pMaste
1a610 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
1a620 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   rc;.}.../*.** T
1a630 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1a640 75 73 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74  used to change t
1a650 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f  he actual size o
1a660 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  f the database .
1a670 2a 2a 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66  ** file in the f
1a680 69 6c 65 2d 73 79 73 74 65 6d 2e 20 54 68 69 73  ile-system. This
1a690 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68   only happens wh
1a6a0 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20  en committing a 
1a6b0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20  transaction,.** 
1a6c0 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  or rolling back 
1a6d0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69  a transaction (i
1a6e0 6e 63 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67  ncluding rolling
1a6f0 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72   back a hot-jour
1a700 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  nal)..**.** If t
1a710 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
1a720 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65   file is not ope
1a730 6e 2c 20 6f 72 20 74 68 65 20 70 61 67 65 72 20  n, or the pager 
1a740 69 73 20 6e 6f 74 20 69 6e 20 65 69 74 68 65 72  is not in either
1a750 0a 2a 2a 20 44 42 4d 4f 44 20 6f 72 20 4f 50 45  .** DBMOD or OPE
1a760 4e 20 73 74 61 74 65 2c 20 74 68 69 73 20 66 75  N state, this fu
1a770 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
1a780 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  p. Otherwise, th
1a790 65 20 73 69 7a 65 20 0a 2a 2a 20 6f 66 20 74 68  e size .** of th
1a7a0 65 20 66 69 6c 65 20 69 73 20 63 68 61 6e 67 65  e file is change
1a7b0 64 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73  d to nPage pages
1a7c0 20 28 6e 50 61 67 65 2a 70 50 61 67 65 72 2d 3e   (nPage*pPager->
1a7d0 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 29 2e  pageSize bytes).
1a7e0 20 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65   .** If the file
1a7f0 20 6f 6e 20 64 69 73 6b 20 69 73 20 63 75 72 72   on disk is curr
1a800 65 6e 74 6c 79 20 6c 61 72 67 65 72 20 74 68 61  ently larger tha
1a810 6e 20 6e 50 61 67 65 20 70 61 67 65 73 2c 20 74  n nPage pages, t
1a820 68 65 6e 20 75 73 65 20 74 68 65 20 56 46 53 0a  hen use the VFS.
1a830 2a 2a 20 78 54 72 75 6e 63 61 74 65 28 29 20 6d  ** xTruncate() m
1a840 65 74 68 6f 64 20 74 6f 20 74 72 75 6e 63 61 74  ethod to truncat
1a850 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  e it..**.** Or, 
1a860 69 74 20 6d 69 67 68 74 20 62 65 20 74 68 65 20  it might be the 
1a870 63 61 73 65 20 74 68 61 74 20 74 68 65 20 66 69  case that the fi
1a880 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 73 6d  le on disk is sm
1a890 61 6c 6c 65 72 20 74 68 61 6e 20 0a 2a 2a 20 6e  aller than .** n
1a8a0 50 61 67 65 20 70 61 67 65 73 2e 20 53 6f 6d 65  Page pages. Some
1a8b0 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
1a8c0 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  m implementation
1a8d0 73 20 63 61 6e 20 67 65 74 20 63 6f 6e 66 75 73  s can get confus
1a8e0 65 64 20 69 66 20 0a 2a 2a 20 79 6f 75 20 74 72  ed if .** you tr
1a8f0 79 20 74 6f 20 74 72 75 6e 63 61 74 65 20 61 20  y to truncate a 
1a900 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69 7a  file to some siz
1a910 65 20 74 68 61 74 20 69 73 20 6c 61 72 67 65 72  e that is larger
1a920 20 74 68 61 6e 20 69 74 20 0a 2a 2a 20 63 75 72   than it .** cur
1a930 72 65 6e 74 6c 79 20 69 73 2c 20 73 6f 20 64 65  rently is, so de
1a940 74 65 63 74 20 74 68 69 73 20 63 61 73 65 20 61  tect this case a
1a950 6e 64 20 77 72 69 74 65 20 61 20 73 69 6e 67 6c  nd write a singl
1a960 65 20 7a 65 72 6f 20 62 79 74 65 20 74 6f 20 0a  e zero byte to .
1a970 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ** the end of th
1a980 65 20 6e 65 77 20 66 69 6c 65 20 69 6e 73 74 65  e new file inste
1a990 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  ad..**.** If suc
1a9a0 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 20  cessful, return 
1a9b0 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e  SQLITE_OK. If an
1a9c0 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
1a9d0 20 77 68 69 6c 65 20 6d 6f 64 69 66 79 69 6e 67   while modifying
1a9e0 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
1a9f0 20 66 69 6c 65 2c 20 72 65 74 75 72 6e 20 74 68   file, return th
1aa00 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20  e error code to 
1aa10 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73  the caller..*/.s
1aa20 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
1aa30 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a  truncate(Pager *
1aa40 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61  pPager, Pgno nPa
1aa50 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ge){.  int rc = 
1aa60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
1aa70 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
1aa80 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
1aa90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1aaa0 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
1aab0 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20  GER_READER );.  
1aac0 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50  .  if( isOpen(pP
1aad0 61 67 65 72 2d 3e 66 64 29 20 0a 20 20 20 26 26  ager->fd) .   &&
1aae0 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65   (pPager->eState
1aaf0 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  >=PAGER_WRITER_D
1ab00 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e  BMOD || pPager->
1ab10 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
1ab20 45 4e 29 20 0a 20 20 29 7b 0a 20 20 20 20 69 36  EN) .  ){.    i6
1ab30 34 20 63 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e  4 currentSize, n
1ab40 65 77 53 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20  ewSize;.    int 
1ab50 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d  szPage = pPager-
1ab60 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 61  >pageSize;.    a
1ab70 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
1ab80 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
1ab90 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 2f 2a 20 54  LOCK );.    /* T
1aba0 4f 44 4f 3a 20 49 73 20 69 74 20 73 61 66 65 20  ODO: Is it safe 
1abb0 74 6f 20 75 73 65 20 50 61 67 65 72 2e 64 62 46  to use Pager.dbF
1abc0 69 6c 65 53 69 7a 65 20 68 65 72 65 3f 20 2a 2f  ileSize here? */
1abd0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1abe0 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
1abf0 65 72 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e 74  er->fd, &current
1ac00 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53 69  Size);.    newSi
1ac10 7a 65 20 3d 20 73 7a 50 61 67 65 2a 28 69 36 34  ze = szPage*(i64
1ac20 29 6e 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20  )nPage;.    if( 
1ac30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1ac40 20 63 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e 65   currentSize!=ne
1ac50 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 69  wSize ){.      i
1ac60 66 28 20 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e  f( currentSize>n
1ac70 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  ewSize ){.      
1ac80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1ac90 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
1aca0 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20  >fd, newSize);. 
1acb0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
1acc0 63 75 72 72 65 6e 74 53 69 7a 65 2b 73 7a 50 61  currentSize+szPa
1acd0 67 65 29 3c 3d 6e 65 77 53 69 7a 65 20 29 7b 0a  ge)<=newSize ){.
1ace0 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 54          char *pT
1acf0 6d 70 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d  mp = pPager->pTm
1ad00 70 53 70 61 63 65 3b 0a 20 20 20 20 20 20 20 20  pSpace;.        
1ad10 6d 65 6d 73 65 74 28 70 54 6d 70 2c 20 30 2c 20  memset(pTmp, 0, 
1ad20 73 7a 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  szPage);.       
1ad30 20 74 65 73 74 63 61 73 65 28 20 28 6e 65 77 53   testcase( (newS
1ad40 69 7a 65 2d 73 7a 50 61 67 65 29 20 3d 3d 20 63  ize-szPage) == c
1ad50 75 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a 20 20  urrentSize );.  
1ad60 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1ad70 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29  (newSize-szPage)
1ad80 20 3e 20 20 63 75 72 72 65 6e 74 53 69 7a 65 20   >  currentSize 
1ad90 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
1ada0 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
1adb0 50 61 67 65 72 2d 3e 66 64 2c 20 70 54 6d 70 2c  Pager->fd, pTmp,
1adc0 20 73 7a 50 61 67 65 2c 20 6e 65 77 53 69 7a 65   szPage, newSize
1add0 2d 73 7a 50 61 67 65 29 3b 0a 20 20 20 20 20 20  -szPage);.      
1ade0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
1adf0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ae00 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46       pPager->dbF
1ae10 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b  ileSize = nPage;
1ae20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1ae30 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1ae40 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1ae50 61 20 73 61 6e 69 74 69 7a 65 64 20 76 65 72 73  a sanitized vers
1ae60 69 6f 6e 20 6f 66 20 74 68 65 20 73 65 63 74 6f  ion of the secto
1ae70 72 2d 73 69 7a 65 20 6f 66 20 4f 53 20 66 69 6c  r-size of OS fil
1ae80 65 20 70 46 69 6c 65 2e 20 54 68 65 0a 2a 2a 20  e pFile. The.** 
1ae90 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
1aea0 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6c 69  guaranteed to li
1aeb0 65 20 62 65 74 77 65 65 6e 20 33 32 20 61 6e 64  e between 32 and
1aec0 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
1aed0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1aee0 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74  SectorSize(sqlit
1aef0 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b  e3_file *pFile){
1af00 0a 20 20 69 6e 74 20 69 52 65 74 20 3d 20 73 71  .  int iRet = sq
1af10 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a  lite3OsSectorSiz
1af20 65 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  e(pFile);.  if( 
1af30 69 52 65 74 3c 33 32 20 29 7b 0a 20 20 20 20 69  iRet<32 ){.    i
1af40 52 65 74 20 3d 20 35 31 32 3b 0a 20 20 7d 65 6c  Ret = 512;.  }el
1af50 73 65 20 69 66 28 20 69 52 65 74 3e 4d 41 58 5f  se if( iRet>MAX_
1af60 53 45 43 54 4f 52 5f 53 49 5a 45 20 29 7b 0a 20  SECTOR_SIZE ){. 
1af70 20 20 20 61 73 73 65 72 74 28 20 4d 41 58 5f 53     assert( MAX_S
1af80 45 43 54 4f 52 5f 53 49 5a 45 3e 3d 35 31 32 20  ECTOR_SIZE>=512 
1af90 29 3b 0a 20 20 20 20 69 52 65 74 20 3d 20 4d 41  );.    iRet = MA
1afa0 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20  X_SECTOR_SIZE;. 
1afb0 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65 74   }.  return iRet
1afc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
1afd0 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
1afe0 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65  Pager.sectorSize
1aff0 20 76 61 72 69 61 62 6c 65 20 66 6f 72 20 74 68   variable for th
1b000 65 20 67 69 76 65 6e 0a 2a 2a 20 70 61 67 65 72  e given.** pager
1b010 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 76 61   based on the va
1b020 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
1b030 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65 20  the xSectorSize 
1b040 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66 20 74 68 65  method.** of the
1b050 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66   open database f
1b060 69 6c 65 2e 20 54 68 65 20 73 65 63 74 6f 72 20  ile. The sector 
1b070 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 75 73 65  size will be use
1b080 64 20 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69  d .** to determi
1b090 6e 65 20 74 68 65 20 73 69 7a 65 20 61 6e 64 20  ne the size and 
1b0a0 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75  alignment of jou
1b0b0 72 6e 61 6c 20 68 65 61 64 65 72 20 61 6e 64 20  rnal header and 
1b0c0 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  .** master journ
1b0d0 61 6c 20 70 6f 69 6e 74 65 72 73 20 77 69 74 68  al pointers with
1b0e0 69 6e 20 63 72 65 61 74 65 64 20 6a 6f 75 72 6e  in created journ
1b0f0 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  al files..**.** 
1b100 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  For temporary fi
1b110 6c 65 73 20 74 68 65 20 65 66 66 65 63 74 69 76  les the effectiv
1b120 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73  e sector size is
1b130 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74 65   always 512 byte
1b140 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  s..**.** Otherwi
1b150 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70  se, for non-temp
1b160 6f 72 61 72 79 20 66 69 6c 65 73 2c 20 74 68 65  orary files, the
1b170 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f   effective secto
1b180 72 20 73 69 7a 65 20 69 73 0a 2a 2a 20 74 68 65  r size is.** the
1b190 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
1b1a0 62 79 20 74 68 65 20 78 53 65 63 74 6f 72 53 69  by the xSectorSi
1b1b0 7a 65 28 29 20 6d 65 74 68 6f 64 20 72 6f 75 6e  ze() method roun
1b1c0 64 65 64 20 75 70 20 74 6f 20 33 32 20 69 66 0a  ded up to 32 if.
1b1d0 2a 2a 20 69 74 20 69 73 20 6c 65 73 73 20 74 68  ** it is less th
1b1e0 61 6e 20 33 32 2c 20 6f 72 20 72 6f 75 6e 64 65  an 32, or rounde
1b1f0 64 20 64 6f 77 6e 20 74 6f 20 4d 41 58 5f 53 45  d down to MAX_SE
1b200 43 54 4f 52 5f 53 49 5a 45 20 69 66 20 69 74 0a  CTOR_SIZE if it.
1b210 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ** is greater th
1b220 61 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  an MAX_SECTOR_SI
1b230 5a 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ZE..**.** If the
1b240 20 66 69 6c 65 20 68 61 73 20 74 68 65 20 53 51   file has the SQ
1b250 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52  LITE_IOCAP_POWER
1b260 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 70  SAFE_OVERWRITE p
1b270 72 6f 70 65 72 74 79 2c 20 74 68 65 6e 20 73 65  roperty, then se
1b280 74 0a 2a 2a 20 74 68 65 20 65 66 66 65 63 74 69  t.** the effecti
1b290 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 74  ve sector size t
1b2a0 6f 20 69 74 73 20 6d 69 6e 69 6d 75 6d 20 76 61  o its minimum va
1b2b0 6c 75 65 20 28 35 31 32 29 2e 20 20 54 68 65 20  lue (512).  The 
1b2c0 70 75 72 70 6f 73 65 20 6f 66 0a 2a 2a 20 70 50  purpose of.** pP
1b2d0 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
1b2e0 20 69 73 20 74 6f 20 64 65 66 69 6e 65 20 74 68   is to define th
1b2f0 65 20 22 62 6c 61 73 74 20 72 61 64 69 75 73 22  e "blast radius"
1b300 20 6f 66 20 62 79 74 65 73 20 74 68 61 74 0a 2a   of bytes that.*
1b310 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 69  * might change i
1b320 66 20 61 20 63 72 61 73 68 20 6f 63 63 75 72 73  f a crash occurs
1b330 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 74   while writing t
1b340 6f 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  o a single byte 
1b350 69 6e 0a 2a 2a 20 74 68 61 74 20 72 61 6e 67 65  in.** that range
1b360 2e 20 20 42 75 74 20 77 69 74 68 20 50 4f 57 45  .  But with POWE
1b370 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 2c  RSAFE_OVERWRITE,
1b380 20 74 68 65 20 62 6c 61 73 74 20 72 61 64 69 75   the blast radiu
1b390 73 20 69 73 20 7a 65 72 6f 0a 2a 2a 20 28 74 68  s is zero.** (th
1b3a0 61 74 20 69 73 20 77 68 61 74 20 50 4f 57 45 52  at is what POWER
1b3b0 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 6d  SAFE_OVERWRITE m
1b3c0 65 61 6e 73 29 2c 20 73 6f 20 77 65 20 6d 69 6e  eans), so we min
1b3d0 69 6d 69 7a 65 20 74 68 65 20 73 65 63 74 6f 72  imize the sector
1b3e0 0a 2a 2a 20 73 69 7a 65 2e 20 20 46 6f 72 20 62  .** size.  For b
1b3f0 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69  ackwards compati
1b400 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 72 6f  bility of the ro
1b410 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66  llback journal f
1b420 69 6c 65 20 66 6f 72 6d 61 74 2c 0a 2a 2a 20 77  ile format,.** w
1b430 65 20 63 61 6e 6e 6f 74 20 72 65 64 75 63 65 20  e cannot reduce 
1b440 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65  the effective se
1b450 63 74 6f 72 20 73 69 7a 65 20 62 65 6c 6f 77 20  ctor size below 
1b460 35 31 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  512..*/.static v
1b470 6f 69 64 20 73 65 74 53 65 63 74 6f 72 53 69 7a  oid setSectorSiz
1b480 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
1b490 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  {.  assert( isOp
1b4a0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
1b4b0 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
1b4c0 6c 65 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61  le );..  if( pPa
1b4d0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 0a 20 20  ger->tempFile.  
1b4e0 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65   || (sqlite3OsDe
1b4f0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1b500 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 20  ics(pPager->fd) 
1b510 26 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  & .             
1b520 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f   SQLITE_IOCAP_PO
1b530 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
1b540 45 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f  E)!=0.  ){.    /
1b550 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 64 6f  * Sector size do
1b560 65 73 6e 27 74 20 6d 61 74 74 65 72 20 66 6f 72  esn't matter for
1b570 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
1b580 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65  . Also, the file
1b590 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20  .    ** may not 
1b5a0 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64  have been opened
1b5b0 20 79 65 74 2c 20 69 6e 20 77 68 69 63 68 20 63   yet, in which c
1b5c0 61 73 65 20 74 68 65 20 4f 73 53 65 63 74 6f 72  ase the OsSector
1b5d0 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 63 61  Size().    ** ca
1b5e0 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61 75 6c 74  ll will segfault
1b5f0 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d  . */.    pPager-
1b600 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 35 31  >sectorSize = 51
1b610 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  2;.  }else{.    
1b620 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
1b630 7a 65 20 3d 20 73 71 6c 69 74 65 33 53 65 63 74  ze = sqlite3Sect
1b640 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  orSize(pPager->f
1b650 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  d);.  }.}../*.**
1b660 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f   Playback the jo
1b670 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72  urnal and thus r
1b680 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
1b690 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74  ase file to.** t
1b6a0 68 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20  he state it was 
1b6b0 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74 61  in before we sta
1b6c0 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e  rted making chan
1b6d0 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65  ges.  .**.** The
1b6e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
1b6f0 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f  rmat is as follo
1b700 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20  ws: .**.**  (1) 
1b710 20 38 20 62 79 74 65 20 70 72 65 66 69 78 2e 20   8 byte prefix. 
1b720 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72   A copy of aJour
1b730 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20  nalMagic[]..**  
1b740 28 32 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (2)  4 byte big-
1b750 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
1b760 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
1b770 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65  er of valid page
1b780 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20   records.**     
1b790 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c    in the journal
1b7a0 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65  .  If this value
1b7b0 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20   is 0xffffffff, 
1b7c0 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65  then compute the
1b7d0 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72  .**       number
1b7e0 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73   of page records
1b7f0 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
1b800 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20  l size..**  (3) 
1b810 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
1b820 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
1b830 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20   is the initial 
1b840 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a  value for the .*
1b850 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79 20 63  *       sanity c
1b860 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29  hecksum..**  (4)
1b870 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72    4 byte integer
1b880 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
1b890 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f  mber of pages to
1b8a0 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a   truncate the.**
1b8b0 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
1b8c0 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c  to during a roll
1b8d0 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34  back..**  (5)  4
1b8e0 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
1b8f0 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
1b900 73 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  s the sector siz
1b910 65 2e 20 20 54 68 65 20 68 65 61 64 65 72 0a 2a  e.  The header.*
1b920 2a 20 20 20 20 20 20 20 69 73 20 74 68 69 73 20  *       is this 
1b930 6d 61 6e 79 20 62 79 74 65 73 20 69 6e 20 73 69  many bytes in si
1b940 7a 65 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20 62  ze..**  (6)  4 b
1b950 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
1b960 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
1b970 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a  the page size..*
1b980 2a 20 20 28 37 29 20 20 7a 65 72 6f 20 70 61 64  *  (7)  zero pad
1b990 64 69 6e 67 20 6f 75 74 20 74 6f 20 74 68 65 20  ding out to the 
1b9a0 6e 65 78 74 20 73 65 63 74 6f 72 20 73 69 7a 65  next sector size
1b9b0 2e 0a 2a 2a 20 20 28 38 29 20 20 5a 65 72 6f 20  ..**  (8)  Zero 
1b9c0 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e  or more pages in
1b9d0 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73  stances, each as
1b9e0 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20   follows:.**    
1b9f0 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 70 61      +  4 byte pa
1ba00 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20  ge number..**   
1ba10 20 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e       +  pPager->
1ba20 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
1ba30 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20  f data..**      
1ba40 20 20 2b 20 20 34 20 62 79 74 65 20 63 68 65 63    +  4 byte chec
1ba50 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ksum.**.** When 
1ba60 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20  we speak of the 
1ba70 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20  journal header, 
1ba80 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73  we mean the firs
1ba90 74 20 37 20 69 74 65 6d 73 20 61 62 6f 76 65 2e  t 7 items above.
1baa0 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69  .** Each entry i
1bab0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
1bac0 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
1bad0 74 68 65 20 38 74 68 20 69 74 65 6d 2e 0a 2a 2a  the 8th item..**
1bae0 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c  .** Call the val
1baf0 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f  ue from the seco
1bb00 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22  nd bullet "nRec"
1bb10 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e  .  nRec is the n
1bb20 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69  umber of.** vali
1bb30 64 20 70 61 67 65 20 65 6e 74 72 69 65 73 20 69  d page entries i
1bb40 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
1bb50 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79  In most cases, y
1bb60 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74  ou can compute t
1bb70 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e  he.** value of n
1bb80 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a  Rec from the siz
1bb90 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
1bba0 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61   file.  But if a
1bbb0 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72   power.** failur
1bbc0 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65  e occurred while
1bbd0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
1bbe0 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20   being written, 
1bbf0 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a  it could be the.
1bc00 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74 68 65  ** case that the
1bc10 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
1bc20 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c  rnal file had al
1bc30 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65  ready been incre
1bc40 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20  ased but.** the 
1bc50 65 78 74 72 61 20 65 6e 74 72 69 65 73 20 68 61  extra entries ha
1bc60 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69  d not yet made i
1bc70 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b  t safely to disk
1bc80 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63 61 73  .  In such a cas
1bc90 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  e,.** the value 
1bca0 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64  of nRec computed
1bcb0 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73   from the file s
1bcc0 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f  ize would be too
1bcd0 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20   large.  For.** 
1bce0 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20  that reason, we 
1bcf0 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 6e  always use the n
1bd00 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65  Rec value in the
1bd10 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   header..**.** I
1bd20 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  f the nRec value
1bd30 20 69 73 20 30 78 66 66 66 66 66 66 66 66 20 69   is 0xffffffff i
1bd40 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65  t means that nRe
1bd50 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70  c should be comp
1bd60 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  uted.** from the
1bd70 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69   file size.  Thi
1bd80 73 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20  s value is used 
1bd90 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 73 65  when the user se
1bda0 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d  lects the.** no-
1bdb0 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20  sync option for 
1bdc0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20  the journal.  A 
1bdd0 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f  power failure co
1bde0 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72  uld lead to corr
1bdf0 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69  uption.** in thi
1be00 73 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72  s case.  But for
1be10 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d   things like tem
1be20 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77 68  porary table (wh
1be30 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64  ich will be.** d
1be40 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20  eleted when the 
1be50 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65  power is restore
1be60 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65  d) we don't care
1be70 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  .  .**.** If the
1be80 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20   file opened as 
1be90 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1bea0 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66   is not a well-f
1beb0 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  ormed.** journal
1bec0 20 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70   file then all p
1bed0 61 67 65 73 20 75 70 20 74 6f 20 74 68 65 20 66  ages up to the f
1bee0 69 72 73 74 20 63 6f 72 72 75 70 74 65 64 20 70  irst corrupted p
1bef0 61 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a  age are rolled.*
1bf00 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61  * back (or no pa
1bf10 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  ges if the journ
1bf20 61 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f 72  al header is cor
1bf30 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75  rupted). The jou
1bf40 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20  rnal file.** is 
1bf50 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64  then deleted and
1bf60 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
1bf70 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20  ned, just as if 
1bf80 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61  no corruption ha
1bf90 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e  d.** been encoun
1bfa0 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tered..**.** If 
1bfb0 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63  an I/O or malloc
1bfc0 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  () error occurs,
1bfd0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c   the journal-fil
1bfe0 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64  e is not deleted
1bff0 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  .** and an error
1c000 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
1c010 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 48  d..**.** The isH
1c020 6f 74 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64  ot parameter ind
1c030 69 63 61 74 65 73 20 74 68 61 74 20 77 65 20 61  icates that we a
1c040 72 65 20 74 72 79 69 6e 67 20 74 6f 20 72 6f 6c  re trying to rol
1c050 6c 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a  lback a journal.
1c060 2a 2a 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  ** that might be
1c070 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20   a hot journal. 
1c080 20 4f 72 2c 20 69 74 20 63 6f 75 6c 64 20 62 65   Or, it could be
1c090 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
1c0a0 6c 20 69 73 20 0a 2a 2a 20 70 72 65 73 65 72 76  l is .** preserv
1c0b0 65 64 20 62 65 63 61 75 73 65 20 6f 66 20 4a 4f  ed because of JO
1c0c0 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
1c0d0 54 20 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45  T or JOURNALMODE
1c0e0 5f 54 52 55 4e 43 41 54 45 2e 0a 2a 2a 20 49 66  _TRUNCATE..** If
1c0f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 61   the journal rea
1c100 6c 6c 79 20 69 73 20 68 6f 74 2c 20 72 65 73 65  lly is hot, rese
1c110 74 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  t the pager cach
1c120 65 20 70 72 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a  e prior rolling.
1c130 2a 2a 20 62 61 63 6b 20 61 6e 79 20 63 6f 6e 74  ** back any cont
1c140 65 6e 74 2e 20 20 49 66 20 74 68 65 20 6a 6f 75  ent.  If the jou
1c150 72 6e 61 6c 20 69 73 20 6d 65 72 65 6c 79 20 70  rnal is merely p
1c160 65 72 73 69 73 74 65 6e 74 2c 20 6e 6f 20 72 65  ersistent, no re
1c170 73 65 74 20 69 73 0a 2a 2a 20 6e 65 65 64 65 64  set is.** needed
1c180 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1c190 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50  pager_playback(P
1c1a0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
1c1b0 74 20 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69  t isHot){.  sqli
1c1c0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
1c1d0 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
1c1e0 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20  i64 szJ;        
1c1f0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1c200 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1c210 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  file in bytes */
1c220 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20  .  u32 nRec;    
1c230 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1c240 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73  umber of Records
1c250 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
1c260 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20  */.  u32 u;     
1c270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c280 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63   Unsigned loop c
1c290 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f  ounter */.  Pgno
1c2a0 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20   mxPg = 0;      
1c2b0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1c2c0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c  the original fil
1c2d0 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20  e in pages */.  
1c2e0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1c2f0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
1c300 6c 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62  lt code of a sub
1c310 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
1c320 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20   res = 1;       
1c330 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72        /* Value r
1c340 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
1c350 65 33 4f 73 41 63 63 65 73 73 28 29 20 2a 2f 0a  e3OsAccess() */.
1c360 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20    char *zMaster 
1c370 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61  = 0;       /* Na
1c380 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  me of master jou
1c390 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79  rnal file if any
1c3a0 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 65 64 50 61   */.  int needPa
1c3b0 67 65 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f  gerReset;      /
1c3c0 2a 20 54 72 75 65 20 74 6f 20 72 65 73 65 74 20  * True to reset 
1c3d0 70 61 67 65 20 70 72 69 6f 72 20 74 6f 20 66 69  page prior to fi
1c3e0 72 73 74 20 70 61 67 65 20 72 6f 6c 6c 62 61 63  rst page rollbac
1c3f0 6b 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6c 61 79  k */.  int nPlay
1c400 62 61 63 6b 20 3d 20 30 3b 20 20 20 20 20 20 20  back = 0;       
1c410 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  /* Total number 
1c420 6f 66 20 70 61 67 65 73 20 72 65 73 74 6f 72 65  of pages restore
1c430 64 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a  d from journal *
1c440 2f 0a 20 20 75 33 32 20 73 61 76 65 64 50 61 67  /.  u32 savedPag
1c450 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  eSize = pPager->
1c460 70 61 67 65 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20  pageSize;..  /* 
1c470 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
1c480 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20  any records are 
1c490 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
1c4a0 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a   Abort early if.
1c4b0 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
1c4c0 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a   is empty..  */.
1c4d0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
1c4e0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
1c4f0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
1c500 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
1c510 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20  ->jfd, &szJ);.  
1c520 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1c530 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  K ){.    goto en
1c540 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  d_playback;.  }.
1c550 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d  .  /* Read the m
1c560 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
1c570 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  me from the jour
1c580 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72  nal, if it is pr
1c590 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61  esent..  ** If a
1c5a0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1c5b0 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65  file name is spe
1c5c0 63 69 66 69 65 64 2c 20 62 75 74 20 74 68 65 20  cified, but the 
1c5d0 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  file is not.  **
1c5e0 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b   present on disk
1c5f0 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
1c600 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e  al is not hot an
1c610 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  d does not need 
1c620 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65  to be.  ** playe
1c630 64 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a  d back..  **.  *
1c640 2a 20 54 4f 44 4f 3a 20 54 65 63 68 6e 69 63 61  * TODO: Technica
1c650 6c 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  lly the followin
1c660 67 20 69 73 20 61 6e 20 65 72 72 6f 72 20 62 65  g is an error be
1c670 63 61 75 73 65 20 69 74 20 61 73 73 75 6d 65 73  cause it assumes
1c680 20 74 68 61 74 0a 20 20 2a 2a 20 62 75 66 66 65   that.  ** buffe
1c690 72 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63  r Pager.pTmpSpac
1c6a0 65 20 69 73 20 28 6d 78 50 61 74 68 6e 61 6d 65  e is (mxPathname
1c6b0 2b 31 29 20 62 79 74 65 73 20 6f 72 20 6c 61 72  +1) bytes or lar
1c6c0 67 65 72 2e 20 69 2e 65 2e 20 74 68 61 74 0a 20  ger. i.e. that. 
1c6d0 20 2a 2a 20 28 70 50 61 67 65 72 2d 3e 70 61 67   ** (pPager->pag
1c6e0 65 53 69 7a 65 20 3e 3d 20 70 50 61 67 65 72 2d  eSize >= pPager-
1c6f0 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
1c700 65 2b 31 29 2e 20 55 73 69 6e 67 20 6f 73 5f 75  e+1). Using os_u
1c710 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20 6d 78 50 61  nix.c,.  ** mxPa
1c720 74 68 6e 61 6d 65 20 69 73 20 35 31 32 2c 20 77  thname is 512, w
1c730 68 69 63 68 20 69 73 20 74 68 65 20 73 61 6d 65  hich is the same
1c740 20 61 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20   as the minimum 
1c750 61 6c 6c 6f 77 61 62 6c 65 20 76 61 6c 75 65 0a  allowable value.
1c760 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 53 69 7a    ** for pageSiz
1c770 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65  e..  */.  zMaste
1c780 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  r = pPager->pTmp
1c790 53 70 61 63 65 3b 0a 20 20 72 63 20 3d 20 72 65  Space;.  rc = re
1c7a0 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
1c7b0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61  pPager->jfd, zMa
1c7c0 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56  ster, pPager->pV
1c7d0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
1c7e0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1c7f0 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65  ITE_OK && zMaste
1c800 72 5b 30 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d  r[0] ){.    rc =
1c810 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
1c820 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
1c830 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
1c840 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d  ISTS, &res);.  }
1c850 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a  .  zMaster = 0;.
1c860 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1c870 5f 4f 4b 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20  _OK || !res ){. 
1c880 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
1c890 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67  back;.  }.  pPag
1c8a0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
1c8b0 20 30 3b 0a 20 20 6e 65 65 64 50 61 67 65 72 52   0;.  needPagerR
1c8c0 65 73 65 74 20 3d 20 69 73 48 6f 74 3b 0a 0a 20  eset = isHot;.. 
1c8d0 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65   /* This loop te
1c8e0 72 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72 20  rminates either 
1c8f0 77 68 65 6e 20 61 20 72 65 61 64 4a 6f 75 72 6e  when a readJourn
1c900 61 6c 48 64 72 28 29 20 6f 72 20 0a 20 20 2a 2a  alHdr() or .  **
1c910 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
1c920 6f 6e 65 5f 70 61 67 65 28 29 20 63 61 6c 6c 20  one_page() call 
1c930 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44  returns SQLITE_D
1c940 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72  ONE or an IO err
1c950 6f 72 20 0a 20 20 2a 2a 20 6f 63 63 75 72 73 2e  or .  ** occurs.
1c960 20 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20   .  */.  while( 
1c970 31 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65 61 64  1 ){.    /* Read
1c980 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61   the next journa
1c990 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68  l header from th
1c9a0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
1c9b0 20 49 66 20 74 68 65 72 65 20 61 72 65 0a 20 20   If there are.  
1c9c0 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20    ** not enough 
1c9d0 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68  bytes left in th
1c9e0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
1c9f0 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65  or a complete he
1ca00 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20  ader, or.    ** 
1ca10 69 74 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c  it is corrupted,
1ca20 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20   then a process 
1ca30 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64  must have failed
1ca40 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69   while writing i
1ca50 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69  t..    ** This i
1ca60 6e 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67  ndicates nothing
1ca70 20 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62   more needs to b
1ca80 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20  e rolled back.. 
1ca90 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72     */.    rc = r
1caa0 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eadJournalHdr(pP
1cab0 61 67 65 72 2c 20 69 73 48 6f 74 2c 20 73 7a 4a  ager, isHot, szJ
1cac0 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b  , &nRec, &mxPg);
1cad0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1cae0 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20  ITE_OK ){ .     
1caf0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1cb00 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  DONE ){.        
1cb10 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1cb20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
1cb30 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
1cb40 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
1cb50 66 20 6e 52 65 63 20 69 73 20 30 78 66 66 66 66  f nRec is 0xffff
1cb60 66 66 66 66 2c 20 74 68 65 6e 20 74 68 69 73 20  ffff, then this 
1cb70 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63 72 65 61  journal was crea
1cb80 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
1cb90 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20  .    ** working 
1cba0 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e  in no-sync mode.
1cbb0 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
1cbc0 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65   the rest of the
1cbd0 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
1cbe0 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66  file consists of
1cbf0 20 70 61 67 65 73 2c 20 74 68 65 72 65 20 61 72   pages, there ar
1cc00 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61  e no more journa
1cc10 6c 20 68 65 61 64 65 72 73 2e 20 43 6f 6d 70 75  l headers. Compu
1cc20 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61  te.    ** the va
1cc30 6c 75 65 20 6f 66 20 6e 52 65 63 20 62 61 73 65  lue of nRec base
1cc40 64 20 6f 6e 20 74 68 69 73 20 61 73 73 75 6d 70  d on this assump
1cc50 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
1cc60 20 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66   if( nRec==0xfff
1cc70 66 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 61  fffff ){.      a
1cc80 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
1cc90 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e  ournalOff==JOURN
1cca0 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
1ccb0 29 20 29 3b 0a 20 20 20 20 20 20 6e 52 65 63 20  ) );.      nRec 
1ccc0 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 4a  = (int)((szJ - J
1ccd0 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
1cce0 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50  ager))/JOURNAL_P
1ccf0 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20  G_SZ(pPager));. 
1cd00 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1cd10 6e 52 65 63 20 69 73 20 30 20 61 6e 64 20 74 68  nRec is 0 and th
1cd20 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f  is rollback is o
1cd30 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
1cd40 63 72 65 61 74 65 64 20 62 79 20 74 68 69 73 0a  created by this.
1cd50 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61      ** process a
1cd60 6e 64 20 69 66 20 74 68 69 73 20 69 73 20 74 68  nd if this is th
1cd70 65 20 66 69 6e 61 6c 20 68 65 61 64 65 72 20 69  e final header i
1cd80 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74  n the journal, t
1cd90 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20 20  hen it means.   
1cda0 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20 70 61   ** that this pa
1cdb0 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  rt of the journa
1cdc0 6c 20 77 61 73 20 62 65 69 6e 67 20 66 69 6c 6c  l was being fill
1cdd0 65 64 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79  ed but has not y
1cde0 65 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73  et been.    ** s
1cdf0 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 20  ynced to disk.  
1ce00 43 6f 6d 70 75 74 65 20 74 68 65 20 6e 75 6d 62  Compute the numb
1ce10 65 72 20 6f 66 20 70 61 67 65 73 20 62 61 73 65  er of pages base
1ce20 64 20 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e 69  d on the remaini
1ce30 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f  ng.    ** size o
1ce40 66 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20  f the file..    
1ce50 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 68  **.    ** The th
1ce60 69 72 64 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ird term of the 
1ce70 74 65 73 74 20 77 61 73 20 61 64 64 65 64 20 74  test was added t
1ce80 6f 20 66 69 78 20 74 69 63 6b 65 74 20 23 32 35  o fix ticket #25
1ce90 36 35 2e 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20  65..    ** When 
1cea0 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68  rolling back a h
1ceb0 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e 52 65 63  ot journal, nRec
1cec0 3d 3d 30 20 61 6c 77 61 79 73 20 6d 65 61 6e 73  ==0 always means
1ced0 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 0a 20   that the next. 
1cee0 20 20 20 2a 2a 20 63 68 75 6e 6b 20 6f 66 20 74     ** chunk of t
1cef0 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61  he journal conta
1cf00 69 6e 73 20 7a 65 72 6f 20 70 61 67 65 73 20 74  ins zero pages t
1cf10 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
1cf20 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a 20 77 68  .  But.    ** wh
1cf30 65 6e 20 64 6f 69 6e 67 20 61 20 52 4f 4c 4c 42  en doing a ROLLB
1cf40 41 43 4b 20 61 6e 64 20 74 68 65 20 6e 52 65 63  ACK and the nRec
1cf50 3d 3d 30 20 63 68 75 6e 6b 20 69 73 20 74 68 65  ==0 chunk is the
1cf60 20 6c 61 73 74 20 63 68 75 6e 6b 20 69 6e 0a 20   last chunk in. 
1cf70 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61     ** the journa
1cf80 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  l, it means that
1cf90 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67   the journal mig
1cfa0 68 74 20 63 6f 6e 74 61 69 6e 20 61 64 64 69 74  ht contain addit
1cfb0 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20 70 61 67  ional.    ** pag
1cfc0 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  es that need to 
1cfd0 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  be rolled back a
1cfe0 6e 64 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62  nd that the numb
1cff0 65 72 20 6f 66 20 70 61 67 65 73 20 0a 20 20 20  er of pages .   
1d000 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 63 6f   ** should be co
1d010 6d 70 75 74 65 64 20 62 61 73 65 64 20 6f 6e 20  mputed based on 
1d020 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1d030 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   size..    */.  
1d040 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26    if( nRec==0 &&
1d050 20 21 69 73 48 6f 74 20 26 26 0a 20 20 20 20 20   !isHot &&.     
1d060 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
1d070 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alHdr+JOURNAL_HD
1d080 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50  R_SZ(pPager)==pP
1d090 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1d0a0 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d   ){.      nRec =
1d0b0 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 70 50   (int)((szJ - pP
1d0c0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1d0d0 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ) / JOURNAL_PG_S
1d0e0 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  Z(pPager));.    
1d0f0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
1d100 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 68  s is the first h
1d110 65 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20  eader read from 
1d120 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75  the journal, tru
1d130 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a  ncate the.    **
1d140 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
1d150 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ack to its origi
1d160 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  nal size..    */
1d170 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
1d180 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55  >journalOff==JOU
1d190 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
1d1a0 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  er) ){.      rc 
1d1b0 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  = pager_truncate
1d1c0 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a  (pPager, mxPg);.
1d1d0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1d1e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1d1f0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
1d200 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  back;.      }.  
1d210 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
1d220 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d  ze = mxPg;.    }
1d230 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72  ..    /* Copy or
1d240 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74  iginal pages out
1d250 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1d260 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  and back into th
1d270 65 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  e .    ** databa
1d280 73 65 20 66 69 6c 65 20 61 6e 64 2f 6f 72 20 70  se file and/or p
1d290 61 67 65 20 63 61 63 68 65 2e 0a 20 20 20 20 2a  age cache..    *
1d2a0 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30 3b 20 75  /.    for(u=0; u
1d2b0 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a 20 20 20  <nRec; u++){.   
1d2c0 20 20 20 69 66 28 20 6e 65 65 64 50 61 67 65 72     if( needPager
1d2d0 52 65 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20  Reset ){.       
1d2e0 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
1d2f0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 6e 65  ger);.        ne
1d300 65 64 50 61 67 65 72 52 65 73 65 74 20 3d 20 30  edPagerReset = 0
1d310 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1d320 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
1d330 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
1d340 67 65 72 2c 26 70 50 61 67 65 72 2d 3e 6a 6f 75  ger,&pPager->jou
1d350 72 6e 61 6c 4f 66 66 2c 30 2c 31 2c 30 29 3b 0a  rnalOff,0,1,0);.
1d360 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1d370 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1d380 20 20 20 6e 50 6c 61 79 62 61 63 6b 2b 2b 3b 0a     nPlayback++;.
1d390 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1d3a0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1d3b0 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
1d3c0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
1d3d0 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
1d3e0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1d3f0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
1d400 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
1d410 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
1d420 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
1d430 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  f the journal ha
1d440 73 20 62 65 65 6e 20 74 72 75 6e 63 61 74 65 64  s been truncated
1d450 2c 20 73 69 6d 70 6c 79 20 73 74 6f 70 20 72 65  , simply stop re
1d460 61 64 69 6e 67 20 61 6e 64 0a 20 20 20 20 20 20  ading and.      
1d470 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e      ** processin
1d480 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 54  g the journal. T
1d490 68 69 73 20 6d 69 67 68 74 20 68 61 70 70 65 6e  his might happen
1d4a0 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   if the journal 
1d4b0 77 61 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  was.          **
1d4c0 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20   not completely 
1d4d0 77 72 69 74 74 65 6e 20 61 6e 64 20 73 79 6e 63  written and sync
1d4e0 65 64 20 70 72 69 6f 72 20 74 6f 20 61 20 63 72  ed prior to a cr
1d4f0 61 73 68 2e 20 20 49 6e 20 74 68 61 74 0a 20 20  ash.  In that.  
1d500 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 2c          ** case,
1d510 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 68   the database sh
1d520 6f 75 6c 64 20 68 61 76 65 20 6e 65 76 65 72 20  ould have never 
1d530 62 65 65 6e 20 77 72 69 74 74 65 6e 20 69 6e 20  been written in 
1d540 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
1d550 20 66 69 72 73 74 20 70 6c 61 63 65 20 73 6f 20   first place so 
1d560 69 74 20 69 73 20 4f 4b 20 74 6f 20 73 69 6d 70  it is OK to simp
1d570 6c 79 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 72  ly abandon the r
1d580 6f 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 20 20 20 20  ollback. */.    
1d590 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1d5a0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
1d5b0 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
1d5c0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
1d5d0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
1d5e0 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20  f we are unable 
1d5f0 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 71 75 69  to rollback, qui
1d600 74 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  t and return the
1d610 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20   error.         
1d620 20 2a 2a 20 63 6f 64 65 2e 20 20 54 68 69 73 20   ** code.  This 
1d630 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 70  will cause the p
1d640 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68  ager to enter th
1d650 65 20 65 72 72 6f 72 20 73 74 61 74 65 0a 20 20  e error state.  
1d660 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 74 68          ** so th
1d670 61 74 20 6e 6f 20 66 75 72 74 68 65 72 20 68 61  at no further ha
1d680 72 6d 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 2e  rm will be done.
1d690 20 20 50 65 72 68 61 70 73 20 74 68 65 20 6e 65    Perhaps the ne
1d6a0 78 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  xt.          ** 
1d6b0 70 72 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65 20  process to come 
1d6c0 61 6c 6f 6e 67 20 77 69 6c 6c 20 62 65 20 61 62  along will be ab
1d6d0 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74  le to rollback t
1d6e0 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20  he database..   
1d6f0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1d700 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
1d710 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  yback;.        }
1d720 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1d730 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45   }.  /*NOTREACHE
1d740 44 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 20  D*/.  assert( 0 
1d750 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b  );..end_playback
1d760 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  :.  if( rc==SQLI
1d770 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
1d780 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
1d790 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72  tPagesize(pPager
1d7a0 2c 20 26 73 61 76 65 64 50 61 67 65 53 69 7a 65  , &savedPageSize
1d7b0 2c 20 2d 31 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20  , -1);.  }.  /* 
1d7c0 46 6f 6c 6c 6f 77 69 6e 67 20 61 20 72 6f 6c 6c  Following a roll
1d7d0 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61  back, the databa
1d7e0 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62  se file should b
1d7f0 65 20 62 61 63 6b 20 69 6e 20 69 74 73 20 6f 72  e back in its or
1d800 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 73 74 61 74  iginal.  ** stat
1d810 65 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73  e prior to the s
1d820 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e  tart of the tran
1d830 73 61 63 74 69 6f 6e 2c 20 73 6f 20 69 6e 76 6f  saction, so invo
1d840 6b 65 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49  ke the.  ** SQLI
1d850 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48  TE_FCNTL_DB_UNCH
1d860 41 4e 47 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72  ANGED file-contr
1d870 6f 6c 20 6d 65 74 68 6f 64 20 74 6f 20 64 69 73  ol method to dis
1d880 61 62 6c 65 20 74 68 65 0a 20 20 2a 2a 20 61 73  able the.  ** as
1d890 73 65 72 74 69 6f 6e 20 74 68 61 74 20 74 68 65  sertion that the
1d8a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1d8b0 6e 74 65 72 20 77 61 73 20 6d 6f 64 69 66 69 65  nter was modifie
1d8c0 64 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  d..  */.#ifdef S
1d8d0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 73 71  QLITE_DEBUG.  sq
1d8e0 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
1d8f0 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66  olHint(pPager->f
1d900 64 2c 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44  d,SQLITE_FCNTL_D
1d910 42 5f 55 4e 43 48 41 4e 47 45 44 2c 30 29 3b 0a  B_UNCHANGED,0);.
1d920 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
1d930 74 68 69 73 20 70 6c 61 79 62 61 63 6b 20 69 73  this playback is
1d940 20 68 61 70 70 65 6e 69 6e 67 20 61 75 74 6f 6d   happening autom
1d950 61 74 69 63 61 6c 6c 79 20 61 73 20 61 20 72 65  atically as a re
1d960 73 75 6c 74 20 6f 66 20 61 6e 20 49 4f 20 6f 72  sult of an IO or
1d970 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72   .  ** malloc er
1d980 72 6f 72 20 74 68 61 74 20 6f 63 63 75 72 72 65  ror that occurre
1d990 64 20 61 66 74 65 72 20 74 68 65 20 63 68 61 6e  d after the chan
1d9a0 67 65 2d 63 6f 75 6e 74 65 72 20 77 61 73 20 75  ge-counter was u
1d9b0 70 64 61 74 65 64 20 62 75 74 20 0a 20 20 2a 2a  pdated but .  **
1d9c0 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e   before the tran
1d9d0 73 61 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d  saction was comm
1d9e0 69 74 74 65 64 2c 20 74 68 65 6e 20 74 68 65 20  itted, then the 
1d9f0 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a  change-counter .
1da00 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f    ** modificatio
1da10 6e 20 6d 61 79 20 6a 75 73 74 20 68 61 76 65 20  n may just have 
1da20 62 65 65 6e 20 72 65 76 65 72 74 65 64 2e 20 49  been reverted. I
1da30 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 20 69  f this happens i
1da40 6e 20 65 78 63 6c 75 73 69 76 65 20 0a 20 20 2a  n exclusive .  *
1da50 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 73 75 62  * mode, then sub
1da60 73 65 71 75 65 6e 74 20 74 72 61 6e 73 61 63 74  sequent transact
1da70 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65 64 20 62  ions performed b
1da80 79 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  y the connection
1da90 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75   will not.  ** u
1daa0 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
1dab0 2d 63 6f 75 6e 74 65 72 20 61 74 20 61 6c 6c 2e  -counter at all.
1dac0 20 54 68 69 73 20 6d 61 79 20 6c 65 61 64 20 74   This may lead t
1dad0 6f 20 63 61 63 68 65 20 69 6e 63 6f 6e 73 69 73  o cache inconsis
1dae0 74 65 6e 63 79 0a 20 20 2a 2a 20 70 72 6f 62 6c  tency.  ** probl
1daf0 65 6d 73 20 66 6f 72 20 6f 74 68 65 72 20 70 72  ems for other pr
1db00 6f 63 65 73 73 65 73 20 61 74 20 73 6f 6d 65 20  ocesses at some 
1db10 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74  point in the fut
1db20 75 72 65 2e 20 53 6f 2c 20 6a 75 73 74 0a 20 20  ure. So, just.  
1db30 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 69 73 20  ** in case this 
1db40 68 61 73 20 68 61 70 70 65 6e 65 64 2c 20 63 6c  has happened, cl
1db50 65 61 72 20 74 68 65 20 63 68 61 6e 67 65 43 6f  ear the changeCo
1db60 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 6e 6f 77  untDone flag now
1db70 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
1db80 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
1db90 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
1dba0 69 6c 65 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d  ile;..  if( rc==
1dbb0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1dbc0 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65   zMaster = pPage
1dbd0 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20  r->pTmpSpace;.  
1dbe0 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65    rc = readMaste
1dbf0 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  rJournal(pPager-
1dc00 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70  >jfd, zMaster, p
1dc10 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50  Pager->pVfs->mxP
1dc20 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20  athname+1);.    
1dc30 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
1dc40 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20  LITE_OK );.  }. 
1dc50 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1dc60 4f 4b 0a 20 20 20 26 26 20 28 70 50 61 67 65 72  OK.   && (pPager
1dc70 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
1dc80 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20  WRITER_DBMOD || 
1dc90 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
1dca0 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20 29 7b  PAGER_OPEN).  ){
1dcb0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1dcc0 33 50 61 67 65 72 53 79 6e 63 28 70 50 61 67 65  3PagerSync(pPage
1dcd0 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  r, 0);.  }.  if(
1dce0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1dcf0 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
1dd00 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
1dd10 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  (pPager, zMaster
1dd20 5b 30 5d 21 3d 27 5c 30 27 2c 20 30 29 3b 0a 20  [0]!='\0', 0);. 
1dd30 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
1dd40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
1dd50 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
1dd60 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72  TE_OK && zMaster
1dd70 5b 30 5d 20 26 26 20 72 65 73 20 29 7b 0a 20 20  [0] && res ){.  
1dd80 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61    /* If there wa
1dd90 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  s a master journ
1dda0 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74  al and this rout
1ddb0 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  ine will return 
1ddc0 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20  success,.    ** 
1ddd0 73 65 65 20 69 66 20 69 74 20 69 73 20 70 6f 73  see if it is pos
1dde0 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20  sible to delete 
1ddf0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
1de00 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  al..    */.    r
1de10 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73  c = pager_delmas
1de20 74 65 72 28 70 50 61 67 65 72 2c 20 7a 4d 61 73  ter(pPager, zMas
1de30 74 65 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61  ter);.    testca
1de40 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
1de50 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  K );.  }.  if( i
1de60 73 48 6f 74 20 26 26 20 6e 50 6c 61 79 62 61 63  sHot && nPlaybac
1de70 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  k ){.    sqlite3
1de80 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 54 49  _log(SQLITE_NOTI
1de90 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f 4c 4c 42  CE_RECOVER_ROLLB
1dea0 41 43 4b 2c 20 22 72 65 63 6f 76 65 72 65 64 20  ACK, "recovered 
1deb0 25 64 20 70 61 67 65 73 20 66 72 6f 6d 20 25 73  %d pages from %s
1dec0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1ded0 20 20 20 6e 50 6c 61 79 62 61 63 6b 2c 20 70 50     nPlayback, pP
1dee0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b  ager->zJournal);
1def0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50  .  }..  /* The P
1df00 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20  ager.sectorSize 
1df10 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76  variable may hav
1df20 65 20 62 65 65 6e 20 75 70 64 61 74 65 64 20 77  e been updated w
1df30 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a  hile rolling.  *
1df40 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c  * back a journal
1df50 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
1df60 6f 63 65 73 73 20 77 69 74 68 20 61 20 64 69 66  ocess with a dif
1df70 66 65 72 65 6e 74 20 73 65 63 74 6f 72 20 73 69  ferent sector si
1df80 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52  ze.  ** value. R
1df90 65 73 65 74 20 69 74 20 74 6f 20 74 68 65 20 63  eset it to the c
1dfa0 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72  orrect value for
1dfb0 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 20   this process.. 
1dfc0 20 2a 2f 0a 20 20 73 65 74 53 65 63 74 6f 72 53   */.  setSectorS
1dfd0 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ize(pPager);.  r
1dfe0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
1dff0 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f 6e  .** Read the con
1e000 74 65 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50  tent for page pP
1e010 67 20 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74  g out of the dat
1e020 61 62 61 73 65 20 66 69 6c 65 20 28 6f 72 20 6f  abase file (or o
1e030 75 74 20 6f 66 0a 2a 2a 20 74 68 65 20 57 41 4c  ut of.** the WAL
1e040 20 69 66 20 74 68 61 74 20 69 73 20 77 68 65 72   if that is wher
1e050 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  e the most recen
1e060 74 20 63 6f 70 79 20 69 66 20 66 6f 75 6e 64 29  t copy if found)
1e070 20 69 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70   into .** pPg->p
1e080 44 61 74 61 2e 20 41 20 73 68 61 72 65 64 20 6c  Data. A shared l
1e090 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d  ock or greater m
1e0a0 75 73 74 20 62 65 20 68 65 6c 64 20 6f 6e 20 74  ust be held on t
1e0b0 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  he database.** f
1e0c0 69 6c 65 20 62 65 66 6f 72 65 20 74 68 69 73 20  ile before this 
1e0d0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1e0e0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67  ed..**.** If pag
1e0f0 65 20 31 20 69 73 20 72 65 61 64 2c 20 74 68 65  e 1 is read, the
1e100 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50  n the value of P
1e110 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b  ager.dbFileVers[
1e120 5d 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 74  ] is set to.** t
1e130 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
1e140 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
1e150 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  file..**.** If a
1e160 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
1e170 73 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65  s, then the IO e
1e180 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
1e190 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
1e1a0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  ** Otherwise, SQ
1e1b0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1e1c0 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
1e1d0 6e 74 20 72 65 61 64 44 62 50 61 67 65 28 50 67  nt readDbPage(Pg
1e1e0 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
1e1f0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
1e200 2d 3e 70 50 61 67 65 72 3b 20 2f 2a 20 50 61 67  ->pPager; /* Pag
1e210 65 72 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69  er object associ
1e220 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20 70  ated with page p
1e230 50 67 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  Pg */.  int rc =
1e240 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
1e250 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
1e260 6f 64 65 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ode */..#ifndef 
1e270 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
1e280 20 20 75 33 32 20 69 46 72 61 6d 65 20 3d 20 30    u32 iFrame = 0
1e290 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1e2a0 2a 20 46 72 61 6d 65 20 6f 66 20 57 41 4c 20 63  * Frame of WAL c
1e2b0 6f 6e 74 61 69 6e 69 6e 67 20 70 67 6e 6f 20 2a  ontaining pgno *
1e2c0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
1e2d0 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
1e2e0 45 52 5f 52 45 41 44 45 52 20 26 26 20 21 4d 45  ER_READER && !ME
1e2f0 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MDB );.  assert(
1e300 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1e310 66 64 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 61  fd) );..  if( pa
1e320 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
1e330 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ) ){.    rc = sq
1e340 6c 69 74 65 33 57 61 6c 46 69 6e 64 46 72 61 6d  lite3WalFindFram
1e350 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
1e360 70 50 67 2d 3e 70 67 6e 6f 2c 20 26 69 46 72 61  pPg->pgno, &iFra
1e370 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  me);.    if( rc 
1e380 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
1e390 0a 20 20 69 66 28 20 69 46 72 61 6d 65 20 29 7b  .  if( iFrame ){
1e3a0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1e3b0 33 57 61 6c 52 65 61 64 46 72 61 6d 65 28 70 50  3WalReadFrame(pP
1e3c0 61 67 65 72 2d 3e 70 57 61 6c 2c 20 69 46 72 61  ager->pWal, iFra
1e3d0 6d 65 2c 70 50 61 67 65 72 2d 3e 70 61 67 65 53  me,pPager->pageS
1e3e0 69 7a 65 2c 70 50 67 2d 3e 70 44 61 74 61 29 3b  ize,pPg->pData);
1e3f0 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a  .  }else.#endif.
1e400 20 20 7b 0a 20 20 20 20 69 36 34 20 69 4f 66 66    {.    i64 iOff
1e410 73 65 74 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f  set = (pPg->pgno
1e420 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
1e430 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72  >pageSize;.    r
1e440 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
1e450 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  d(pPager->fd, pP
1e460 67 2d 3e 70 44 61 74 61 2c 20 70 50 61 67 65 72  g->pData, pPager
1e470 2d 3e 70 61 67 65 53 69 7a 65 2c 20 69 4f 66 66  ->pageSize, iOff
1e480 73 65 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  set);.    if( rc
1e490 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
1e4a0 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
1e4b0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1e4c0 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  K;.    }.  }..  
1e4d0 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31  if( pPg->pgno==1
1e4e0 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 20 29   ){.    if( rc )
1e4f0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
1e500 65 20 72 65 61 64 20 69 73 20 75 6e 73 75 63 63  e read is unsucc
1e510 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20  essful, set the 
1e520 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 74 6f 20  dbFileVers[] to 
1e530 73 6f 6d 65 74 68 69 6e 67 0a 20 20 20 20 20 20  something.      
1e540 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 76  ** that will nev
1e550 65 72 20 62 65 20 61 20 76 61 6c 69 64 20 66 69  er be a valid fi
1e560 6c 65 20 76 65 72 73 69 6f 6e 2e 20 20 64 62 46  le version.  dbF
1e570 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 61 20 63  ileVers[] is a c
1e580 6f 70 79 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  opy.      ** of 
1e590 62 79 74 65 73 20 32 34 2e 2e 33 39 20 6f 66 20  bytes 24..39 of 
1e5a0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 42  the database.  B
1e5b0 79 74 65 73 20 32 38 2e 2e 33 31 20 73 68 6f 75  ytes 28..31 shou
1e5c0 6c 64 20 61 6c 77 61 79 73 20 62 65 0a 20 20 20  ld always be.   
1e5d0 20 20 20 2a 2a 20 7a 65 72 6f 20 6f 72 20 74 68     ** zero or th
1e5e0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
1e5f0 74 61 62 61 73 65 20 69 6e 20 70 61 67 65 2e 20  tabase in page. 
1e600 42 79 74 65 73 20 33 32 2e 2e 33 35 20 61 6e 64  Bytes 32..35 and
1e610 20 33 35 2e 2e 33 39 0a 20 20 20 20 20 20 2a 2a   35..39.      **
1e620 20 73 68 6f 75 6c 64 20 62 65 20 70 61 67 65 20   should be page 
1e630 6e 75 6d 62 65 72 73 20 77 68 69 63 68 20 61 72  numbers which ar
1e640 65 20 6e 65 76 65 72 20 30 78 66 66 66 66 66 66  e never 0xffffff
1e650 66 66 2e 20 20 53 6f 20 66 69 6c 6c 69 6e 67 0a  ff.  So filling.
1e660 20 20 20 20 20 20 2a 2a 20 70 50 61 67 65 72 2d        ** pPager-
1e670 3e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 77 69  >dbFileVers[] wi
1e680 74 68 20 61 6c 6c 20 30 78 66 66 20 62 79 74 65  th all 0xff byte
1e690 73 20 73 68 6f 75 6c 64 20 73 75 66 66 69 63 65  s should suffice
1e6a0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
1e6b0 20 2a 2a 20 46 6f 72 20 61 6e 20 65 6e 63 72 79   ** For an encry
1e6c0 70 74 65 64 20 64 61 74 61 62 61 73 65 2c 20 74  pted database, t
1e6d0 68 65 20 73 69 74 75 61 74 69 6f 6e 20 69 73 20  he situation is 
1e6e0 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 3a 20 20 62  more complex:  b
1e6f0 79 74 65 73 0a 20 20 20 20 20 20 2a 2a 20 32 34  ytes.      ** 24
1e700 2e 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74 61  ..39 of the data
1e710 62 61 73 65 20 61 72 65 20 77 68 69 74 65 20 6e  base are white n
1e720 6f 69 73 65 2e 20 20 42 75 74 20 74 68 65 20 70  oise.  But the p
1e730 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 0a 20 20  robability of.  
1e740 20 20 20 20 2a 2a 20 77 68 69 74 65 20 6e 6f 69      ** white noi
1e750 73 65 20 65 71 75 61 6c 69 6e 67 20 31 36 20 62  se equaling 16 b
1e760 79 74 65 73 20 6f 66 20 30 78 66 66 20 69 73 20  ytes of 0xff is 
1e770 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c  vanishingly smal
1e780 6c 20 73 6f 0a 20 20 20 20 20 20 2a 2a 20 77 65  l so.      ** we
1e790 20 73 68 6f 75 6c 64 20 73 74 69 6c 6c 20 62 65   should still be
1e7a0 20 6f 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20   ok..      */.  
1e7b0 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65      memset(pPage
1e7c0 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 30  r->dbFileVers, 0
1e7d0 78 66 66 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  xff, sizeof(pPag
1e7e0 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
1e7f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1e800 20 20 20 75 38 20 2a 64 62 46 69 6c 65 56 65 72     u8 *dbFileVer
1e810 73 20 3d 20 26 28 28 75 38 2a 29 70 50 67 2d 3e  s = &((u8*)pPg->
1e820 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20  pData)[24];.    
1e830 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
1e840 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62  ->dbFileVers, db
1e850 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66  FileVers, sizeof
1e860 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
1e870 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ers));.    }.  }
1e880 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72  .  CODEC1(pPager
1e890 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 50  , pPg->pData, pP
1e8a0 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72 63 20 3d  g->pgno, 3, rc =
1e8b0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
1e8c0 50 54 29 3b 0a 0a 20 20 50 41 47 45 52 5f 49 4e  PT);..  PAGER_IN
1e8d0 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
1e8e0 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a  _readdb_count);.
1e8f0 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61    PAGER_INCR(pPa
1e900 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49  ger->nRead);.  I
1e910 4f 54 52 41 43 45 28 28 22 50 47 49 4e 20 25 70  OTRACE(("PGIN %p
1e920 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
1e930 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 50  pPg->pgno));.  P
1e940 41 47 45 52 54 52 41 43 45 28 28 22 46 45 54 43  AGERTRACE(("FETC
1e950 48 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73  H %d page %d has
1e960 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20  h(%08x)\n",.    
1e970 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
1e980 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
1e990 3e 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67  >pgno, pager_pag
1e9a0 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20  ehash(pPg)));.. 
1e9b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1e9c0 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20  *.** Update the 
1e9d0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63 68 61  value of the cha
1e9e0 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 6f  nge-counter at o
1e9f0 66 66 73 65 74 73 20 32 34 20 61 6e 64 20 39 32  ffsets 24 and 92
1ea00 20 69 6e 0a 2a 2a 20 74 68 65 20 68 65 61 64 65   in.** the heade
1ea10 72 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65  r and the sqlite
1ea20 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20   version number 
1ea30 61 74 20 6f 66 66 73 65 74 20 39 36 2e 0a 2a 2a  at offset 96..**
1ea40 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 75  .** This is an u
1ea50 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 75 70 64  nconditional upd
1ea60 61 74 65 2e 20 20 53 65 65 20 61 6c 73 6f 20 74  ate.  See also t
1ea70 68 65 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68  he pager_incr_ch
1ea80 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 0a 2a 2a  angecounter().**
1ea90 20 72 6f 75 74 69 6e 65 20 77 68 69 63 68 20 6f   routine which o
1eaa0 6e 6c 79 20 75 70 64 61 74 65 73 20 74 68 65 20  nly updates the 
1eab0 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69  change-counter i
1eac0 66 20 74 68 65 20 75 70 64 61 74 65 20 69 73 20  f the update is 
1ead0 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6e 65 65 64  actually.** need
1eae0 65 64 2c 20 61 73 20 64 65 74 65 72 6d 69 6e 65  ed, as determine
1eaf0 64 20 62 79 20 74 68 65 20 70 50 61 67 65 72 2d  d by the pPager-
1eb00 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
1eb10 20 73 74 61 74 65 20 76 61 72 69 61 62 6c 65 2e   state variable.
1eb20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1eb30 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e  pager_write_chan
1eb40 67 65 63 6f 75 6e 74 65 72 28 50 67 48 64 72 20  gecounter(PgHdr 
1eb50 2a 70 50 67 29 7b 0a 20 20 75 33 32 20 63 68 61  *pPg){.  u32 cha
1eb60 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 0a 20 20  nge_counter;..  
1eb70 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  /* Increment the
1eb80 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64   value just read
1eb90 20 61 6e 64 20 77 72 69 74 65 20 69 74 20 62 61   and write it ba
1eba0 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a  ck to byte 24. *
1ebb0 2f 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  /.  change_count
1ebc0 65 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34  er = sqlite3Get4
1ebd0 62 79 74 65 28 28 75 38 2a 29 70 50 67 2d 3e 70  byte((u8*)pPg->p
1ebe0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1ebf0 73 29 2b 31 3b 0a 20 20 70 75 74 33 32 62 69 74  s)+1;.  put32bit
1ec00 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70  s(((char*)pPg->p
1ec10 44 61 74 61 29 2b 32 34 2c 20 63 68 61 6e 67 65  Data)+24, change
1ec20 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 2f 2a  _counter);..  /*
1ec30 20 41 6c 73 6f 20 73 74 6f 72 65 20 74 68 65 20   Also store the 
1ec40 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20 6e  SQLite version n
1ec50 75 6d 62 65 72 20 69 6e 20 62 79 74 65 73 20 39  umber in bytes 9
1ec60 36 2e 2e 39 39 20 61 6e 64 20 69 6e 0a 20 20 2a  6..99 and in.  *
1ec70 2a 20 62 79 74 65 73 20 39 32 2e 2e 39 35 20 73  * bytes 92..95 s
1ec80 74 6f 72 65 20 74 68 65 20 63 68 61 6e 67 65 20  tore the change 
1ec90 63 6f 75 6e 74 65 72 20 66 6f 72 20 77 68 69 63  counter for whic
1eca0 68 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6e 75  h the version nu
1ecb0 6d 62 65 72 0a 20 20 2a 2a 20 69 73 20 76 61 6c  mber.  ** is val
1ecc0 69 64 2e 20 2a 2f 0a 20 20 70 75 74 33 32 62 69  id. */.  put32bi
1ecd0 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e  ts(((char*)pPg->
1ece0 70 44 61 74 61 29 2b 39 32 2c 20 63 68 61 6e 67  pData)+92, chang
1ecf0 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 20 20 70 75  e_counter);.  pu
1ed00 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29  t32bits(((char*)
1ed10 70 50 67 2d 3e 70 44 61 74 61 29 2b 39 36 2c 20  pPg->pData)+96, 
1ed20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e  SQLITE_VERSION_N
1ed30 55 4d 42 45 52 29 3b 0a 7d 0a 0a 23 69 66 6e 64  UMBER);.}..#ifnd
1ed40 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
1ed50 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  AL./*.** This fu
1ed60 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65  nction is invoke
1ed70 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  d once for each 
1ed80 70 61 67 65 20 74 68 61 74 20 68 61 73 20 61 6c  page that has al
1ed90 72 65 61 64 79 20 62 65 65 6e 20 0a 2a 2a 20 77  ready been .** w
1eda0 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
1edb0 6c 6f 67 20 66 69 6c 65 20 77 68 65 6e 20 61 20  log file when a 
1edc0 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  WAL transaction 
1edd0 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  is rolled back..
1ede0 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 69 50 67  ** Parameter iPg
1edf0 20 69 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d   is the page num
1ee00 62 65 72 20 6f 66 20 73 61 69 64 20 70 61 67 65  ber of said page
1ee10 2e 20 54 68 65 20 70 43 74 78 20 61 72 67 75 6d  . The pCtx argum
1ee20 65 6e 74 20 0a 2a 2a 20 69 73 20 61 63 74 75 61  ent .** is actua
1ee30 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  lly a pointer to
1ee40 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
1ee50 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  ture..**.** If p
1ee60 61 67 65 20 69 50 67 20 69 73 20 70 72 65 73 65  age iPg is prese
1ee70 6e 74 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c  nt in the cache,
1ee80 20 61 6e 64 20 68 61 73 20 6e 6f 20 6f 75 74 73   and has no outs
1ee90 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
1eea0 65 73 2c 0a 2a 2a 20 69 74 20 69 73 20 64 69 73  es,.** it is dis
1eeb0 63 61 72 64 65 64 2e 20 4f 74 68 65 72 77 69 73  carded. Otherwis
1eec0 65 2c 20 69 66 20 74 68 65 72 65 20 61 72 65 20  e, if there are 
1eed0 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73  one or more outs
1eee0 74 61 6e 64 69 6e 67 0a 2a 2a 20 72 65 66 65 72  tanding.** refer
1eef0 65 6e 63 65 73 2c 20 74 68 65 20 70 61 67 65 20  ences, the page 
1ef00 63 6f 6e 74 65 6e 74 20 69 73 20 72 65 6c 6f 61  content is reloa
1ef10 64 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ded from the dat
1ef20 61 62 61 73 65 2e 20 49 66 20 74 68 65 0a 2a 2a  abase. If the.**
1ef30 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 6c 6f   attempt to relo
1ef40 61 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ad content from 
1ef50 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
1ef60 72 65 71 75 69 72 65 64 20 61 6e 64 20 66 61 69  required and fai
1ef70 6c 73 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61  ls, .** return a
1ef80 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
1ef90 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ode. Otherwise, 
1efa0 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74  SQLITE_OK..*/.st
1efb0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55 6e  atic int pagerUn
1efc0 64 6f 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20  doCallback(void 
1efd0 2a 70 43 74 78 2c 20 50 67 6e 6f 20 69 50 67 29  *pCtx, Pgno iPg)
1efe0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1eff0 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20  ITE_OK;.  Pager 
1f000 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67 65 72  *pPager = (Pager
1f010 20 2a 29 70 43 74 78 3b 0a 20 20 50 67 48 64 72   *)pCtx;.  PgHdr
1f020 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74   *pPg;..  assert
1f030 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
1f040 61 67 65 72 29 20 29 3b 0a 20 20 70 50 67 20 3d  ager) );.  pPg =
1f050 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
1f060 6b 75 70 28 70 50 61 67 65 72 2c 20 69 50 67 29  kup(pPager, iPg)
1f070 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20  ;.  if( pPg ){. 
1f080 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 63     if( sqlite3Pc
1f090 61 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e 74  achePageRefcount
1f0a0 28 70 50 67 29 3d 3d 31 20 29 7b 0a 20 20 20 20  (pPg)==1 ){.    
1f0b0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44    sqlite3PcacheD
1f0c0 72 6f 70 28 70 50 67 29 3b 0a 20 20 20 20 7d 65  rop(pPg);.    }e
1f0d0 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
1f0e0 72 65 61 64 44 62 50 61 67 65 28 70 50 67 29 3b  readDbPage(pPg);
1f0f0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1f100 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1f110 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69      pPager->xRei
1f120 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20  niter(pPg);.    
1f130 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1f140 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75  3PagerUnrefNotNu
1f150 6c 6c 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  ll(pPg);.    }. 
1f160 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c   }..  /* Normall
1f170 79 2c 20 69 66 20 61 20 74 72 61 6e 73 61 63 74  y, if a transact
1f180 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
1f190 63 6b 2c 20 61 6e 79 20 62 61 63 6b 75 70 20 70  ck, any backup p
1f1a0 72 6f 63 65 73 73 65 73 20 61 72 65 0a 20 20 2a  rocesses are.  *
1f1b0 2a 20 75 70 64 61 74 65 64 20 61 73 20 64 61 74  * updated as dat
1f1c0 61 20 69 73 20 63 6f 70 69 65 64 20 6f 75 74 20  a is copied out 
1f1d0 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  of the rollback 
1f1e0 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 6e 74 6f  journal and into
1f1f0 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
1f200 73 65 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20  se. This is not 
1f210 67 65 6e 65 72 61 6c 6c 79 20 70 6f 73 73 69 62  generally possib
1f220 6c 65 20 77 69 74 68 20 61 20 57 41 4c 20 64 61  le with a WAL da
1f230 74 61 62 61 73 65 2c 20 61 73 0a 20 20 2a 2a 20  tabase, as.  ** 
1f240 72 6f 6c 6c 62 61 63 6b 20 69 6e 76 6f 6c 76 65  rollback involve
1f250 73 20 73 69 6d 70 6c 79 20 74 72 75 6e 63 61 74  s simply truncat
1f260 69 6e 67 20 74 68 65 20 6c 6f 67 20 66 69 6c 65  ing the log file
1f270 2e 20 54 68 65 72 65 66 6f 72 65 2c 20 69 66 20  . Therefore, if 
1f280 6f 6e 65 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72 65  one.  ** or more
1f290 20 66 72 61 6d 65 73 20 68 61 76 65 20 61 6c 72   frames have alr
1f2a0 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
1f2b0 6e 20 74 6f 20 74 68 65 20 6c 6f 67 20 28 61 6e  n to the log (an
1f2c0 64 20 74 68 65 72 65 66 6f 72 65 20 0a 20 20 2a  d therefore .  *
1f2d0 2a 20 61 6c 73 6f 20 63 6f 70 69 65 64 20 69 6e  * also copied in
1f2e0 74 6f 20 74 68 65 20 62 61 63 6b 75 70 20 64 61  to the backup da
1f2f0 74 61 62 61 73 65 73 29 20 61 73 20 70 61 72 74  tabases) as part
1f300 20 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61 63   of this transac
1f310 74 69 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65 20 62  tion,.  ** the b
1f320 61 63 6b 75 70 73 20 6d 75 73 74 20 62 65 20 72  ackups must be r
1f330 65 73 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a 20  estarted..  */. 
1f340 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65   sqlite3BackupRe
1f350 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42  start(pPager->pB
1f360 61 63 6b 75 70 29 3b 0a 0a 20 20 72 65 74 75 72  ackup);..  retur
1f370 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1f380 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1f390 63 61 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61  called to rollba
1f3a0 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ck a transaction
1f3b0 20 6f 6e 20 61 20 57 41 4c 20 64 61 74 61 62 61   on a WAL databa
1f3c0 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
1f3d0 74 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57  t pagerRollbackW
1f3e0 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
1f3f0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
1f400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f410 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43       /* Return C
1f420 6f 64 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ode */.  PgHdr *
1f430 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  pList;          
1f440 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
1f450 20 6f 66 20 64 69 72 74 79 20 70 61 67 65 73 20   of dirty pages 
1f460 74 6f 20 72 65 76 65 72 74 20 2a 2f 0a 0a 20 20  to revert */..  
1f470 2f 2a 20 46 6f 72 20 61 6c 6c 20 70 61 67 65 73  /* For all pages
1f480 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 74 68   in the cache th
1f490 61 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  at are currently
1f4a0 20 64 69 72 74 79 20 6f 72 20 68 61 76 65 20 61   dirty or have a
1f4b0 6c 72 65 61 64 79 0a 20 20 2a 2a 20 62 65 65 6e  lready.  ** been
1f4c0 20 77 72 69 74 74 65 6e 20 28 62 75 74 20 6e 6f   written (but no
1f4d0 74 20 63 6f 6d 6d 69 74 74 65 64 29 20 74 6f 20  t committed) to 
1f4e0 74 68 65 20 6c 6f 67 20 66 69 6c 65 2c 20 64 6f  the log file, do
1f4f0 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 20 20 2a   one of the .  *
1f500 2a 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a  * following:.  *
1f510 2a 0a 20 20 2a 2a 20 20 20 2b 20 44 69 73 63 61  *.  **   + Disca
1f520 72 64 20 74 68 65 20 63 61 63 68 65 64 20 70 61  rd the cached pa
1f530 67 65 20 28 69 66 20 72 65 66 63 6f 75 6e 74 3d  ge (if refcount=
1f540 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 2b  =0), or.  **   +
1f550 20 52 65 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e   Reload page con
1f560 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61  tent from the da
1f570 74 61 62 61 73 65 20 28 69 66 20 72 65 66 63 6f  tabase (if refco
1f580 75 6e 74 3e 30 29 2e 0a 20 20 2a 2f 0a 20 20 70  unt>0)..  */.  p
1f590 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
1f5a0 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
1f5b0 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ze;.  rc = sqlit
1f5c0 65 33 57 61 6c 55 6e 64 6f 28 70 50 61 67 65 72  e3WalUndo(pPager
1f5d0 2d 3e 70 57 61 6c 2c 20 70 61 67 65 72 55 6e 64  ->pWal, pagerUnd
1f5e0 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64  oCallback, (void
1f5f0 20 2a 29 70 50 61 67 65 72 29 3b 0a 20 20 70 4c   *)pPager);.  pL
1f600 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61  ist = sqlite3Pca
1f610 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61  cheDirtyList(pPa
1f620 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
1f630 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 26 26   while( pList &&
1f640 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1f650 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 4e 65  {.    PgHdr *pNe
1f660 78 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72  xt = pList->pDir
1f670 74 79 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  ty;.    rc = pag
1f680 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 28  erUndoCallback((
1f690 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70  void *)pPager, p
1f6a0 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  List->pgno);.   
1f6b0 20 70 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a   pList = pNext;.
1f6c0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
1f6d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1f6e0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 77 72  function is a wr
1f6f0 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c  apper around sql
1f700 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28 29 2e  ite3WalFrames().
1f710 20 41 73 20 77 65 6c 6c 20 61 73 20 6c 6f 67 67   As well as logg
1f720 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65  ing.** the conte
1f730 6e 74 73 20 6f 66 20 74 68 65 20 6c 69 73 74 20  nts of the list 
1f740 6f 66 20 70 61 67 65 73 20 68 65 61 64 65 64 20  of pages headed 
1f750 62 79 20 70 4c 69 73 74 20 28 63 6f 6e 6e 65 63  by pList (connec
1f760 74 65 64 20 62 79 20 70 44 69 72 74 79 29 2c 0a  ted by pDirty),.
1f770 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
1f780 20 6e 6f 74 69 66 69 65 73 20 61 6e 79 20 61 63   notifies any ac
1f790 74 69 76 65 20 62 61 63 6b 75 70 20 70 72 6f 63  tive backup proc
1f7a0 65 73 73 65 73 20 74 68 61 74 20 74 68 65 20 70  esses that the p
1f7b0 61 67 65 73 20 68 61 76 65 0a 2a 2a 20 63 68 61  ages have.** cha
1f7c0 6e 67 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  nged. .**.** The
1f7d0 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 70   list of pages p
1f7e0 61 73 73 65 64 20 69 6e 74 6f 20 74 68 69 73 20  assed into this 
1f7f0 72 6f 75 74 69 6e 65 20 69 73 20 61 6c 77 61 79  routine is alway
1f800 73 20 73 6f 72 74 65 64 20 62 79 20 70 61 67 65  s sorted by page
1f810 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 48 65 6e 63   number..** Henc
1f820 65 2c 20 69 66 20 70 61 67 65 20 31 20 61 70 70  e, if page 1 app
1f830 65 61 72 73 20 61 6e 79 77 68 65 72 65 20 6f 6e  ears anywhere on
1f840 20 74 68 65 20 6c 69 73 74 2c 20 69 74 20 77 69   the list, it wi
1f850 6c 6c 20 62 65 20 74 68 65 20 66 69 72 73 74 20  ll be the first 
1f860 70 61 67 65 2e 0a 2a 2f 20 0a 73 74 61 74 69 63  page..*/ .static
1f870 20 69 6e 74 20 70 61 67 65 72 57 61 6c 46 72 61   int pagerWalFra
1f880 6d 65 73 28 0a 20 20 50 61 67 65 72 20 2a 70 50  mes(.  Pager *pP
1f890 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ager,           
1f8a0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
1f8b0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67 48 64  object */.  PgHd
1f8c0 72 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20  r *pList,       
1f8d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
1f8e0 69 73 74 20 6f 66 20 66 72 61 6d 65 73 20 74 6f  ist of frames to
1f8f0 20 6c 6f 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e   log */.  Pgno n
1f900 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20  Truncate,       
1f910 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
1f920 61 62 61 73 65 20 73 69 7a 65 20 61 66 74 65 72  abase size after
1f930 20 74 68 69 73 20 63 6f 6d 6d 69 74 20 2a 2f 0a   this commit */.
1f940 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20    int isCommit  
1f950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f960 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
1f970 73 20 69 73 20 61 20 63 6f 6d 6d 69 74 20 2a 2f  s is a commit */
1f980 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
1f990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9a0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1f9b0 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c  code */.  int nL
1f9c0 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
1f9d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1f9e0 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
1f9f0 70 4c 69 73 74 20 2a 2f 0a 20 20 50 67 48 64 72  pList */.  PgHdr
1fa00 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
1fa10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
1fa20 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70  r looping over p
1fa30 61 67 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ages */..  asser
1fa40 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 20  t( pPager->pWal 
1fa50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69  );.  assert( pLi
1fa60 73 74 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  st );.#ifdef SQL
1fa70 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 56  ITE_DEBUG.  /* V
1fa80 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 70  erify that the p
1fa90 61 67 65 20 6c 69 73 74 20 69 73 20 69 6e 20 61  age list is in a
1faa0 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a  ccending order *
1fab0 2f 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b  /.  for(p=pList;
1fac0 20 70 20 26 26 20 70 2d 3e 70 44 69 72 74 79 3b   p && p->pDirty;
1fad0 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20   p=p->pDirty){. 
1fae0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 67     assert( p->pg
1faf0 6e 6f 20 3c 20 70 2d 3e 70 44 69 72 74 79 2d 3e  no < p->pDirty->
1fb00 70 67 6e 6f 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  pgno );.  }.#end
1fb10 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4c  if..  assert( pL
1fb20 69 73 74 2d 3e 70 44 69 72 74 79 3d 3d 30 20 7c  ist->pDirty==0 |
1fb30 7c 20 69 73 43 6f 6d 6d 69 74 20 29 3b 0a 20 20  | isCommit );.  
1fb40 69 66 28 20 69 73 43 6f 6d 6d 69 74 20 29 7b 0a  if( isCommit ){.
1fb50 20 20 20 20 2f 2a 20 49 66 20 61 20 57 41 4c 20      /* If a WAL 
1fb60 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62  transaction is b
1fb70 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2c 20  eing committed, 
1fb80 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e  there is no poin
1fb90 74 20 69 6e 20 77 72 69 74 69 6e 67 0a 20 20 20  t in writing.   
1fba0 20 2a 2a 20 61 6e 79 20 70 61 67 65 73 20 77 69   ** any pages wi
1fbb0 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20  th page numbers 
1fbc0 67 72 65 61 74 65 72 20 74 68 61 6e 20 6e 54 72  greater than nTr
1fbd0 75 6e 63 61 74 65 20 69 6e 74 6f 20 74 68 65 20  uncate into the 
1fbe0 57 41 4c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a  WAL file..    **
1fbf0 20 54 68 65 79 20 77 69 6c 6c 20 6e 65 76 65 72   They will never
1fc00 20 62 65 20 72 65 61 64 20 62 79 20 61 6e 79 20   be read by any 
1fc10 63 6c 69 65 6e 74 2e 20 53 6f 20 72 65 6d 6f 76  client. So remov
1fc20 65 20 74 68 65 6d 20 66 72 6f 6d 20 74 68 65 20  e them from the 
1fc30 70 44 69 72 74 79 0a 20 20 20 20 2a 2a 20 6c 69  pDirty.    ** li
1fc40 73 74 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20  st here. */.    
1fc50 50 67 48 64 72 20 2a 2a 70 70 4e 65 78 74 20 3d  PgHdr **ppNext =
1fc60 20 26 70 4c 69 73 74 3b 0a 20 20 20 20 6e 4c 69   &pList;.    nLi
1fc70 73 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  st = 0;.    for(
1fc80 70 3d 70 4c 69 73 74 3b 20 28 2a 70 70 4e 65 78  p=pList; (*ppNex
1fc90 74 20 3d 20 70 29 21 3d 30 3b 20 70 3d 70 2d 3e  t = p)!=0; p=p->
1fca0 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20 20 69  pDirty){.      i
1fcb0 66 28 20 70 2d 3e 70 67 6e 6f 3c 3d 6e 54 72 75  f( p->pgno<=nTru
1fcc0 6e 63 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20  ncate ){.       
1fcd0 20 70 70 4e 65 78 74 20 3d 20 26 70 2d 3e 70 44   ppNext = &p->pD
1fce0 69 72 74 79 3b 0a 20 20 20 20 20 20 20 20 6e 4c  irty;.        nL
1fcf0 69 73 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  ist++;.      }. 
1fd00 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
1fd10 20 70 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73   pList );.  }els
1fd20 65 7b 0a 20 20 20 20 6e 4c 69 73 74 20 3d 20 31  e{.    nList = 1
1fd30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
1fd40 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54  aStat[PAGER_STAT
1fd50 5f 57 52 49 54 45 5d 20 2b 3d 20 6e 4c 69 73 74  _WRITE] += nList
1fd60 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  ;..  if( pList->
1fd70 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72 5f  pgno==1 ) pager_
1fd80 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e  write_changecoun
1fd90 74 65 72 28 70 4c 69 73 74 29 3b 0a 20 20 72 63  ter(pList);.  rc
1fda0 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 72 61   = sqlite3WalFra
1fdb0 6d 65 73 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  mes(pPager->pWal
1fdc0 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  , .      pPager-
1fdd0 3e 70 61 67 65 53 69 7a 65 2c 20 70 4c 69 73 74  >pageSize, pList
1fde0 2c 20 6e 54 72 75 6e 63 61 74 65 2c 20 69 73 43  , nTruncate, isC
1fdf0 6f 6d 6d 69 74 2c 20 70 50 61 67 65 72 2d 3e 77  ommit, pPager->w
1fe00 61 6c 53 79 6e 63 46 6c 61 67 73 0a 20 20 29 3b  alSyncFlags.  );
1fe10 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1fe20 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
1fe30 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 66  pBackup ){.    f
1fe40 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70  or(p=pList; p; p
1fe50 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20  =p->pDirty){.   
1fe60 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70     sqlite3Backup
1fe70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70  Update(pPager->p
1fe80 42 61 63 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f 2c  Backup, p->pgno,
1fe90 20 28 75 38 20 2a 29 70 2d 3e 70 44 61 74 61 29   (u8 *)p->pData)
1fea0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66  ;.    }.  }..#if
1feb0 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
1fec0 5f 50 41 47 45 53 0a 20 20 70 4c 69 73 74 20 3d  _PAGES.  pList =
1fed0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69   sqlite3PcacheDi
1fee0 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e  rtyList(pPager->
1fef0 70 50 43 61 63 68 65 29 3b 0a 20 20 66 6f 72 28  pPCache);.  for(
1ff00 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d  p=pList; p; p=p-
1ff10 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 70 61  >pDirty){.    pa
1ff20 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
1ff30 28 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  (p);.  }.#endif.
1ff40 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1ff50 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 72  ./*.** Begin a r
1ff60 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead transaction 
1ff70 6f 6e 20 74 68 65 20 57 41 4c 2e 0a 2a 2a 0a 2a  on the WAL..**.*
1ff80 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75  * This routine u
1ff90 73 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64  sed to be called
1ffa0 20 22 70 61 67 65 72 4f 70 65 6e 53 6e 61 70 73   "pagerOpenSnaps
1ffb0 68 6f 74 28 29 22 20 62 65 63 61 75 73 65 20 69  hot()" because i
1ffc0 74 20 65 73 73 65 6e 74 69 61 6c 6c 79 0a 2a 2a  t essentially.**
1ffd0 20 6d 61 6b 65 73 20 61 20 73 6e 61 70 73 68 6f   makes a snapsho
1ffe0 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
1fff0 65 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74  e at the current
20000 20 70 6f 69 6e 74 20 69 6e 20 74 69 6d 65 20 61   point in time a
20010 6e 64 20 70 72 65 73 65 72 76 65 73 0a 2a 2a 20  nd preserves.** 
20020 74 68 61 74 20 73 6e 61 70 73 68 6f 74 20 66 6f  that snapshot fo
20030 72 20 75 73 65 20 62 79 20 74 68 65 20 72 65 61  r use by the rea
20040 64 65 72 20 69 6e 20 73 70 69 74 65 20 6f 66 20  der in spite of 
20050 63 6f 6e 63 75 72 72 65 6e 74 6c 79 20 63 68 61  concurrently cha
20060 6e 67 65 73 20 62 79 0a 2a 2a 20 6f 74 68 65 72  nges by.** other
20070 20 77 72 69 74 65 72 73 20 6f 72 20 63 68 65 63   writers or chec
20080 6b 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74  kpointers..*/.st
20090 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 42 65  atic int pagerBe
200a0 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69  ginReadTransacti
200b0 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  on(Pager *pPager
200c0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
200d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
200e0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
200f0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63 68 61  ode */.  int cha
20100 6e 67 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20  nged = 0;       
20110 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
20120 20 69 66 20 63 61 63 68 65 20 6d 75 73 74 20 62   if cache must b
20130 65 20 72 65 73 65 74 20 2a 2f 0a 0a 20 20 61 73  e reset */..  as
20140 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
20150 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  l(pPager) );.  a
20160 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
20170 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
20180 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  N || pPager->eSt
20190 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
201a0 52 20 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69 74  R );..  /* sqlit
201b0 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e  e3WalEndReadTran
201c0 73 61 63 74 69 6f 6e 28 29 20 77 61 73 20 6e 6f  saction() was no
201d0 74 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65  t called for the
201e0 20 70 72 65 76 69 6f 75 73 0a 20 20 2a 2a 20 74   previous.  ** t
201f0 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 6c 6f  ransaction in lo
20200 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55  cking_mode=EXCLU
20210 53 49 56 45 2e 20 20 53 6f 20 63 61 6c 6c 20 69  SIVE.  So call i
20220 74 20 6e 6f 77 2e 20 20 49 66 20 77 65 0a 20 20  t now.  If we.  
20230 2a 2a 20 61 72 65 20 69 6e 20 6c 6f 63 6b 69 6e  ** are in lockin
20240 67 5f 6d 6f 64 65 3d 4e 4f 52 4d 41 4c 20 61 6e  g_mode=NORMAL an
20250 64 20 45 6e 64 52 65 61 64 28 29 20 77 61 73 20  d EndRead() was 
20260 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65  previously calle
20270 64 2c 0a 20 20 2a 2a 20 74 68 65 20 64 75 70 6c  d,.  ** the dupl
20280 69 63 61 74 65 20 63 61 6c 6c 20 69 73 20 68 61  icate call is ha
20290 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73  rmless..  */.  s
202a0 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64  qlite3WalEndRead
202b0 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  Transaction(pPag
202c0 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 72 63  er->pWal);..  rc
202d0 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67   = sqlite3WalBeg
202e0 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  inReadTransactio
202f0 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  n(pPager->pWal, 
20300 26 63 68 61 6e 67 65 64 29 3b 0a 20 20 69 66 28  &changed);.  if(
20310 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
20320 7c 20 63 68 61 6e 67 65 64 20 29 7b 0a 20 20 20  | changed ){.   
20330 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
20340 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 55 53  ger);.    if( US
20350 45 46 45 54 43 48 28 70 50 61 67 65 72 29 20 29  EFETCH(pPager) )
20360 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63   sqlite3OsUnfetc
20370 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 2c  h(pPager->fd, 0,
20380 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75   0);.  }..  retu
20390 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn rc;.}.#endif.
203a0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
203b0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61  tion is called a
203c0 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 74 72  s part of the tr
203d0 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 50 41  ansition from PA
203e0 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 74 6f 20 50  GER_OPEN.** to P
203f0 41 47 45 52 5f 52 45 41 44 45 52 20 73 74 61 74  AGER_READER stat
20400 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  e to determine t
20410 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
20420 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20  atabase file.** 
20430 69 6e 20 70 61 67 65 73 20 28 61 73 73 75 6d 69  in pages (assumi
20440 6e 67 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  ng the page size
20450 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65   currently store
20460 64 20 69 6e 20 50 61 67 65 72 2e 70 61 67 65 53  d in Pager.pageS
20470 69 7a 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  ize)..**.** If n
20480 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
20490 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
204a0 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 73 69  urned and the si
204b0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
204c0 73 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20 69  se.** in pages i
204d0 73 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 6e 50  s stored in *pnP
204e0 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  age. Otherwise, 
204f0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28 70  an error code (p
20500 65 72 68 61 70 73 0a 2a 2a 20 53 51 4c 49 54 45  erhaps.** SQLITE
20510 5f 49 4f 45 52 52 5f 46 53 54 41 54 29 20 69 73  _IOERR_FSTAT) is
20520 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
20530 6e 50 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e  nPage is left un
20540 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 73 74 61  modified..*/.sta
20550 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 61 67  tic int pagerPag
20560 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  ecount(Pager *pP
20570 61 67 65 72 2c 20 50 67 6e 6f 20 2a 70 6e 50 61  ager, Pgno *pnPa
20580 67 65 29 7b 0a 20 20 50 67 6e 6f 20 6e 50 61 67  ge){.  Pgno nPag
20590 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
205a0 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
205b0 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20 2a 70  to return via *p
205c0 6e 50 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 51  nPage */..  /* Q
205d0 75 65 72 79 20 74 68 65 20 57 41 4c 20 73 75 62  uery the WAL sub
205e0 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20  -system for the 
205f0 64 61 74 61 62 61 73 65 20 73 69 7a 65 2e 20 54  database size. T
20600 68 65 20 57 61 6c 44 62 73 69 7a 65 28 29 0a 20  he WalDbsize(). 
20610 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74   ** function ret
20620 75 72 6e 73 20 7a 65 72 6f 20 69 66 20 74 68 65  urns zero if the
20630 20 57 41 4c 20 69 73 20 6e 6f 74 20 6f 70 65 6e   WAL is not open
20640 20 28 69 2e 65 2e 20 50 61 67 65 72 2e 70 57 61   (i.e. Pager.pWa
20650 6c 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 69  l==0), or.  ** i
20660 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
20670 69 7a 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  ize is not avail
20680 61 62 6c 65 2e 20 54 68 65 20 64 61 74 61 62 61  able. The databa
20690 73 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 20  se size is not. 
206a0 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 72   ** available fr
206b0 6f 6d 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73  om the WAL sub-s
206c0 79 73 74 65 6d 20 69 66 20 74 68 65 20 6c 6f 67  ystem if the log
206d0 20 66 69 6c 65 20 69 73 20 65 6d 70 74 79 20 6f   file is empty o
206e0 72 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20  r.  ** contains 
206f0 6e 6f 20 76 61 6c 69 64 20 63 6f 6d 6d 69 74 74  no valid committ
20700 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  ed transactions.
20710 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
20720 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
20730 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20  PAGER_OPEN );.  
20740 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
20750 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f  eLock>=SHARED_LO
20760 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
20770 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
20780 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  d) );.  assert( 
20790 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
207a0 3d 3d 30 20 29 3b 0a 20 20 6e 50 61 67 65 20 3d  ==0 );.  nPage =
207b0 20 73 71 6c 69 74 65 33 57 61 6c 44 62 73 69 7a   sqlite3WalDbsiz
207c0 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b  e(pPager->pWal);
207d0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 75  ..  /* If the nu
207e0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
207f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
20800 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 66   not available f
20810 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 57 41 4c  rom the.  ** WAL
20820 20 73 75 62 2d 73 79 73 74 65 6d 2c 20 64 65 74   sub-system, det
20830 65 72 6d 69 6e 65 20 74 68 65 20 70 61 67 65 20  ermine the page 
20840 63 6f 75 6e 74 20 62 61 73 65 64 20 6f 6e 20 74  count based on t
20850 68 65 20 73 69 7a 65 20 6f 66 0a 20 20 2a 2a 20  he size of.  ** 
20860 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
20870 65 2e 20 20 49 66 20 74 68 65 20 73 69 7a 65 20  e.  If the size 
20880 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
20890 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 6e 0a 20  file is not an. 
208a0 20 2a 2a 20 69 6e 74 65 67 65 72 20 6d 75 6c 74   ** integer mult
208b0 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65  iple of the page
208c0 2d 73 69 7a 65 2c 20 72 6f 75 6e 64 20 75 70 20  -size, round up 
208d0 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f  the result..  */
208e0 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20  .  if( nPage==0 
208f0 26 26 20 41 4c 57 41 59 53 28 69 73 4f 70 65 6e  && ALWAYS(isOpen
20900 28 70 50 61 67 65 72 2d 3e 66 64 29 29 20 29 7b  (pPager->fd)) ){
20910 0a 20 20 20 20 69 36 34 20 6e 20 3d 20 30 3b 20  .    i64 n = 0; 
20920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20930 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 62     /* Size of db
20940 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a   file in bytes *
20950 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  /.    int rc = s
20960 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
20970 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29  (pPager->fd, &n)
20980 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
20990 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
209a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
209b0 7d 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 28 50  }.    nPage = (P
209c0 67 6e 6f 29 28 28 6e 2b 70 50 61 67 65 72 2d 3e  gno)((n+pPager->
209d0 70 61 67 65 53 69 7a 65 2d 31 29 20 2f 20 70 50  pageSize-1) / pP
209e0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
209f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
20a00 65 20 63 75 72 72 65 6e 74 20 6e 75 6d 62 65 72  e current number
20a10 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
20a20 20 66 69 6c 65 20 69 73 20 67 72 65 61 74 65 72   file is greater
20a30 20 74 68 61 6e 20 74 68 65 0a 20 20 2a 2a 20 63   than the.  ** c
20a40 6f 6e 66 69 67 75 72 65 64 20 6d 61 78 69 6d 75  onfigured maximu
20a50 6d 20 70 61 67 65 72 20 6e 75 6d 62 65 72 2c 20  m pager number, 
20a60 69 6e 63 72 65 61 73 65 20 74 68 65 20 61 6c 6c  increase the all
20a70 6f 77 65 64 20 6c 69 6d 69 74 20 73 6f 0a 20 20  owed limit so.  
20a80 2a 2a 20 74 68 61 74 20 74 68 65 20 66 69 6c 65  ** that the file
20a90 20 63 61 6e 20 62 65 20 72 65 61 64 2e 0a 20 20   can be read..  
20aa0 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 70  */.  if( nPage>p
20ab0 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b  Pager->mxPgno ){
20ac0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  .    pPager->mxP
20ad0 67 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e 50 61 67  gno = (Pgno)nPag
20ae0 65 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6e 50 61 67  e;.  }..  *pnPag
20af0 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74  e = nPage;.  ret
20b00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
20b10 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
20b20 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20  _OMIT_WAL./*.** 
20b30 43 68 65 63 6b 20 69 66 20 74 68 65 20 2a 2d 77  Check if the *-w
20b40 61 6c 20 66 69 6c 65 20 74 68 61 74 20 63 6f 72  al file that cor
20b50 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20  responds to the 
20b60 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20  database opened 
20b70 62 79 20 70 50 61 67 65 72 0a 2a 2a 20 65 78 69  by pPager.** exi
20b80 73 74 73 20 69 66 20 74 68 65 20 64 61 74 61 62  sts if the datab
20b90 61 73 65 20 69 73 20 6e 6f 74 20 65 6d 70 79 2c  ase is not empy,
20ba0 20 6f 72 20 76 65 72 69 66 79 20 74 68 61 74 20   or verify that 
20bb0 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 64  the *-wal file d
20bc0 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 69 73 74  oes.** not exist
20bd0 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20 69 74   (by deleting it
20be0 29 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  ) if the databas
20bf0 65 20 66 69 6c 65 20 69 73 20 65 6d 70 74 79 2e  e file is empty.
20c00 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61  .**.** If the da
20c10 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 65 6d  tabase is not em
20c20 70 74 79 20 61 6e 64 20 74 68 65 20 2a 2d 77 61  pty and the *-wa
20c30 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 6f  l file exists, o
20c40 70 65 6e 20 74 68 65 20 70 61 67 65 72 0a 2a 2a  pen the pager.**
20c50 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 20 49   in WAL mode.  I
20c60 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
20c70 73 20 65 6d 70 74 79 20 6f 72 20 69 66 20 6e 6f  s empty or if no
20c80 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78 69 73   *-wal file exis
20c90 74 73 20 61 6e 64 0a 2a 2a 20 69 66 20 6e 6f 20  ts and.** if no 
20ca0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6d 61  error occurs, ma
20cb0 6b 65 20 73 75 72 65 20 50 61 67 65 72 2e 6a 6f  ke sure Pager.jo
20cc0 75 72 6e 61 6c 4d 6f 64 65 20 69 73 20 6e 6f 74  urnalMode is not
20cd0 20 73 65 74 20 74 6f 0a 2a 2a 20 50 41 47 45 52   set to.** PAGER
20ce0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
20cf0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
20d00 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 61 6e 20 65  QLITE_OK or an e
20d10 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  rror code..**.**
20d20 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
20d30 20 68 6f 6c 64 20 61 20 53 48 41 52 45 44 20 6c   hold a SHARED l
20d40 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
20d50 61 73 65 20 66 69 6c 65 20 74 6f 20 63 61 6c 6c  ase file to call
20d60 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   this.** functio
20d70 6e 2e 20 42 65 63 61 75 73 65 20 61 6e 20 45 58  n. Because an EX
20d80 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
20d90 74 68 65 20 64 62 20 66 69 6c 65 20 69 73 20 72  the db file is r
20da0 65 71 75 69 72 65 64 20 74 6f 20 64 65 6c 65 74  equired to delet
20db0 65 20 0a 2a 2a 20 61 20 57 41 4c 20 6f 6e 20 61  e .** a WAL on a
20dc0 20 6e 6f 6e 65 2d 65 6d 70 74 79 20 64 61 74 61   none-empty data
20dd0 62 61 73 65 2c 20 74 68 69 73 20 65 6e 73 75 72  base, this ensur
20de0 65 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20 72  es there is no r
20df0 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a  ace condition .*
20e00 2a 20 62 65 74 77 65 65 6e 20 74 68 65 20 78 41  * between the xA
20e10 63 63 65 73 73 28 29 20 62 65 6c 6f 77 20 61 6e  ccess() below an
20e20 64 20 61 6e 20 78 44 65 6c 65 74 65 28 29 20 62  d an xDelete() b
20e30 65 69 6e 67 20 65 78 65 63 75 74 65 64 20 62 79  eing executed by
20e40 20 73 6f 6d 65 20 0a 2a 2a 20 6f 74 68 65 72 20   some .** other 
20e50 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  connection..*/.s
20e60 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f  tatic int pagerO
20e70 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74 28  penWalIfPresent(
20e80 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
20e90 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
20ea0 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
20eb0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
20ec0 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20  PAGER_OPEN );.  
20ed0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
20ee0 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f  eLock>=SHARED_LO
20ef0 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50  CK );..  if( !pP
20f00 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
20f10 7b 0a 20 20 20 20 69 6e 74 20 69 73 57 61 6c 3b  {.    int isWal;
20f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f30 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 57      /* True if W
20f40 41 4c 20 66 69 6c 65 20 65 78 69 73 74 73 20 2a  AL file exists *
20f50 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
20f60 65 33 4f 73 41 63 63 65 73 73 28 0a 20 20 20 20  e3OsAccess(.    
20f70 20 20 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73      pPager->pVfs
20f80 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20  , pPager->zWal, 
20f90 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
20fa0 49 53 54 53 2c 20 26 69 73 57 61 6c 0a 20 20 20  ISTS, &isWal.   
20fb0 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
20fc0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20fd0 20 20 20 69 66 28 20 69 73 57 61 6c 20 29 7b 0a     if( isWal ){.
20fe0 20 20 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61          Pgno nPa
20ff0 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
21000 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
21010 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
21020 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 72  le */..        r
21030 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75  c = pagerPagecou
21040 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67  nt(pPager, &nPag
21050 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
21060 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
21070 20 20 20 20 20 20 20 20 69 66 28 20 6e 50 61 67          if( nPag
21080 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
21090 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
210a0 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70  Delete(pPager->p
210b0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61  Vfs, pPager->zWa
210c0 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  l, 0);.        }
210d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
210e0 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65  testcase( sqlite
210f0 33 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74  3PcachePagecount
21100 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
21110 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )==0 );.        
21120 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
21130 67 65 72 4f 70 65 6e 57 61 6c 28 70 50 61 67 65  gerOpenWal(pPage
21140 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  r, 0);.        }
21150 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
21160 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
21170 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
21180 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b 0a 20  NALMODE_WAL ){. 
21190 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
211a0 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47  ournalMode = PAG
211b0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
211c0 45 4c 45 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20  ELETE;.      }. 
211d0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
211e0 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  n rc;.}.#endif..
211f0 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 73  /*.** Playback s
21200 61 76 65 70 6f 69 6e 74 20 70 53 61 76 65 70 6f  avepoint pSavepo
21210 69 6e 74 2e 20 4f 72 2c 20 69 66 20 70 53 61 76  int. Or, if pSav
21220 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20 74 68  epoint==NULL, th
21230 65 6e 20 70 6c 61 79 62 61 63 6b 0a 2a 2a 20 74  en playback.** t
21240 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72  he entire master
21250 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
21260 68 65 20 63 61 73 65 20 70 53 61 76 65 70 6f 69  he case pSavepoi
21270 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75 72 73 20  nt==NULL occurs 
21280 77 68 65 6e 20 0a 2a 2a 20 61 20 52 4f 4c 4c 42  when .** a ROLLB
21290 41 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e 64 20 69  ACK TO command i
212a0 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 61 20 53  s invoked on a S
212b0 41 56 45 50 4f 49 4e 54 20 74 68 61 74 20 69 73  AVEPOINT that is
212c0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a   a transaction .
212d0 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a  ** savepoint..**
212e0 0a 2a 2a 20 57 68 65 6e 20 70 53 61 76 65 70 6f  .** When pSavepo
212f0 69 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  int is not NULL 
21300 28 6d 65 61 6e 69 6e 67 20 61 20 6e 6f 6e 2d 74  (meaning a non-t
21310 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70  ransaction savep
21320 6f 69 6e 74 20 69 73 20 0a 2a 2a 20 62 65 69 6e  oint is .** bein
21330 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2c 20  g rolled back), 
21340 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  then the rollbac
21350 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 75 70  k consists of up
21360 20 74 6f 20 74 68 72 65 65 20 73 74 61 67 65 73   to three stages
21370 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d 65 64 20 69  ,.** performed i
21380 6e 20 74 68 65 20 6f 72 64 65 72 20 73 70 65 63  n the order spec
21390 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  ified:.**.**   *
213a0 20 50 61 67 65 73 20 61 72 65 20 70 6c 61 79 65   Pages are playe
213b0 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  d back from the 
213c0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61  main journal sta
213d0 72 74 69 6e 67 20 61 74 20 62 79 74 65 0a 2a 2a  rting at byte.**
213e0 20 20 20 20 20 6f 66 66 73 65 74 20 50 61 67 65       offset Page
213f0 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73  rSavepoint.iOffs
21400 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e  et and continuin
21410 67 20 74 6f 20 0a 2a 2a 20 20 20 20 20 50 61 67  g to .**     Pag
21420 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
21430 4f 66 66 73 65 74 2c 20 6f 72 20 74 6f 20 74 68  Offset, or to th
21440 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69  e end of the mai
21450 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  n journal.**    
21460 20 66 69 6c 65 20 69 66 20 50 61 67 65 72 53 61   file if PagerSa
21470 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73  vepoint.iHdrOffs
21480 65 74 20 69 73 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a  et is zero..**.*
21490 2a 20 20 20 2a 20 49 66 20 50 61 67 65 72 53 61  *   * If PagerSa
214a0 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73  vepoint.iHdrOffs
214b0 65 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20  et is not zero, 
214c0 74 68 65 6e 20 70 61 67 65 73 20 61 72 65 20 70  then pages are p
214d0 6c 61 79 65 64 0a 2a 2a 20 20 20 20 20 62 61 63  layed.**     bac
214e0 6b 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20  k starting from 
214f0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
21500 65 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66  er immediately f
21510 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 20 20 20  ollowing .**    
21520 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
21530 69 48 64 72 4f 66 66 73 65 74 20 74 6f 20 74 68  iHdrOffset to th
21540 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69  e end of the mai
21550 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  n journal file..
21560 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20  **.**   * Pages 
21570 61 72 65 20 74 68 65 6e 20 70 6c 61 79 65 64 20  are then played 
21580 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 73 75  back from the su
21590 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  b-journal file, 
215a0 73 74 61 72 74 69 6e 67 0a 2a 2a 20 20 20 20 20  starting.**     
215b0 77 69 74 68 20 74 68 65 20 50 61 67 65 72 53 61  with the PagerSa
215c0 76 65 70 6f 69 6e 74 2e 69 53 75 62 52 65 63 20  vepoint.iSubRec 
215d0 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74  and continuing t
215e0 6f 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a 20  o the end of.** 
215f0 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20      the journal 
21600 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 72 6f  file..**.** Thro
21610 75 67 68 6f 75 74 20 74 68 65 20 72 6f 6c 6c 62  ughout the rollb
21620 61 63 6b 20 70 72 6f 63 65 73 73 2c 20 65 61 63  ack process, eac
21630 68 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73  h time a page is
21640 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68   rolled back, th
21650 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69  e.** correspondi
21660 6e 67 20 62 69 74 20 69 73 20 73 65 74 20 69 6e  ng bit is set in
21670 20 61 20 62 69 74 76 65 63 20 73 74 72 75 63 74   a bitvec struct
21680 75 72 65 20 28 76 61 72 69 61 62 6c 65 20 70 44  ure (variable pD
21690 6f 6e 65 20 69 6e 20 74 68 65 0a 2a 2a 20 69 6d  one in the.** im
216a0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 62 65 6c  plementation bel
216b0 6f 77 29 2e 20 54 68 69 73 20 69 73 20 75 73 65  ow). This is use
216c0 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  d to ensure that
216d0 20 61 20 70 61 67 65 20 69 73 20 6f 6e 6c 79 0a   a page is only.
216e0 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  ** rolled back t
216f0 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74  he first time it
21700 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
21710 69 6e 20 65 69 74 68 65 72 20 6a 6f 75 72 6e 61  in either journa
21720 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53 61 76  l..**.** If pSav
21730 65 70 6f 69 6e 74 20 69 73 20 4e 55 4c 4c 2c 20  epoint is NULL, 
21740 74 68 65 6e 20 70 61 67 65 73 20 61 72 65 20 6f  then pages are o
21750 6e 6c 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20  nly played back 
21760 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 0a 2a 2a  from the main.**
21770 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
21780 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
21790 66 6f 72 20 61 20 62 69 74 76 65 63 20 69 6e 20  for a bitvec in 
217a0 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
217b0 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c   In either case,
217c0 20 62 65 66 6f 72 65 20 70 6c 61 79 62 61 63 6b   before playback
217d0 20 63 6f 6d 6d 65 6e 63 65 73 20 74 68 65 20 50   commences the P
217e0 61 67 65 72 2e 64 62 53 69 7a 65 20 76 61 72 69  ager.dbSize vari
217f0 61 62 6c 65 0a 2a 2a 20 69 73 20 72 65 73 65 74  able.** is reset
21800 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 74 68   to the value th
21810 61 74 20 69 74 20 68 65 6c 64 20 61 74 20 74 68  at it held at th
21820 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 73  e start of the s
21830 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 28 6f 72  avepoint .** (or
21840 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 4e   transaction). N
21850 6f 20 70 61 67 65 20 77 69 74 68 20 61 20 70 61  o page with a pa
21860 67 65 2d 6e 75 6d 62 65 72 20 67 72 65 61 74 65  ge-number greate
21870 72 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75  r than this valu
21880 65 0a 2a 2a 20 69 73 20 70 6c 61 79 65 64 20 62  e.** is played b
21890 61 63 6b 2e 20 49 66 20 6f 6e 65 20 69 73 20 65  ack. If one is e
218a0 6e 63 6f 75 6e 74 65 72 65 64 20 69 74 20 69 73  ncountered it is
218b0 20 73 69 6d 70 6c 79 20 73 6b 69 70 70 65 64 2e   simply skipped.
218c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
218d0 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65  agerPlaybackSave
218e0 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61  point(Pager *pPa
218f0 67 65 72 2c 20 50 61 67 65 72 53 61 76 65 70 6f  ger, PagerSavepo
21900 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e 74 29  int *pSavepoint)
21910 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20  {.  i64 szJ;    
21920 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21930 45 66 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f  Effective size o
21940 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
21950 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72  al */.  i64 iHdr
21960 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
21970 20 2f 2a 20 45 6e 64 20 6f 66 20 66 69 72 73 74   /* End of first
21980 20 73 65 67 6d 65 6e 74 20 6f 66 20 6d 61 69 6e   segment of main
21990 2d 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73  -journal records
219a0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
219b0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f  QLITE_OK;      /
219c0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
219d0 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65  .  Bitvec *pDone
219e0 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 42   = 0;       /* B
219f0 69 74 76 65 63 20 74 6f 20 65 6e 73 75 72 65 20  itvec to ensure 
21a00 70 61 67 65 73 20 70 6c 61 79 65 64 20 62 61 63  pages played bac
21a10 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a 0a  k only once */..
21a20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
21a30 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
21a40 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72  ERROR );.  asser
21a50 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
21a60 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
21a70 4c 4f 43 4b 45 44 20 29 3b 0a 0a 20 20 2f 2a 20  LOCKED );..  /* 
21a80 41 6c 6c 6f 63 61 74 65 20 61 20 62 69 74 76 65  Allocate a bitve
21a90 63 20 74 6f 20 75 73 65 20 74 6f 20 73 74 6f 72  c to use to stor
21aa0 65 20 74 68 65 20 73 65 74 20 6f 66 20 70 61 67  e the set of pag
21ab0 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 2a  es rolled back *
21ac0 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69  /.  if( pSavepoi
21ad0 6e 74 20 29 7b 0a 20 20 20 20 70 44 6f 6e 65 20  nt ){.    pDone 
21ae0 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43  = sqlite3BitvecC
21af0 72 65 61 74 65 28 70 53 61 76 65 70 6f 69 6e 74  reate(pSavepoint
21b00 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20 20 20 69 66  ->nOrig);.    if
21b10 28 20 21 70 44 6f 6e 65 20 29 7b 0a 20 20 20 20  ( !pDone ){.    
21b20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21b30 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
21b40 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  }.  }..  /* Set 
21b50 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
21b60 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 76 61  e back to the va
21b70 6c 75 65 20 69 74 20 77 61 73 20 62 65 66 6f 72  lue it was befor
21b80 65 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  e the savepoint 
21b90 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 76 65  .  ** being reve
21ba0 72 74 65 64 20 77 61 73 20 6f 70 65 6e 65 64 2e  rted was opened.
21bb0 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
21bc0 64 62 53 69 7a 65 20 3d 20 70 53 61 76 65 70 6f  dbSize = pSavepo
21bd0 69 6e 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74  int ? pSavepoint
21be0 2d 3e 6e 4f 72 69 67 20 3a 20 70 50 61 67 65 72  ->nOrig : pPager
21bf0 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20  ->dbOrigSize;.  
21c00 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
21c10 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72  untDone = pPager
21c20 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69  ->tempFile;..  i
21c30 66 28 20 21 70 53 61 76 65 70 6f 69 6e 74 20 26  f( !pSavepoint &
21c40 26 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  & pagerUseWal(pP
21c50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74  ager) ){.    ret
21c60 75 72 6e 20 70 61 67 65 72 52 6f 6c 6c 62 61 63  urn pagerRollbac
21c70 6b 57 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  kWal(pPager);.  
21c80 7d 0a 0a 20 20 2f 2a 20 55 73 65 20 70 50 61 67  }..  /* Use pPag
21c90 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 61  er->journalOff a
21ca0 73 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  s the effective 
21cb0 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e  size of the main
21cc0 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a   rollback.  ** j
21cd0 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 61 63 74  ournal.  The act
21ce0 75 61 6c 20 66 69 6c 65 20 6d 69 67 68 74 20 62  ual file might b
21cf0 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  e larger than th
21d00 69 73 20 69 6e 0a 20 20 2a 2a 20 50 41 47 45 52  is in.  ** PAGER
21d10 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55  _JOURNALMODE_TRU
21d20 4e 43 41 54 45 20 6f 72 20 50 41 47 45 52 5f 4a  NCATE or PAGER_J
21d30 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
21d40 53 54 2e 20 20 42 75 74 20 61 6e 79 74 68 69 6e  ST.  But anythin
21d50 67 0a 20 20 2a 2a 20 70 61 73 74 20 70 50 61 67  g.  ** past pPag
21d60 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69  er->journalOff i
21d70 73 20 6f 66 66 2d 6c 69 6d 69 74 73 20 74 6f 20  s off-limits to 
21d80 75 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20 3d  us..  */.  szJ =
21d90 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
21da0 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Off;.  assert( p
21db0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
21dc0 72 29 3d 3d 30 20 7c 7c 20 73 7a 4a 3d 3d 30 20  r)==0 || szJ==0 
21dd0 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62  );..  /* Begin b
21de0 79 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72  y rolling back r
21df0 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20  ecords from the 
21e00 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61  main journal sta
21e10 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 50 61  rting at.  ** Pa
21e20 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66  gerSavepoint.iOf
21e30 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75  fset and continu
21e40 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ing to the next 
21e50 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a  journal header..
21e60 20 20 2a 2a 20 54 68 65 72 65 20 6d 69 67 68 74    ** There might
21e70 20 62 65 20 72 65 63 6f 72 64 73 20 69 6e 20 74   be records in t
21e80 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
21e90 74 68 61 74 20 68 61 76 65 20 61 20 70 61 67 65  that have a page
21ea0 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 67 72 65   number.  ** gre
21eb0 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75  ater than the cu
21ec0 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 73  rrent database s
21ed0 69 7a 65 20 28 70 50 61 67 65 72 2d 3e 64 62 53  ize (pPager->dbS
21ee0 69 7a 65 29 20 62 75 74 20 74 68 6f 73 65 0a 20  ize) but those. 
21ef0 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70   ** will be skip
21f00 70 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ped automaticall
21f10 79 2e 20 20 50 61 67 65 73 20 61 72 65 20 61 64  y.  Pages are ad
21f20 64 65 64 20 74 6f 20 70 44 6f 6e 65 20 61 73 20  ded to pDone as 
21f30 74 68 65 79 0a 20 20 2a 2a 20 61 72 65 20 70 6c  they.  ** are pl
21f40 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a  ayed back..  */.
21f50 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74    if( pSavepoint
21f60 20 26 26 20 21 70 61 67 65 72 55 73 65 57 61 6c   && !pagerUseWal
21f70 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
21f80 69 48 64 72 4f 66 66 20 3d 20 70 53 61 76 65 70  iHdrOff = pSavep
21f90 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74  oint->iHdrOffset
21fa0 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69   ? pSavepoint->i
21fb0 48 64 72 4f 66 66 73 65 74 20 3a 20 73 7a 4a 3b  HdrOffset : szJ;
21fc0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
21fd0 72 6e 61 6c 4f 66 66 20 3d 20 70 53 61 76 65 70  rnalOff = pSavep
21fe0 6f 69 6e 74 2d 3e 69 4f 66 66 73 65 74 3b 0a 20  oint->iOffset;. 
21ff0 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51     while( rc==SQ
22000 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
22010 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69 48  r->journalOff<iH
22020 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 72  drOff ){.      r
22030 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
22040 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
22050 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75  er, &pPager->jou
22060 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20  rnalOff, pDone, 
22070 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  1, 1);.    }.   
22080 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
22090 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 65  ITE_DONE );.  }e
220a0 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
220b0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
220c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 74 69  .  }..  /* Conti
220d0 6e 75 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  nue rolling back
220e0 20 72 65 63 6f 72 64 73 20 6f 75 74 20 6f 66 20   records out of 
220f0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
22100 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a   starting at.  *
22110 2a 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72  * the first jour
22120 6e 61 6c 20 68 65 61 64 65 72 20 73 65 65 6e 20  nal header seen 
22130 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 75  and continuing u
22140 6e 74 69 6c 20 74 68 65 20 65 66 66 65 63 74 69  ntil the effecti
22150 76 65 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20 74  ve end.  ** of t
22160 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
22170 66 69 6c 65 2e 20 20 43 6f 6e 74 69 6e 75 65 20  file.  Continue 
22180 74 6f 20 73 6b 69 70 20 6f 75 74 2d 6f 66 2d 72  to skip out-of-r
22190 61 6e 67 65 20 70 61 67 65 73 20 61 6e 64 0a 20  ange pages and. 
221a0 20 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61 64 64   ** continue add
221b0 69 6e 67 20 70 61 67 65 73 20 72 6f 6c 6c 65 64  ing pages rolled
221c0 20 62 61 63 6b 20 74 6f 20 70 44 6f 6e 65 2e 0a   back to pDone..
221d0 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 72 63    */.  while( rc
221e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
221f0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
22200 66 3c 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32  f<szJ ){.    u32
22210 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
22220 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
22230 2a 2f 0a 20 20 20 20 75 33 32 20 6e 4a 52 65 63  */.    u32 nJRec
22240 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d   = 0;     /* Num
22250 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52  ber of Journal R
22260 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75 33  ecords */.    u3
22270 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20  2 dummy;.    rc 
22280 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  = readJournalHdr
22290 28 70 50 61 67 65 72 2c 20 30 2c 20 73 7a 4a 2c  (pPager, 0, szJ,
222a0 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29   &nJRec, &dummy)
222b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
222c0 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
222d0 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
222e0 54 68 65 20 22 70 50 61 67 65 72 2d 3e 6a 6f 75  The "pPager->jou
222f0 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f  rnalHdr+JOURNAL_
22300 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d  HDR_SZ(pPager)==
22310 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
22320 66 66 22 0a 20 20 20 20 2a 2a 20 74 65 73 74 20  ff".    ** test 
22330 69 73 20 72 65 6c 61 74 65 64 20 74 6f 20 74 69  is related to ti
22340 63 6b 65 74 20 23 32 35 36 35 2e 20 20 53 65 65  cket #2565.  See
22350 20 74 68 65 20 64 69 73 63 75 73 73 69 6f 6e 20   the discussion 
22360 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61  in the.    ** pa
22370 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 66  ger_playback() f
22380 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 64 64 69  unction for addi
22390 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
223a0 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
223b0 66 28 20 6e 4a 52 65 63 3d 3d 30 20 0a 20 20 20  f( nJRec==0 .   
223c0 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75    && pPager->jou
223d0 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f  rnalHdr+JOURNAL_
223e0 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d  HDR_SZ(pPager)==
223f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
22400 66 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ff.    ){.      
22410 6e 4a 52 65 63 20 3d 20 28 75 33 32 29 28 28 73  nJRec = (u32)((s
22420 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ - pPager->jou
22430 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e 41 4c  rnalOff)/JOURNAL
22440 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b  _PG_SZ(pPager));
22450 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
22460 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
22470 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65 63 20 26  OK && ii<nJRec &
22480 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
22490 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29 7b  lOff<szJ; ii++){
224a0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
224b0 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
224c0 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 61  age(pPager, &pPa
224d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
224e0 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20   pDone, 1, 1);. 
224f0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
22500 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
22510 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   );.  }.  assert
22520 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
22530 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
22540 61 6c 4f 66 66 3e 3d 73 7a 4a 20 29 3b 0a 0a 20  alOff>=szJ );.. 
22550 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 20 72 6f   /* Finally,  ro
22560 6c 6c 62 61 63 6b 20 70 61 67 65 73 20 66 72 6f  llback pages fro
22570 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
22580 6c 2e 20 20 50 61 67 65 20 74 68 61 74 20 77 65  l.  Page that we
22590 72 65 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75 73  re.  ** previous
225a0 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f  ly rolled back o
225b0 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  ut of the main j
225c0 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61 72 65 20  ournal (and are 
225d0 68 65 6e 63 65 20 69 6e 20 70 44 6f 6e 65 29 0a  hence in pDone).
225e0 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69    ** will be ski
225f0 70 70 65 64 2e 20 20 4f 75 74 2d 6f 66 2d 72 61  pped.  Out-of-ra
22600 6e 67 65 20 70 61 67 65 73 20 61 72 65 20 61 6c  nge pages are al
22610 73 6f 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f  so skipped..  */
22620 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e  .  if( pSavepoin
22630 74 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b  t ){.    u32 ii;
22640 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
22650 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
22660 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
22670 28 69 36 34 29 70 53 61 76 65 70 6f 69 6e 74 2d  (i64)pSavepoint-
22680 3e 69 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67  >iSubRec*(4+pPag
22690 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a  er->pageSize);..
226a0 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73 65      if( pagerUse
226b0 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
226c0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
226d0 33 57 61 6c 53 61 76 65 70 6f 69 6e 74 55 6e 64  3WalSavepointUnd
226e0 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  o(pPager->pWal, 
226f0 70 53 61 76 65 70 6f 69 6e 74 2d 3e 61 57 61 6c  pSavepoint->aWal
22700 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Data);.    }.   
22710 20 66 6f 72 28 69 69 3d 70 53 61 76 65 70 6f 69   for(ii=pSavepoi
22720 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20 72 63 3d  nt->iSubRec; rc=
22730 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69  =SQLITE_OK && ii
22740 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63  <pPager->nSubRec
22750 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61  ; ii++){.      a
22760 73 73 65 72 74 28 20 6f 66 66 73 65 74 3d 3d 28  ssert( offset==(
22770 69 36 34 29 69 69 2a 28 34 2b 70 50 61 67 65 72  i64)ii*(4+pPager
22780 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 3b 0a 20  ->pageSize) );. 
22790 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
227a0 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
227b0 65 28 70 50 61 67 65 72 2c 20 26 6f 66 66 73 65  e(pPager, &offse
227c0 74 2c 20 70 44 6f 6e 65 2c 20 30 2c 20 31 29 3b  t, pDone, 0, 1);
227d0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
227e0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
227f0 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c  NE );.  }..  sql
22800 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
22810 79 28 70 44 6f 6e 65 29 3b 0a 20 20 69 66 28 20  y(pDone);.  if( 
22820 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
22830 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
22840 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20  rnalOff = szJ;. 
22850 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
22860 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
22870 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
22880 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
22890 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20   pages that are 
228a0 61 6c 6c 6f 77 65 64 0a 2a 2a 20 62 65 66 6f 72  allowed.** befor
228b0 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  e attempting to 
228c0 72 65 63 79 63 6c 65 20 63 6c 65 61 6e 20 61 6e  recycle clean an
228d0 64 20 75 6e 75 73 65 64 20 70 61 67 65 73 2e 0a  d unused pages..
228e0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
228f0 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65  agerSetCachesize
22900 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
22910 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 73  int mxPage){.  s
22920 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74 43  qlite3PcacheSetC
22930 61 63 68 65 73 69 7a 65 28 70 50 61 67 65 72 2d  achesize(pPager-
22940 3e 70 50 43 61 63 68 65 2c 20 6d 78 50 61 67 65  >pPCache, mxPage
22950 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  );.}../*.** Chan
22960 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ge the maximum n
22970 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f  umber of in-memo
22980 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61 72  ry pages that ar
22990 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 62 65 66  e allowed.** bef
229a0 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74  ore attempting t
229b0 6f 20 73 70 69 6c 6c 20 70 61 67 65 73 20 74 6f  o spill pages to
229c0 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74   journal..*/.int
229d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
229e0 53 70 69 6c 6c 73 69 7a 65 28 50 61 67 65 72 20  Spillsize(Pager 
229f0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50  *pPager, int mxP
22a00 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  age){.  return s
22a10 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74 53  qlite3PcacheSetS
22a20 70 69 6c 6c 73 69 7a 65 28 70 50 61 67 65 72 2d  pillsize(pPager-
22a30 3e 70 50 43 61 63 68 65 2c 20 6d 78 50 61 67 65  >pPCache, mxPage
22a40 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f  );.}../*.** Invo
22a50 6b 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  ke SQLITE_FCNTL_
22a60 4d 4d 41 50 5f 53 49 5a 45 20 62 61 73 65 64 20  MMAP_SIZE based 
22a70 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  on the current v
22a80 61 6c 75 65 20 6f 66 20 73 7a 4d 6d 61 70 2e 0a  alue of szMmap..
22a90 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
22aa0 61 67 65 72 46 69 78 4d 61 70 6c 69 6d 69 74 28  agerFixMaplimit(
22ab0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
22ac0 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
22ad0 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 73 71 6c  MAP_SIZE>0.  sql
22ae0 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 3d 20  ite3_file *fd = 
22af0 70 50 61 67 65 72 2d 3e 66 64 3b 0a 20 20 69 66  pPager->fd;.  if
22b00 28 20 69 73 4f 70 65 6e 28 66 64 29 20 26 26 20  ( isOpen(fd) && 
22b10 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69 56  fd->pMethods->iV
22b20 65 72 73 69 6f 6e 3e 3d 33 20 29 7b 0a 20 20 20  ersion>=3 ){.   
22b30 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73   sqlite3_int64 s
22b40 7a 3b 0a 20 20 20 20 73 7a 20 3d 20 70 50 61 67  z;.    sz = pPag
22b50 65 72 2d 3e 73 7a 4d 6d 61 70 3b 0a 20 20 20 20  er->szMmap;.    
22b60 70 50 61 67 65 72 2d 3e 62 55 73 65 46 65 74 63  pPager->bUseFetc
22b70 68 20 3d 20 28 73 7a 3e 30 29 3b 0a 20 20 20 20  h = (sz>0);.    
22b80 73 65 74 47 65 74 74 65 72 4d 65 74 68 6f 64 28  setGetterMethod(
22b90 70 50 61 67 65 72 29 3b 0a 20 20 20 20 73 71 6c  pPager);.    sql
22ba0 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
22bb0 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64  lHint(pPager->fd
22bc0 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d  , SQLITE_FCNTL_M
22bd0 4d 41 50 5f 53 49 5a 45 2c 20 26 73 7a 29 3b 0a  MAP_SIZE, &sz);.
22be0 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
22bf0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d  .** Change the m
22c00 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 61  aximum size of a
22c10 6e 79 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e  ny memory mappin
22c20 67 20 6d 61 64 65 20 6f 66 20 74 68 65 20 64 61  g made of the da
22c30 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a  tabase file..*/.
22c40 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
22c50 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 50 61  rSetMmapLimit(Pa
22c60 67 65 72 20 2a 70 50 61 67 65 72 2c 20 73 71 6c  ger *pPager, sql
22c70 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61  ite3_int64 szMma
22c80 70 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 73 7a  p){.  pPager->sz
22c90 4d 6d 61 70 20 3d 20 73 7a 4d 6d 61 70 3b 0a 20  Mmap = szMmap;. 
22ca0 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69 6d 69   pagerFixMaplimi
22cb0 74 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a  t(pPager);.}../*
22cc0 0a 2a 2a 20 46 72 65 65 20 61 73 20 6d 75 63 68  .** Free as much
22cd0 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73 69   memory as possi
22ce0 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ble from the pag
22cf0 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  er..*/.void sqli
22d00 74 65 33 50 61 67 65 72 53 68 72 69 6e 6b 28 50  te3PagerShrink(P
22d10 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
22d20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 68   sqlite3PcacheSh
22d30 72 69 6e 6b 28 70 50 61 67 65 72 2d 3e 70 50 43  rink(pPager->pPC
22d40 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ache);.}../*.** 
22d50 41 64 6a 75 73 74 20 73 65 74 74 69 6e 67 73 20  Adjust settings 
22d60 6f 66 20 74 68 65 20 70 61 67 65 72 20 74 6f 20  of the pager to 
22d70 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 20  those specified 
22d80 69 6e 20 74 68 65 20 70 67 46 6c 61 67 73 20 70  in the pgFlags p
22d90 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  arameter..**.** 
22da0 54 68 65 20 22 6c 65 76 65 6c 22 20 69 6e 20 70  The "level" in p
22db0 67 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f 53  gFlags & PAGER_S
22dc0 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b 20  YNCHRONOUS_MASK 
22dd0 73 65 74 73 20 74 68 65 20 72 6f 62 75 73 74 6e  sets the robustn
22de0 65 73 73 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  ess.** of the da
22df0 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65  tabase to damage
22e00 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68   due to OS crash
22e10 65 73 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c  es or power fail
22e20 75 72 65 73 20 62 79 0a 2a 2a 20 63 68 61 6e 67  ures by.** chang
22e30 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ing the number o
22e40 66 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20  f syncs()s when 
22e50 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f 75 72  writing the jour
22e60 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65 72 65 20 61  nals..** There a
22e70 72 65 20 66 6f 75 72 20 6c 65 76 65 6c 73 3a 0a  re four levels:.
22e80 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20  **.**    OFF    
22e90 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63     sqlite3OsSync
22ea0 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  () is never call
22eb0 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65  ed.  This is the
22ec0 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20   default.**     
22ed0 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d           for tem
22ee0 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73  porary and trans
22ef0 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  ient files..**.*
22f00 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54  *    NORMAL    T
22f10 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
22f20 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65  nced once before
22f30 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e   writes begin on
22f40 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
22f50 20 20 20 20 20 64 61 74 61 62 61 73 65 2e 20 20       database.  
22f60 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  This is normally
22f70 20 61 64 65 71 75 61 74 65 20 70 72 6f 74 65 63   adequate protec
22f80 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20  tion, but.**    
22f90 20 20 20 20 20 20 20 20 20 20 69 74 20 69 73 20            it is 
22fa0 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f  theoretically po
22fb0 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76  ssible, though v
22fc0 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a  ery unlikely,.**
22fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
22fe0 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65  at an inopertune
22ff0 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63   power failure c
23000 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a  ould leave the j
23010 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20  ournal.**       
23020 20 20 20 20 20 20 20 69 6e 20 61 20 73 74 61 74         in a stat
23030 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61  e which would ca
23040 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68  use damage to th
23050 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
23060 20 20 20 20 20 20 20 20 20 20 20 77 68 65 6e 20             when 
23070 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  it is rolled bac
23080 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c  k..**.**    FULL
23090 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61        The journa
230a0 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77 69 63  l is synced twic
230b0 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20  e before writes 
230c0 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  begin on the.** 
230d0 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
230e0 61 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65  abase (with some
230f0 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
23100 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52  rmation - the nR
23110 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20  ec field.**     
23120 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
23130 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d  journal header -
23140 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69   being written i
23150 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77  n between the tw
23160 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  o.**            
23170 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65    syncs).  If we
23180 20 61 73 73 75 6d 65 20 74 68 61 74 20 77 72 69   assume that wri
23190 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20  ting a.**       
231a0 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69         single di
231b0 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f  sk sector is ato
231c0 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d  mic, then this m
231d0 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20  ode provides.** 
231e0 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
231f0 75 72 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  urance that the 
23200 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74  journal will not
23210 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f   be corrupted to
23220 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
23230 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61       point of ca
23240 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20  using damage to 
23250 74 68 65 20 64 61 74 61 62 61 73 65 20 64 75 72  the database dur
23260 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  ing rollback..**
23270 0a 2a 2a 20 20 20 20 45 58 54 52 41 20 20 20 20  .**    EXTRA    
23280 20 54 68 69 73 20 69 73 20 6c 69 6b 65 20 46 55   This is like FU
23290 4c 4c 20 65 78 63 65 70 74 20 74 68 61 74 20 69  LL except that i
232a0 73 20 61 6c 73 6f 20 73 79 6e 63 73 20 74 68 65  s also syncs the
232b0 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 20 20   directory.**   
232c0 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20             that 
232d0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 72 6f 6c  contains the rol
232e0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 66  lback journal af
232f0 74 65 72 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ter the rollback
23300 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
23310 20 6a 6f 75 72 6e 61 6c 20 69 73 20 75 6e 6c 69   journal is unli
23320 6e 6b 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  nked..**.** The 
23330 61 62 6f 76 65 20 69 73 20 66 6f 72 20 61 20 72  above is for a r
23340 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 20  ollback-journal 
23350 6d 6f 64 65 2e 20 20 46 6f 72 20 57 41 4c 20 6d  mode.  For WAL m
23360 6f 64 65 2c 20 4f 46 46 20 63 6f 6e 74 69 6e 75  ode, OFF continu
23370 65 73 0a 2a 2a 20 74 6f 20 6d 65 61 6e 20 74 68  es.** to mean th
23380 61 74 20 6e 6f 20 73 79 6e 63 73 20 65 76 65 72  at no syncs ever
23390 20 6f 63 63 75 72 2e 20 20 4e 4f 52 4d 41 4c 20   occur.  NORMAL 
233a0 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 57  means that the W
233b0 41 4c 20 69 73 20 73 79 6e 63 65 64 0a 2a 2a 20  AL is synced.** 
233c0 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61  prior to the sta
233d0 72 74 20 6f 66 20 63 68 65 63 6b 70 6f 69 6e 74  rt of checkpoint
233e0 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 64 61   and that the da
233f0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 73  tabase file is s
23400 79 6e 63 65 64 0a 2a 2a 20 61 74 20 74 68 65 20  ynced.** at the 
23410 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 74 68  conclusion of th
23420 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 66 20  e checkpoint if 
23430 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65  the entire conte
23440 6e 74 20 6f 66 20 74 68 65 20 57 41 4c 0a 2a 2a  nt of the WAL.**
23450 20 77 61 73 20 77 72 69 74 74 65 6e 20 62 61 63   was written bac
23460 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  k into the datab
23470 61 73 65 2e 20 20 42 75 74 20 6e 6f 20 73 79 6e  ase.  But no syn
23480 63 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 63 63  c operations occ
23490 75 72 20 66 6f 72 0a 2a 2a 20 61 6e 20 6f 72 64  ur for.** an ord
234a0 69 6e 61 72 79 20 63 6f 6d 6d 69 74 20 69 6e 20  inary commit in 
234b0 4e 4f 52 4d 41 4c 20 6d 6f 64 65 20 77 69 74 68  NORMAL mode with
234c0 20 57 41 4c 2e 20 20 46 55 4c 4c 20 6d 65 61 6e   WAL.  FULL mean
234d0 73 20 74 68 61 74 20 74 68 65 20 57 41 4c 0a 2a  s that the WAL.*
234e0 2a 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64  * file is synced
234f0 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61 63 68 20   following each 
23500 63 6f 6d 6d 69 74 20 6f 70 65 72 61 74 69 6f 6e  commit operation
23510 2c 20 69 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f  , in addition to
23520 20 74 68 65 0a 2a 2a 20 73 79 6e 63 73 20 61 73   the.** syncs as
23530 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 4e 4f  sociated with NO
23540 52 4d 41 4c 2e 20 20 54 68 65 72 65 20 69 73 20  RMAL.  There is 
23550 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  no difference be
23560 74 77 65 65 6e 20 46 55 4c 4c 0a 2a 2a 20 61 6e  tween FULL.** an
23570 64 20 45 58 54 52 41 20 66 6f 72 20 57 41 4c 20  d EXTRA for WAL 
23580 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e  mode..**.** Do n
23590 6f 74 20 63 6f 6e 66 75 73 65 20 73 79 6e 63 68  ot confuse synch
235a0 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 77 69 74 68  ronous=FULL with
235b0 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c   SQLITE_SYNC_FUL
235c0 4c 2e 20 20 54 68 65 0a 2a 2a 20 53 51 4c 49 54  L.  The.** SQLIT
235d0 45 5f 53 59 4e 43 5f 46 55 4c 4c 20 6d 61 63 72  E_SYNC_FULL macr
235e0 6f 20 6d 65 61 6e 73 20 74 6f 20 75 73 65 20 74  o means to use t
235f0 68 65 20 4d 61 63 4f 53 58 2d 73 74 79 6c 65 20  he MacOSX-style 
23600 66 75 6c 6c 2d 66 73 79 6e 63 0a 2a 2a 20 75 73  full-fsync.** us
23610 69 6e 67 20 66 63 6e 74 6c 28 46 5f 46 55 4c 4c  ing fcntl(F_FULL
23620 46 53 59 4e 43 29 2e 20 20 53 51 4c 49 54 45 5f  FSYNC).  SQLITE_
23630 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6d 65 61 6e  SYNC_NORMAL mean
23640 73 20 74 6f 20 64 6f 20 61 6e 0a 2a 2a 20 6f 72  s to do an.** or
23650 64 69 6e 61 72 79 20 66 73 79 6e 63 28 29 20 63  dinary fsync() c
23660 61 6c 6c 2e 20 20 54 68 65 72 65 20 69 73 20 6e  all.  There is n
23670 6f 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  o difference bet
23680 77 65 65 6e 20 53 51 4c 49 54 45 5f 53 59 4e 43  ween SQLITE_SYNC
23690 5f 46 55 4c 4c 0a 2a 2a 20 61 6e 64 20 53 51 4c  _FULL.** and SQL
236a0 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20  ITE_SYNC_NORMAL 
236b0 6f 6e 20 70 6c 61 74 66 6f 72 6d 73 20 6f 74 68  on platforms oth
236c0 65 72 20 74 68 61 6e 20 4d 61 63 4f 53 58 2e 20  er than MacOSX. 
236d0 20 42 75 74 20 74 68 65 0a 2a 2a 20 73 79 6e 63   But the.** sync
236e0 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 76 65 72  hronous=FULL ver
236f0 73 75 73 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d  sus synchronous=
23700 4e 4f 52 4d 41 4c 20 73 65 74 74 69 6e 67 20 64  NORMAL setting d
23710 65 74 65 72 6d 69 6e 65 73 20 77 68 65 6e 0a 2a  etermines when.*
23720 2a 20 74 68 65 20 78 53 79 6e 63 20 70 72 69 6d  * the xSync prim
23730 69 74 69 76 65 20 69 73 20 63 61 6c 6c 65 64 20  itive is called 
23740 61 6e 64 20 69 73 20 72 65 6c 65 76 61 6e 74 20  and is relevant 
23750 74 6f 20 61 6c 6c 20 70 6c 61 74 66 6f 72 6d 73  to all platforms
23760 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20  ..**.** Numeric 
23770 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65  values associate
23780 64 20 77 69 74 68 20 74 68 65 73 65 20 73 74 61  d with these sta
23790 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20  tes are OFF==1, 
237a0 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64  NORMAL=2,.** and
237b0 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e   FULL=3..*/.#ifn
237c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
237d0 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f  PAGER_PRAGMAS.vo
237e0 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
237f0 65 74 46 6c 61 67 73 28 0a 20 20 50 61 67 65 72  etFlags(.  Pager
23800 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
23810 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 74 6f   /* The pager to
23820 20 73 65 74 20 73 61 66 65 74 79 20 6c 65 76 65   set safety leve
23830 6c 20 66 6f 72 20 2a 2f 0a 20 20 75 6e 73 69 67  l for */.  unsig
23840 6e 65 64 20 70 67 46 6c 61 67 73 20 20 20 20 20  ned pgFlags     
23850 20 2f 2a 20 56 61 72 69 6f 75 73 20 66 6c 61 67   /* Various flag
23860 73 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  s */.){.  unsign
23870 65 64 20 6c 65 76 65 6c 20 3d 20 70 67 46 6c 61  ed level = pgFla
23880 67 73 20 26 20 50 41 47 45 52 5f 53 59 4e 43 48  gs & PAGER_SYNCH
23890 52 4f 4e 4f 55 53 5f 4d 41 53 4b 3b 0a 20 20 69  RONOUS_MASK;.  i
238a0 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  f( pPager->tempF
238b0 69 6c 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ile ){.    pPage
238c0 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 31 3b 0a 20  r->noSync = 1;. 
238d0 20 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53     pPager->fullS
238e0 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  ync = 0;.    pPa
238f0 67 65 72 2d 3e 65 78 74 72 61 53 79 6e 63 20 3d  ger->extraSync =
23900 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
23910 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
23920 3d 20 20 6c 65 76 65 6c 3d 3d 50 41 47 45 52 5f  =  level==PAGER_
23930 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4f 46 46 20  SYNCHRONOUS_OFF 
23940 3f 31 3a 30 3b 0a 20 20 20 20 70 50 61 67 65 72  ?1:0;.    pPager
23950 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 6c 65 76  ->fullSync = lev
23960 65 6c 3e 3d 50 41 47 45 52 5f 53 59 4e 43 48 52  el>=PAGER_SYNCHR
23970 4f 4e 4f 55 53 5f 46 55 4c 4c 20 3f 31 3a 30 3b  ONOUS_FULL ?1:0;
23980 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78 74  .    pPager->ext
23990 72 61 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d  raSync = level==
239a0 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55  PAGER_SYNCHRONOU
239b0 53 5f 45 58 54 52 41 20 3f 31 3a 30 3b 0a 20 20  S_EXTRA ?1:0;.  
239c0 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
239d0 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50  noSync ){.    pP
239e0 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20  ager->syncFlags 
239f0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
23a00 20 70 67 46 6c 61 67 73 20 26 20 50 41 47 45 52   pgFlags & PAGER
23a10 5f 46 55 4c 4c 46 53 59 4e 43 20 29 7b 0a 20 20  _FULLFSYNC ){.  
23a20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c    pPager->syncFl
23a30 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
23a40 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b  C_FULL;.  }else{
23a50 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  .    pPager->syn
23a60 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
23a70 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d  SYNC_NORMAL;.  }
23a80 0a 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79  .  pPager->walSy
23a90 6e 63 46 6c 61 67 73 20 3d 20 28 70 50 61 67 65  ncFlags = (pPage
23aa0 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3c 3c 32 29  r->syncFlags<<2)
23ab0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
23ac0 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20  fullSync ){.    
23ad0 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46  pPager->walSyncF
23ae0 6c 61 67 73 20 7c 3d 20 70 50 61 67 65 72 2d 3e  lags |= pPager->
23af0 73 79 6e 63 46 6c 61 67 73 3b 0a 20 20 7d 0a 20  syncFlags;.  }. 
23b00 20 69 66 28 20 28 70 67 46 6c 61 67 73 20 26 20   if( (pgFlags & 
23b10 50 41 47 45 52 5f 43 4b 50 54 5f 46 55 4c 4c 46  PAGER_CKPT_FULLF
23b20 53 59 4e 43 29 20 26 26 20 21 70 50 61 67 65 72  SYNC) && !pPager
23b30 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
23b40 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46  pPager->walSyncF
23b50 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49 54 45 5f  lags |= (SQLITE_
23b60 53 59 4e 43 5f 46 55 4c 4c 3c 3c 32 29 3b 0a 20  SYNC_FULL<<2);. 
23b70 20 7d 0a 20 20 69 66 28 20 70 67 46 6c 61 67 73   }.  if( pgFlags
23b80 20 26 20 50 41 47 45 52 5f 43 41 43 48 45 53 50   & PAGER_CACHESP
23b90 49 4c 4c 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ILL ){.    pPage
23ba0 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 3d  r->doNotSpill &=
23bb0 20 7e 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 3b   ~SPILLFLAG_OFF;
23bc0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
23bd0 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
23be0 20 7c 3d 20 53 50 49 4c 4c 46 4c 41 47 5f 4f 46   |= SPILLFLAG_OF
23bf0 46 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  F;.  }.}.#endif.
23c00 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
23c10 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69  wing global vari
23c20 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65 6e  able is incremen
23c30 74 65 64 20 77 68 65 6e 65 76 65 72 20 74 68 65  ted whenever the
23c40 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74 74 65   library.** atte
23c50 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20 74  mpts to open a t
23c60 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20  emporary file.  
23c70 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
23c80 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20   is used for.** 
23c90 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c  testing and anal
23ca0 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a  ysis only.  .*/.
23cb0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
23cc0 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  ST.int sqlite3_o
23cd0 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20  pentemp_count = 
23ce0 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  0;.#endif../*.**
23cf0 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   Open a temporar
23d00 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 72  y file..**.** Wr
23d10 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ite the file des
23d20 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 70 46  criptor into *pF
23d30 69 6c 65 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  ile. Return SQLI
23d40 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
23d50 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68   .** or some oth
23d60 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  er error code if
23d70 20 77 65 20 66 61 69 6c 2e 20 54 68 65 20 4f 53   we fail. The OS
23d80 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61   will automatica
23d90 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74  lly .** delete t
23da0 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  he temporary fil
23db0 65 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f  e when it is clo
23dc0 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  sed..**.** The f
23dd0 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f 20 74  lags passed to t
23de0 68 65 20 56 46 53 20 6c 61 79 65 72 20 78 4f 70  he VFS layer xOp
23df0 65 6e 28 29 20 63 61 6c 6c 20 61 72 65 20 74 68  en() call are th
23e00 6f 73 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  ose specified.**
23e10 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 76 66   by parameter vf
23e20 73 46 6c 61 67 73 20 4f 52 65 64 20 77 69 74 68  sFlags ORed with
23e30 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
23e40 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  **.**     SQLITE
23e50 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a  _OPEN_READWRITE.
23e60 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50  **     SQLITE_OP
23e70 45 4e 5f 43 52 45 41 54 45 0a 2a 2a 20 20 20 20  EN_CREATE.**    
23e80 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
23e90 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 53 51  LUSIVE.**     SQ
23ea0 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
23eb0 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74 61 74 69  ONCLOSE.*/.stati
23ec0 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e 74  c int pagerOpent
23ed0 65 6d 70 28 0a 20 20 50 61 67 65 72 20 2a 70 50  emp(.  Pager *pP
23ee0 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20  ager,        /* 
23ef0 54 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  The pager object
23f00 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
23f10 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a 20 57  le *pFile,  /* W
23f20 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65  rite the file de
23f30 73 63 72 69 70 74 6f 72 20 68 65 72 65 20 2a 2f  scriptor here */
23f40 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20  .  int vfsFlags 
23f50 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
23f60 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68  s passed through
23f70 20 74 6f 20 74 68 65 20 56 46 53 20 2a 2f 0a 29   to the VFS */.)
23f80 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
23f90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
23fa0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23 69 66  urn code */..#if
23fb0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
23fc0 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65    sqlite3_opente
23fd0 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20  mp_count++;  /* 
23fe0 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  Used for testing
23ff0 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e   and analysis on
24000 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  ly */.#endif..  
24010 76 66 73 46 6c 61 67 73 20 7c 3d 20 20 53 51 4c  vfsFlags |=  SQL
24020 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
24030 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
24040 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20  _CREATE |.      
24050 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
24060 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 20 53 51  N_EXCLUSIVE | SQ
24070 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
24080 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20 3d 20  ONCLOSE;.  rc = 
24090 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 50  sqlite3OsOpen(pP
240a0 61 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70  ager->pVfs, 0, p
240b0 46 69 6c 65 2c 20 76 66 73 46 6c 61 67 73 2c 20  File, vfsFlags, 
240c0 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  0);.  assert( rc
240d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69  !=SQLITE_OK || i
240e0 73 4f 70 65 6e 28 70 46 69 6c 65 29 20 29 3b 0a  sOpen(pFile) );.
240f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
24100 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75  /*.** Set the bu
24110 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74  sy handler funct
24120 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ion..**.** The p
24130 61 67 65 72 20 69 6e 76 6f 6b 65 73 20 74 68 65  ager invokes the
24140 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 66   busy-handler if
24150 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29   sqlite3OsLock()
24160 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c   returns .** SQL
24170 49 54 45 5f 42 55 53 59 20 77 68 65 6e 20 74 72  ITE_BUSY when tr
24180 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20  ying to upgrade 
24190 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74 6f 20  from no-lock to 
241a0 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 0a 2a  a SHARED lock,.*
241b0 2a 20 6f 72 20 77 68 65 6e 20 74 72 79 69 6e 67  * or when trying
241c0 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d   to upgrade from
241d0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
241e0 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45   to an EXCLUSIVE
241f0 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20 64 6f   .** lock. It do
24200 65 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b 65 20  es *not* invoke 
24210 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
24220 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20   when upgrading 
24230 66 72 6f 6d 0a 2a 2a 20 53 48 41 52 45 44 20 74  from.** SHARED t
24240 6f 20 52 45 53 45 52 56 45 44 2c 20 6f 72 20 77  o RESERVED, or w
24250 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66 72  hen upgrading fr
24260 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 45 58 43  om SHARED to EXC
24270 4c 55 53 49 56 45 0a 2a 2a 20 28 77 68 69 63 68  LUSIVE.** (which
24280 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 68   occurs during h
24290 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
242a0 61 63 6b 29 2e 20 53 75 6d 6d 61 72 79 3a 0a 2a  ack). Summary:.*
242b0 2a 0a 2a 2a 20 20 20 54 72 61 6e 73 69 74 69 6f  *.**   Transitio
242c0 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
242d0 20 20 20 20 20 20 20 20 20 7c 20 49 6e 76 6f 6b           | Invok
242e0 65 73 20 78 42 75 73 79 48 61 6e 64 6c 65 72 0a  es xBusyHandler.
242f0 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  **   -----------
24300 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24310 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24320 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
24330 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20 20     NO_LOCK      
24340 20 2d 3e 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20   -> SHARED_LOCK 
24350 20 20 20 20 20 7c 20 59 65 73 0a 2a 2a 20 20 20       | Yes.**   
24360 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e  SHARED_LOCK   ->
24370 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20   RESERVED_LOCK  
24380 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48 41 52    | No.**   SHAR
24390 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45 58 43  ED_LOCK   -> EXC
243a0 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20  LUSIVE_LOCK   | 
243b0 4e 6f 0a 2a 2a 20 20 20 52 45 53 45 52 56 45 44  No.**   RESERVED
243c0 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c 55 53 49  _LOCK -> EXCLUSI
243d0 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 59 65 73 0a  VE_LOCK   | Yes.
243e0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 75 73  **.** If the bus
243f0 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61  y-handler callba
24400 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a  ck returns non-z
24410 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73  ero, the lock is
24420 20 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20 49 66   .** retried. If
24430 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65 72 6f   it returns zero
24440 2c 20 74 68 65 6e 20 74 68 65 20 53 51 4c 49 54  , then the SQLIT
24450 45 5f 42 55 53 59 20 65 72 72 6f 72 20 69 73 0a  E_BUSY error is.
24460 2a 2a 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  ** returned to t
24470 68 65 20 63 61 6c 6c 65 72 20 6f 66 20 74 68 65  he caller of the
24480 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63 74   pager API funct
24490 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
244a0 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79  ite3PagerSetBusy
244b0 48 61 6e 64 6c 65 72 28 0a 20 20 50 61 67 65 72  Handler(.  Pager
244c0 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
244d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
244e0 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
244f0 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79  */.  int (*xBusy
24500 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 20 2a 29  Handler)(void *)
24510 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  ,         /* Poi
24520 6e 74 65 72 20 74 6f 20 62 75 73 79 2d 68 61 6e  nter to busy-han
24530 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  dler function */
24540 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48 61  .  void *pBusyHa
24550 6e 64 6c 65 72 41 72 67 20 20 20 20 20 20 20 20  ndlerArg        
24560 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d          /* Argum
24570 65 6e 74 20 74 6f 20 70 61 73 73 20 74 6f 20 78  ent to pass to x
24580 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 29  BusyHandler */.)
24590 7b 0a 20 20 76 6f 69 64 20 2a 2a 61 70 3b 0a 20  {.  void **ap;. 
245a0 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61   pPager->xBusyHa
245b0 6e 64 6c 65 72 20 3d 20 78 42 75 73 79 48 61 6e  ndler = xBusyHan
245c0 64 6c 65 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e  dler;.  pPager->
245d0 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20  pBusyHandlerArg 
245e0 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  = pBusyHandlerAr
245f0 67 3b 0a 20 20 61 70 20 3d 20 28 76 6f 69 64 20  g;.  ap = (void 
24600 2a 2a 29 26 70 50 61 67 65 72 2d 3e 78 42 75 73  **)&pPager->xBus
24610 79 48 61 6e 64 6c 65 72 3b 0a 20 20 61 73 73 65  yHandler;.  asse
24620 72 74 28 20 28 28 69 6e 74 28 2a 29 28 76 6f 69  rt( ((int(*)(voi
24630 64 20 2a 29 29 28 61 70 5b 30 5d 29 29 3d 3d 78  d *))(ap[0]))==x
24640 42 75 73 79 48 61 6e 64 6c 65 72 20 29 3b 0a 20  BusyHandler );. 
24650 20 61 73 73 65 72 74 28 20 61 70 5b 31 5d 3d 3d   assert( ap[1]==
24660 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20  pBusyHandlerArg 
24670 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 46 69  );.  sqlite3OsFi
24680 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50  leControlHint(pP
24690 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45  ager->fd, SQLITE
246a0 5f 46 43 4e 54 4c 5f 42 55 53 59 48 41 4e 44 4c  _FCNTL_BUSYHANDL
246b0 45 52 2c 20 28 76 6f 69 64 20 2a 29 61 70 29 3b  ER, (void *)ap);
246c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
246d0 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 75   the page size u
246e0 73 65 64 20 62 79 20 74 68 65 20 50 61 67 65 72  sed by the Pager
246f0 20 6f 62 6a 65 63 74 2e 20 54 68 65 20 6e 65 77   object. The new
24700 20 70 61 67 65 20 73 69 7a 65 20 0a 2a 2a 20 69   page size .** i
24710 73 20 70 61 73 73 65 64 20 69 6e 20 2a 70 50 61  s passed in *pPa
24720 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  geSize..**.** If
24730 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
24740 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
24750 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
24760 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
24770 74 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  t.** is a no-op.
24780 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
24790 6e 65 64 20 69 73 20 74 68 65 20 65 72 72 6f 72  ned is the error
247a0 20 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64   state error cod
247b0 65 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e 65 20  e (i.e. .** one 
247c0 6f 66 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  of SQLITE_IOERR,
247d0 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   an SQLITE_IOERR
247e0 5f 78 78 78 20 73 75 62 2d 63 6f 64 65 20 6f 72  _xxx sub-code or
247f0 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29 2e 0a 2a   SQLITE_FULL)..*
24800 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
24810 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  if all of the fo
24820 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
24830 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20  :.**.**   * the 
24840 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20 28 76  new page size (v
24850 61 6c 75 65 20 6f 66 20 2a 70 50 61 67 65 53 69  alue of *pPageSi
24860 7a 65 29 20 69 73 20 76 61 6c 69 64 20 28 61 20  ze) is valid (a 
24870 70 6f 77 65 72 20 0a 2a 2a 20 20 20 20 20 6f 66  power .**     of
24880 20 74 77 6f 20 62 65 74 77 65 65 6e 20 35 31 32   two between 512
24890 20 61 6e 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f   and SQLITE_MAX_
248a0 50 41 47 45 5f 53 49 5a 45 2c 20 69 6e 63 6c 75  PAGE_SIZE, inclu
248b0 73 69 76 65 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a  sive), and.**.**
248c0 20 20 20 2a 20 74 68 65 72 65 20 61 72 65 20 6e     * there are n
248d0 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  o outstanding pa
248e0 67 65 20 72 65 66 65 72 65 6e 63 65 73 2c 20 61  ge references, a
248f0 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65  nd.**.**   * the
24900 20 64 61 74 61 62 61 73 65 20 69 73 20 65 69 74   database is eit
24910 68 65 72 20 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65  her not an in-me
24920 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 6f 72  mory database or
24930 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20 61 6e   it is.**     an
24940 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
24950 61 73 65 20 74 68 61 74 20 63 75 72 72 65 6e 74  ase that current
24960 6c 79 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 7a  ly consists of z
24970 65 72 6f 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a  ero pages..**.**
24980 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   then the pager 
24990 6f 62 6a 65 63 74 20 70 61 67 65 20 73 69 7a 65  object page size
249a0 20 69 73 20 73 65 74 20 74 6f 20 2a 70 50 61 67   is set to *pPag
249b0 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eSize..**.** If 
249c0 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
249d0 20 63 68 61 6e 67 65 64 2c 20 74 68 65 6e 20 74   changed, then t
249e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 75 73 65  his function use
249f0 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61  s sqlite3PagerMa
24a00 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74 6f 20 6f 62  lloc() .** to ob
24a10 74 61 69 6e 20 61 20 6e 65 77 20 50 61 67 65 72  tain a new Pager
24a20 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66 66 65  .pTmpSpace buffe
24a30 72 2e 20 49 66 20 74 68 69 73 20 61 6c 6c 6f 63  r. If this alloc
24a40 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 0a 2a  ation attempt .*
24a50 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f  * fails, SQLITE_
24a60 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65  NOMEM is returne
24a70 64 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 73  d and the page s
24a80 69 7a 65 20 72 65 6d 61 69 6e 73 20 75 6e 63 68  ize remains unch
24a90 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 6e 20 61 6c  anged. .** In al
24aa0 6c 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20 53  l other cases, S
24ab0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
24ac0 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rned..**.** If t
24ad0 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
24ae0 6e 6f 74 20 63 68 61 6e 67 65 64 2c 20 65 69 74  not changed, eit
24af0 68 65 72 20 62 65 63 61 75 73 65 20 6f 6e 65 20  her because one 
24b00 6f 66 20 74 68 65 20 65 6e 75 6d 65 72 61 74 65  of the enumerate
24b10 64 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20  d.** conditions 
24b20 61 62 6f 76 65 20 69 73 20 6e 6f 74 20 74 72 75  above is not tru
24b30 65 2c 20 74 68 65 20 70 61 67 65 72 20 77 61 73  e, the pager was
24b40 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20   in error state 
24b50 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20 66 75 6e  when this.** fun
24b60 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64  ction was called
24b70 2c 20 6f 72 20 62 65 63 61 75 73 65 20 74 68 65  , or because the
24b80 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
24b90 6f 6e 20 61 74 74 65 6d 70 74 20 66 61 69 6c 65  on attempt faile
24ba0 64 2c 20 0a 2a 2a 20 74 68 65 6e 20 2a 70 50 61  d, .** then *pPa
24bb0 67 65 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  geSize is set to
24bc0 20 74 68 65 20 6f 6c 64 2c 20 72 65 74 61 69 6e   the old, retain
24bd0 65 64 20 70 61 67 65 20 73 69 7a 65 20 62 65 66  ed page size bef
24be0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
24bf0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
24c00 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 50 61  erSetPagesize(Pa
24c10 67 65 72 20 2a 70 50 61 67 65 72 2c 20 75 33 32  ger *pPager, u32
24c20 20 2a 70 50 61 67 65 53 69 7a 65 2c 20 69 6e 74   *pPageSize, int
24c30 20 6e 52 65 73 65 72 76 65 29 7b 0a 20 20 69 6e   nReserve){.  in
24c40 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
24c50 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f  ;..  /* It is no
24c60 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 6f  t possible to do
24c70 20 61 20 66 75 6c 6c 20 61 73 73 65 72 74 5f 70   a full assert_p
24c80 61 67 65 72 5f 73 74 61 74 65 28 29 20 68 65 72  ager_state() her
24c90 65 2c 20 61 73 20 74 68 69 73 0a 20 20 2a 2a 20  e, as this.  ** 
24ca0 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20  function may be 
24cb0 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68  called from with
24cc0 69 6e 20 50 61 67 65 72 4f 70 65 6e 28 29 2c 20  in PagerOpen(), 
24cd0 62 65 66 6f 72 65 20 74 68 65 20 73 74 61 74 65  before the state
24ce0 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 50 61 67  .  ** of the Pag
24cf0 65 72 20 6f 62 6a 65 63 74 20 69 73 20 69 6e 74  er object is int
24d00 65 72 6e 61 6c 6c 79 20 63 6f 6e 73 69 73 74 65  ernally consiste
24d10 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 74  nt..  **.  ** At
24d20 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68 69 73 20   one point this 
24d30 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 65  function returne
24d40 64 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68  d an error if th
24d50 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 0a  e pager was in .
24d60 20 20 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f 52    ** PAGER_ERROR
24d70 20 73 74 61 74 65 2e 20 42 75 74 20 73 69 6e 63   state. But sinc
24d80 65 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74  e PAGER_ERROR st
24d90 61 74 65 20 67 75 61 72 61 6e 74 65 65 73 20 74  ate guarantees t
24da0 68 61 74 0a 20 20 2a 2a 20 74 68 65 72 65 20 69  hat.  ** there i
24db0 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  s at least one o
24dc0 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20  utstanding page 
24dd0 72 65 66 65 72 65 6e 63 65 2c 20 74 68 69 73 20  reference, this 
24de0 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  function.  ** is
24df0 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 68 61   a no-op for tha
24e00 74 20 63 61 73 65 20 61 6e 79 68 6f 77 2e 0a 20  t case anyhow.. 
24e10 20 2a 2f 0a 0a 20 20 75 33 32 20 70 61 67 65 53   */..  u32 pageS
24e20 69 7a 65 20 3d 20 2a 70 50 61 67 65 53 69 7a 65  ize = *pPageSize
24e30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65  ;.  assert( page
24e40 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65  Size==0 || (page
24e50 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67  Size>=512 && pag
24e60 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41  eSize<=SQLITE_MA
24e70 58 5f 50 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a  X_PAGE_SIZE) );.
24e80 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e 6d    if( (pPager->m
24e90 65 6d 44 62 3d 3d 30 20 7c 7c 20 70 50 61 67 65  emDb==0 || pPage
24ea0 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 29 0a 20 20  r->dbSize==0).  
24eb0 20 26 26 20 73 71 6c 69 74 65 33 50 63 61 63 68   && sqlite3Pcach
24ec0 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
24ed0 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 0a 20  ->pPCache)==0 . 
24ee0 20 20 26 26 20 70 61 67 65 53 69 7a 65 20 26 26    && pageSize &&
24ef0 20 70 61 67 65 53 69 7a 65 21 3d 28 75 33 32 29   pageSize!=(u32)
24f00 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
24f10 20 0a 20 20 29 7b 0a 20 20 20 20 63 68 61 72 20   .  ){.    char 
24f20 2a 70 4e 65 77 20 3d 20 4e 55 4c 4c 3b 20 20 20  *pNew = NULL;   
24f30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
24f40 20 74 65 6d 70 20 73 70 61 63 65 20 2a 2f 0a 20   temp space */. 
24f50 20 20 20 69 36 34 20 6e 42 79 74 65 20 3d 20 30     i64 nByte = 0
24f60 3b 0a 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ;..    if( pPage
24f70 72 2d 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f  r->eState>PAGER_
24f80 4f 50 45 4e 20 26 26 20 69 73 4f 70 65 6e 28 70  OPEN && isOpen(p
24f90 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
24fa0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
24fb0 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
24fc0 72 2d 3e 66 64 2c 20 26 6e 42 79 74 65 29 3b 0a  r->fd, &nByte);.
24fd0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
24fe0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
24ff0 20 20 20 20 20 70 4e 65 77 20 3d 20 28 63 68 61       pNew = (cha
25000 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 4d  r *)sqlite3PageM
25010 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65 29 3b  alloc(pageSize);
25020 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e 65 77  .      if( !pNew
25030 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e   ) rc = SQLITE_N
25040 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OMEM_BKPT;.    }
25050 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
25060 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
25070 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
25080 67 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ger);.      rc =
25090 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65   sqlite3PcacheSe
250a0 74 50 61 67 65 53 69 7a 65 28 70 50 61 67 65 72  tPageSize(pPager
250b0 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65 53  ->pPCache, pageS
250c0 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ize);.    }.    
250d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
250e0 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
250f0 65 33 50 61 67 65 46 72 65 65 28 70 50 61 67 65  e3PageFree(pPage
25100 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20  r->pTmpSpace);. 
25110 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d       pPager->pTm
25120 70 53 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20  pSpace = pNew;. 
25130 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
25140 69 7a 65 20 3d 20 28 50 67 6e 6f 29 28 28 6e 42  ize = (Pgno)((nB
25150 79 74 65 2b 70 61 67 65 53 69 7a 65 2d 31 29 2f  yte+pageSize-1)/
25160 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
25170 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
25180 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  e = pageSize;.  
25190 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
251a0 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70  qlite3PageFree(p
251b0 4e 65 77 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  New);.    }.  }.
251c0 0a 20 20 2a 70 50 61 67 65 53 69 7a 65 20 3d 20  .  *pPageSize = 
251d0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
251e0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
251f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
25200 20 6e 52 65 73 65 72 76 65 3c 30 20 29 20 6e 52   nReserve<0 ) nR
25210 65 73 65 72 76 65 20 3d 20 70 50 61 67 65 72 2d  eserve = pPager-
25220 3e 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61  >nReserve;.    a
25230 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e  ssert( nReserve>
25240 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c 31  =0 && nReserve<1
25250 30 30 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  000 );.    pPage
25260 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28 69  r->nReserve = (i
25270 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 20  16)nReserve;.   
25280 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65   pagerReportSize
25290 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 61  (pPager);.    pa
252a0 67 65 72 46 69 78 4d 61 70 6c 69 6d 69 74 28 70  gerFixMaplimit(p
252b0 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65  Pager);.  }.  re
252c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
252d0 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
252e0 65 72 20 74 6f 20 74 68 65 20 22 74 65 6d 70 6f  er to the "tempo
252f0 72 61 72 79 20 70 61 67 65 22 20 62 75 66 66 65  rary page" buffe
25300 72 20 68 65 6c 64 20 69 6e 74 65 72 6e 61 6c 6c  r held internall
25310 79 0a 2a 2a 20 62 79 20 74 68 65 20 70 61 67 65  y.** by the page
25320 72 2e 20 20 54 68 69 73 20 69 73 20 61 20 62 75  r.  This is a bu
25330 66 66 65 72 20 74 68 61 74 20 69 73 20 62 69 67  ffer that is big
25340 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20   enough to hold 
25350 74 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20 63 6f  the.** entire co
25360 6e 74 65 6e 74 20 6f 66 20 61 20 64 61 74 61 62  ntent of a datab
25370 61 73 65 20 70 61 67 65 2e 20 20 54 68 69 73 20  ase page.  This 
25380 62 75 66 66 65 72 20 69 73 20 75 73 65 64 20 69  buffer is used i
25390 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72  nternally.** dur
253a0 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64  ing rollback and
253b0 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77 72 69   will be overwri
253c0 74 74 65 6e 20 77 68 65 6e 65 76 65 72 20 61 20  tten whenever a 
253d0 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75  rollback.** occu
253e0 72 73 2e 20 20 42 75 74 20 6f 74 68 65 72 20 6d  rs.  But other m
253f0 6f 64 75 6c 65 73 20 61 72 65 20 66 72 65 65 20  odules are free 
25400 74 6f 20 75 73 65 20 69 74 20 74 6f 6f 2c 20 61  to use it too, a
25410 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20  s long as.** no 
25420 72 6f 6c 6c 62 61 63 6b 73 20 61 72 65 20 68 61  rollbacks are ha
25430 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64  ppening..*/.void
25440 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 54 65   *sqlite3PagerTe
25450 6d 70 53 70 61 63 65 28 50 61 67 65 72 20 2a 70  mpSpace(Pager *p
25460 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
25470 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
25480 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  ce;.}../*.** Att
25490 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68 65 20  empt to set the 
254a0 6d 61 78 69 6d 75 6d 20 64 61 74 61 62 61 73 65  maximum database
254b0 20 70 61 67 65 20 63 6f 75 6e 74 20 69 66 20 6d   page count if m
254c0 78 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76  xPage is positiv
254d0 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63  e. .** Make no c
254e0 68 61 6e 67 65 73 20 69 66 20 6d 78 50 61 67 65  hanges if mxPage
254f0 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61   is zero or nega
25500 74 69 76 65 2e 20 20 41 6e 64 20 6e 65 76 65 72  tive.  And never
25510 20 72 65 64 75 63 65 20 74 68 65 0a 2a 2a 20 6d   reduce the.** m
25520 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e  aximum page coun
25530 74 20 62 65 6c 6f 77 20 74 68 65 20 63 75 72 72  t below the curr
25540 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ent size of the 
25550 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
25560 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 6d 78  Regardless of mx
25570 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65  Page, return the
25580 20 63 75 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d   current maximum
25590 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a   page count..*/.
255a0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
255b0 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 50 61 67  MaxPageCount(Pag
255c0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
255d0 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d  mxPage){.  if( m
255e0 78 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 70  xPage>0 ){.    p
255f0 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20  Pager->mxPgno = 
25600 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20 61 73  mxPage;.  }.  as
25610 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
25620 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e  tate!=PAGER_OPEN
25630 20 29 3b 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c   );      /* Call
25640 65 64 20 6f 6e 6c 79 20 62 79 20 4f 50 5f 4d 61  ed only by OP_Ma
25650 78 50 67 63 6e 74 20 2a 2f 0a 20 20 61 73 73 65  xPgcnt */.  asse
25660 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 78 50 67  rt( pPager->mxPg
25670 6e 6f 3e 3d 70 50 61 67 65 72 2d 3e 64 62 53 69  no>=pPager->dbSi
25680 7a 65 20 29 3b 20 20 2f 2a 20 4f 50 5f 4d 61 78  ze );  /* OP_Max
25690 50 67 63 6e 74 20 65 6e 66 6f 72 63 65 73 20 74  Pgcnt enforces t
256a0 68 69 73 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  his */.  return 
256b0 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a  pPager->mxPgno;.
256c0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
256d0 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66 20 72 6f  lowing set of ro
256e0 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20  utines are used 
256f0 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20 73  to disable the s
25700 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20  imulated.** I/O 
25710 65 72 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e  error mechanism.
25720 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73    These routines
25730 20 61 72 65 20 75 73 65 64 20 74 6f 20 61 76 6f   are used to avo
25740 69 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20  id simulated.** 
25750 65 72 72 6f 72 73 20 69 6e 20 70 6c 61 63 65 73  errors in places
25760 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74   where we do not
25770 20 63 61 72 65 20 61 62 6f 75 74 20 65 72 72 6f   care about erro
25780 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73  rs..**.** Unless
25790 20 2d 44 53 51 4c 49 54 45 5f 54 45 53 54 3d 31   -DSQLITE_TEST=1
257a0 20 69 73 20 75 73 65 64 2c 20 74 68 65 73 65 20   is used, these 
257b0 72 6f 75 74 69 6e 65 73 20 61 72 65 20 61 6c 6c  routines are all
257c0 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67   no-ops.** and g
257d0 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e  enerate no code.
257e0 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
257f0 45 5f 54 45 53 54 0a 65 78 74 65 72 6e 20 69 6e  E_TEST.extern in
25800 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72  t sqlite3_io_err
25810 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65  or_pending;.exte
25820 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  rn int sqlite3_i
25830 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61  o_error_hit;.sta
25840 74 69 63 20 69 6e 74 20 73 61 76 65 64 5f 63 6e  tic int saved_cn
25850 74 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c 65 5f  t;.void disable_
25860 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
25870 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 61 76  ors(void){.  sav
25880 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65 33  ed_cnt = sqlite3
25890 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
258a0 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f  g;.  sqlite3_io_
258b0 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20  error_pending = 
258c0 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c  -1;.}.void enabl
258d0 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
258e0 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73  rrors(void){.  s
258f0 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
25900 70 65 6e 64 69 6e 67 20 3d 20 73 61 76 65 64 5f  pending = saved_
25910 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  cnt;.}.#else.# d
25920 65 66 69 6e 65 20 64 69 73 61 62 6c 65 5f 73 69  efine disable_si
25930 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
25940 73 28 29 0a 23 20 64 65 66 69 6e 65 20 65 6e 61  s().# define ena
25950 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
25960 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e 64 69 66  _errors().#endif
25970 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65  ../*.** Read the
25980 20 66 69 72 73 74 20 4e 20 62 79 74 65 73 20 66   first N bytes f
25990 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  rom the beginnin
259a0 67 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e  g of the file in
259b0 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61  to memory.** tha
259c0 74 20 70 44 65 73 74 20 70 6f 69 6e 74 73 20 74  t pDest points t
259d0 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  o. .**.** If the
259e0 20 70 61 67 65 72 20 77 61 73 20 6f 70 65 6e 65   pager was opene
259f0 64 20 6f 6e 20 61 20 74 72 61 6e 73 69 65 6e 74  d on a transient
25a00 20 66 69 6c 65 20 28 7a 46 69 6c 65 6e 61 6d 65   file (zFilename
25a10 3d 3d 22 22 29 2c 20 6f 72 0a 2a 2a 20 6f 70 65  ==""), or.** ope
25a20 6e 65 64 20 6f 6e 20 61 20 66 69 6c 65 20 6c 65  ned on a file le
25a30 73 73 20 74 68 61 6e 20 4e 20 62 79 74 65 73 20  ss than N bytes 
25a40 69 6e 20 73 69 7a 65 2c 20 74 68 65 20 6f 75 74  in size, the out
25a50 70 75 74 20 62 75 66 66 65 72 20 69 73 0a 2a 2a  put buffer is.**
25a60 20 7a 65 72 6f 65 64 20 61 6e 64 20 53 51 4c 49   zeroed and SQLI
25a70 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20  TE_OK returned. 
25a80 54 68 65 20 72 61 74 69 6f 6e 61 6c 65 20 66 6f  The rationale fo
25a90 72 20 74 68 69 73 20 69 73 20 74 68 61 74 20 74  r this is that t
25aa0 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his .** function
25ab0 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64   is used to read
25ac0 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72   database header
25ad0 73 2c 20 61 6e 64 20 61 20 6e 65 77 20 74 72 61  s, and a new tra
25ae0 6e 73 69 65 6e 74 20 6f 72 0a 2a 2a 20 7a 65 72  nsient or.** zer
25af0 6f 20 73 69 7a 65 64 20 64 61 74 61 62 61 73 65  o sized database
25b00 20 68 61 73 20 61 20 68 65 61 64 65 72 20 74 68   has a header th
25b10 61 6e 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69  an consists enti
25b20 72 65 6c 79 20 6f 66 20 7a 65 72 6f 65 73 2e 0a  rely of zeroes..
25b30 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 49 4f 20  **.** If any IO 
25b40 65 72 72 6f 72 20 61 70 61 72 74 20 66 72 6f 6d  error apart from
25b50 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48   SQLITE_IOERR_SH
25b60 4f 52 54 5f 52 45 41 44 20 69 73 20 65 6e 63 6f  ORT_READ is enco
25b70 75 6e 74 65 72 65 64 2c 0a 2a 2a 20 74 68 65 20  untered,.** the 
25b80 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
25b90 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
25ba0 6c 6c 65 72 20 61 6e 64 20 74 68 65 20 63 6f 6e  ller and the con
25bb0 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20  tents of the.** 
25bc0 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 75 6e  output buffer un
25bd0 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  defined..*/.int 
25be0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 61 64  sqlite3PagerRead
25bf0 46 69 6c 65 68 65 61 64 65 72 28 50 61 67 65 72  Fileheader(Pager
25c00 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c   *pPager, int N,
25c10 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
25c20 70 44 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63  pDest){.  int rc
25c30 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
25c40 6d 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c  memset(pDest, 0,
25c50 20 4e 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69   N);.  assert( i
25c60 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
25c70 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  ) || pPager->tem
25c80 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 54  pFile );..  /* T
25c90 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f  his routine is o
25ca0 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 62 74  nly called by bt
25cb0 72 65 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ree immediately 
25cc0 61 66 74 65 72 20 63 72 65 61 74 69 6e 67 0a 20  after creating. 
25cd0 20 2a 2a 20 74 68 65 20 50 61 67 65 72 20 6f 62   ** the Pager ob
25ce0 6a 65 63 74 2e 20 20 54 68 65 72 65 20 68 61 73  ject.  There has
25cf0 20 6e 6f 74 20 62 65 65 6e 20 61 6e 20 6f 70 70   not been an opp
25d00 6f 72 74 75 6e 69 74 79 20 74 6f 20 74 72 61 6e  ortunity to tran
25d10 73 69 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 57  sition.  ** to W
25d20 41 4c 20 6d 6f 64 65 20 79 65 74 2e 0a 20 20 2a  AL mode yet..  *
25d30 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67  /.  assert( !pag
25d40 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
25d50 20 29 3b 0a 0a 20 20 69 66 28 20 69 73 4f 70 65   );..  if( isOpe
25d60 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
25d70 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44  .    IOTRACE(("D
25d80 42 48 44 52 20 25 70 20 30 20 25 64 5c 6e 22 2c  BHDR %p 0 %d\n",
25d90 20 70 50 61 67 65 72 2c 20 4e 29 29 0a 20 20 20   pPager, N)).   
25da0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
25db0 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ead(pPager->fd, 
25dc0 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a 20 20  pDest, N, 0);.  
25dd0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
25de0 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
25df0 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  D ){.      rc = 
25e00 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
25e10 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
25e20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
25e30 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c  function may onl
25e40 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e  y be called when
25e50 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
25e60 69 6f 6e 20 69 73 20 6f 70 65 6e 20 6f 6e 0a 2a  ion is open on.*
25e70 2a 20 74 68 65 20 70 61 67 65 72 2e 20 49 74 20  * the pager. It 
25e80 72 65 74 75 72 6e 73 20 74 68 65 20 74 6f 74 61  returns the tota
25e90 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
25ea0 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
25eb0 65 2e 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65 72  e..**.** However
25ec0 2c 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73  , if the file is
25ed0 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 3c   between 1 and <
25ee0 70 61 67 65 2d 73 69 7a 65 3e 20 62 79 74 65 73  page-size> bytes
25ef0 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20 0a   in size, then .
25f00 2a 2a 20 74 68 69 73 20 69 73 20 63 6f 6e 73 69  ** this is consi
25f10 64 65 72 65 64 20 61 20 31 20 70 61 67 65 20 66  dered a 1 page f
25f20 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ile..*/.void sql
25f30 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
25f40 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
25f50 2c 20 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b 0a  , int *pnPage){.
25f60 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
25f70 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
25f80 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65  READER );.  asse
25f90 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
25fa0 74 65 21 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te!=PAGER_WRITER
25fb0 5f 46 49 4e 49 53 48 45 44 20 29 3b 0a 20 20 2a  _FINISHED );.  *
25fc0 70 6e 50 61 67 65 20 3d 20 28 69 6e 74 29 70 50  pnPage = (int)pP
25fd0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 7d 0a  ager->dbSize;.}.
25fe0 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f  ../*.** Try to o
25ff0 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20  btain a lock of 
26000 74 79 70 65 20 6c 6f 63 6b 74 79 70 65 20 6f 6e  type locktype on
26010 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
26020 6c 65 2e 20 49 66 0a 2a 2a 20 61 20 73 69 6d 69  le. If.** a simi
26030 6c 61 72 20 6f 72 20 67 72 65 61 74 65 72 20 6c  lar or greater l
26040 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68  ock is already h
26050 65 6c 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  eld, this functi
26060 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 0a 2a 2a  on is a no-op.**
26070 20 28 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49   (returning SQLI
26080 54 45 5f 4f 4b 20 69 6d 6d 65 64 69 61 74 65 6c  TE_OK immediatel
26090 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  y)..**.** Otherw
260a0 69 73 65 2c 20 61 74 74 65 6d 70 74 20 74 6f 20  ise, attempt to 
260b0 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20  obtain the lock 
260c0 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 4c  using sqlite3OsL
260d0 6f 63 6b 28 29 2e 20 49 6e 76 6f 6b 65 20 0a 2a  ock(). Invoke .*
260e0 2a 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  * the busy callb
260f0 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20  ack if the lock 
26100 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74  is currently not
26110 20 61 76 61 69 6c 61 62 6c 65 2e 20 52 65 70 65   available. Repe
26120 61 74 20 0a 2a 2a 20 75 6e 74 69 6c 20 74 68 65  at .** until the
26130 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72   busy callback r
26140 65 74 75 72 6e 73 20 66 61 6c 73 65 20 6f 72 20  eturns false or 
26150 75 6e 74 69 6c 20 74 68 65 20 61 74 74 65 6d 70  until the attemp
26160 74 20 74 6f 20 0a 2a 2a 20 6f 62 74 61 69 6e 20  t to .** obtain 
26170 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65 64  the lock succeed
26180 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  s..**.** Return 
26190 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
261a0 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72 6f  cess and an erro
261b0 72 20 63 6f 64 65 20 69 66 20 77 65 20 63 61 6e  r code if we can
261c0 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68  not obtain.** th
261d0 65 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c  e lock. If the l
261e0 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ock is obtained 
261f0 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 73 65  successfully, se
26200 74 20 74 68 65 20 50 61 67 65 72 2e 73 74 61 74  t the Pager.stat
26210 65 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74  e .** variable t
26220 6f 20 6c 6f 63 6b 74 79 70 65 20 62 65 66 6f 72  o locktype befor
26230 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
26240 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
26250 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61  _wait_on_lock(Pa
26260 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
26270 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e   locktype){.  in
26280 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
26290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
262a0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
262b0 65 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  e */..  /* Check
262c0 20 74 68 61 74 20 74 68 69 73 20 69 73 20 65 69   that this is ei
262d0 74 68 65 72 20 61 20 6e 6f 2d 6f 70 20 28 62 65  ther a no-op (be
262e0 63 61 75 73 65 20 74 68 65 20 72 65 71 75 65 73  cause the reques
262f0 74 65 64 20 6c 6f 63 6b 20 69 73 20 0a 20 20 2a  ted lock is .  *
26300 2a 20 61 6c 72 65 61 64 79 20 68 65 6c 64 29 2c  * already held),
26310 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 74   or one of the t
26320 72 61 6e 73 69 74 69 6f 6e 73 20 74 68 61 74 20  ransitions that 
26330 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72  the busy-handler
26340 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e 76  .  ** may be inv
26350 6f 6b 65 64 20 64 75 72 69 6e 67 2c 20 61 63 63  oked during, acc
26360 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63 6f  ording to the co
26370 6d 6d 65 6e 74 20 61 62 6f 76 65 0a 20 20 2a 2a  mment above.  **
26380 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
26390 42 75 73 79 68 61 6e 64 6c 65 72 28 29 2e 0a 20  Busyhandler().. 
263a0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70   */.  assert( (p
263b0 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 6c 6f  Pager->eLock>=lo
263c0 63 6b 74 79 70 65 29 0a 20 20 20 20 20 20 20 7c  cktype).       |
263d0 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  | (pPager->eLock
263e0 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63  ==NO_LOCK && loc
263f0 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
26400 43 4b 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  CK).       || (p
26410 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45  Pager->eLock==RE
26420 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 6c  SERVED_LOCK && l
26430 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49  ocktype==EXCLUSI
26440 56 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 0a 20  VE_LOCK).  );.. 
26450 20 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20 70   do {.    rc = p
26460 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65  agerLockDb(pPage
26470 72 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20  r, locktype);.  
26480 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49  }while( rc==SQLI
26490 54 45 5f 42 55 53 59 20 26 26 20 70 50 61 67 65  TE_BUSY && pPage
264a0 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 28  r->xBusyHandler(
264b0 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
264c0 64 6c 65 72 41 72 67 29 20 29 3b 0a 20 20 72 65  dlerArg) );.  re
264d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
264e0 2a 20 46 75 6e 63 74 69 6f 6e 20 61 73 73 65 72  * Function asser
264f0 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
26500 69 6e 74 28 70 50 61 67 65 72 29 20 63 68 65 63  int(pPager) chec
26510 6b 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74  ks that one of t
26520 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  he .** following
26530 20 69 73 20 74 72 75 65 20 66 6f 72 20 61 6c 6c   is true for all
26540 20 64 69 72 74 79 20 70 61 67 65 73 20 63 75 72   dirty pages cur
26550 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61  rently in the pa
26560 67 65 2d 63 61 63 68 65 3a 0a 2a 2a 0a 2a 2a 20  ge-cache:.**.** 
26570 20 20 61 29 20 54 68 65 20 70 61 67 65 20 6e 75    a) The page nu
26580 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74 68 61  mber is less tha
26590 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68  n or equal to th
265a0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a  e size of the .*
265b0 2a 20 20 20 20 20 20 63 75 72 72 65 6e 74 20 64  *      current d
265c0 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c 20 69  atabase image, i
265d0 6e 20 70 61 67 65 73 2c 20 4f 52 0a 2a 2a 0a 2a  n pages, OR.**.*
265e0 2a 20 20 20 62 29 20 69 66 20 74 68 65 20 70 61  *   b) if the pa
265f0 67 65 20 63 6f 6e 74 65 6e 74 20 77 65 72 65 20  ge content were 
26600 77 72 69 74 74 65 6e 20 61 74 20 74 68 69 73 20  written at this 
26610 74 69 6d 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e  time, it would n
26620 6f 74 0a 2a 2a 20 20 20 20 20 20 62 65 20 6e 65  ot.**      be ne
26630 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65  cessary to write
26640 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e   the current con
26650 74 65 6e 74 20 6f 75 74 20 74 6f 20 74 68 65 20  tent out to the 
26660 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  sub-journal.**  
26670 20 20 20 20 28 61 73 20 64 65 74 65 72 6d 69 6e      (as determin
26680 65 64 20 62 79 20 66 75 6e 63 74 69 6f 6e 20 73  ed by function s
26690 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
266a0 29 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ))..**.** If the
266b0 20 63 6f 6e 64 69 74 69 6f 6e 20 61 73 73 65 72   condition asser
266c0 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ted by this func
266d0 74 69 6f 6e 20 77 65 72 65 20 6e 6f 74 20 74 72  tion were not tr
266e0 75 65 2c 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64  ue, and the.** d
266f0 69 72 74 79 20 70 61 67 65 20 77 65 72 65 20 74  irty page were t
26700 6f 20 62 65 20 64 69 73 63 61 72 64 65 64 20 66  o be discarded f
26710 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20 76 69  rom the cache vi
26720 61 20 74 68 65 20 70 61 67 65 72 53 74 72 65 73  a the pagerStres
26730 73 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20  s().** routine, 
26740 70 61 67 65 72 53 74 72 65 73 73 28 29 20 77 6f  pagerStress() wo
26750 75 6c 64 20 6e 6f 74 20 77 72 69 74 65 20 74 68  uld not write th
26760 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 63  e current page c
26770 6f 6e 74 65 6e 74 20 74 6f 0a 2a 2a 20 74 68 65  ontent to.** the
26780 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
26790 49 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 74  If a savepoint t
267a0 72 61 6e 73 61 63 74 69 6f 6e 20 77 65 72 65 20  ransaction were 
267b0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 66 74 65  rolled back afte
267c0 72 0a 2a 2a 20 74 68 69 73 20 68 61 70 70 65 6e  r.** this happen
267d0 65 64 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20  ed, the correct 
267e0 62 65 68 61 76 69 6f 72 20 77 6f 75 6c 64 20 62  behavior would b
267f0 65 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  e to restore the
26800 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63 6f 6e 74   current.** cont
26810 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e  ent of the page.
26820 20 48 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20   However, since 
26830 74 68 69 73 20 63 6f 6e 74 65 6e 74 20 69 73 20  this content is 
26840 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 65  not present in e
26850 69 74 68 65 72 0a 2a 2a 20 74 68 65 20 64 61 74  ither.** the dat
26860 61 62 61 73 65 20 66 69 6c 65 20 6f 72 20 74 68  abase file or th
26870 65 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65  e portion of the
26880 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
26890 6c 20 61 6e 64 20 0a 2a 2a 20 73 75 62 2d 6a 6f  l and .** sub-jo
268a0 75 72 6e 61 6c 20 72 6f 6c 6c 65 64 20 62 61 63  urnal rolled bac
268b0 6b 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 6f  k the content co
268c0 75 6c 64 20 6e 6f 74 20 62 65 20 72 65 73 74 6f  uld not be resto
268d0 72 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64  red and the.** d
268e0 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 77 6f  atabase image wo
268f0 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72 72 75  uld become corru
26900 70 74 2e 20 49 74 20 69 73 20 74 68 65 72 65 66  pt. It is theref
26910 6f 72 65 20 66 6f 72 74 75 6e 61 74 65 20 74 68  ore fortunate th
26920 61 74 20 0a 2a 2a 20 74 68 69 73 20 63 69 72 63  at .** this circ
26930 75 6d 73 74 61 6e 63 65 20 63 61 6e 6e 6f 74 20  umstance cannot 
26940 61 72 69 73 65 2e 0a 2a 2f 0a 23 69 66 20 64 65  arise..*/.#if de
26950 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
26960 55 47 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  UG).static void 
26970 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
26980 6e 73 74 72 61 69 6e 74 43 62 28 50 67 48 64 72  nstraintCb(PgHdr
26990 20 2a 70 50 67 29 7b 0a 20 20 61 73 73 65 72 74   *pPg){.  assert
269a0 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ( pPg->flags&PGH
269b0 44 52 5f 44 49 52 54 59 20 29 3b 0a 20 20 61 73  DR_DIRTY );.  as
269c0 73 65 72 74 28 20 21 73 75 62 6a 52 65 71 75 69  sert( !subjRequi
269d0 72 65 73 50 61 67 65 28 70 50 67 29 20 7c 7c 20  resPage(pPg) || 
269e0 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 67 2d 3e  pPg->pgno<=pPg->
269f0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
26a00 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
26a10 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
26a20 6e 73 74 72 61 69 6e 74 28 50 61 67 65 72 20 2a  nstraint(Pager *
26a30 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74  pPager){.  sqlit
26a40 65 33 50 63 61 63 68 65 49 74 65 72 61 74 65 44  e3PcacheIterateD
26a50 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43  irty(pPager->pPC
26a60 61 63 68 65 2c 20 61 73 73 65 72 74 54 72 75 6e  ache, assertTrun
26a70 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62  cateConstraintCb
26a80 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  );.}.#else.# def
26a90 69 6e 65 20 61 73 73 65 72 74 54 72 75 6e 63 61  ine assertTrunca
26aa0 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61  teConstraint(pPa
26ab0 67 65 72 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ger).#endif../*.
26ac0 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20  ** Truncate the 
26ad0 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
26ae0 73 65 20 66 69 6c 65 20 69 6d 61 67 65 20 74 6f  se file image to
26af0 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20 54 68   nPage pages. Th
26b00 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
26b10 64 6f 65 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c  does not actuall
26b20 79 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74  y modify the dat
26b30 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69  abase file on di
26b40 73 6b 2e 20 49 74 20 0a 2a 2a 20 6a 75 73 74 20  sk. It .** just 
26b50 73 65 74 73 20 74 68 65 20 69 6e 74 65 72 6e 61  sets the interna
26b60 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70  l state of the p
26b70 61 67 65 72 20 6f 62 6a 65 63 74 20 73 6f 20 74  ager object so t
26b80 68 61 74 20 74 68 65 20 0a 2a 2a 20 74 72 75 6e  hat the .** trun
26b90 63 61 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64  cation will be d
26ba0 6f 6e 65 20 77 68 65 6e 20 74 68 65 20 63 75 72  one when the cur
26bb0 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
26bc0 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a   is committed..*
26bd0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
26be0 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  on is only calle
26bf0 64 20 72 69 67 68 74 20 62 65 66 6f 72 65 20 63  d right before c
26c00 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e  ommitting a tran
26c10 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 4f 6e 63 65  saction..** Once
26c20 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68   this function h
26c30 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20  as been called, 
26c40 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
26c50 6d 75 73 74 20 65 69 74 68 65 72 20 62 65 0a 2a  must either be.*
26c60 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 72  * rolled back or
26c70 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 74 20 69   committed. It i
26c80 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 63 61  s not safe to ca
26c90 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ll this function
26ca0 20 61 6e 64 0a 2a 2a 20 74 68 65 6e 20 63 6f 6e   and.** then con
26cb0 74 69 6e 75 65 20 77 72 69 74 69 6e 67 20 74 6f  tinue writing to
26cc0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
26cd0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
26ce0 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65  gerTruncateImage
26cf0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
26d00 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 61  Pgno nPage){.  a
26d10 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
26d20 62 53 69 7a 65 3e 3d 6e 50 61 67 65 20 29 3b 0a  bSize>=nPage );.
26d30 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
26d40 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
26d50 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20  WRITER_CACHEMOD 
26d60 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  );.  pPager->dbS
26d70 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 0a 20 20  ize = nPage;..  
26d80 2f 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20  /* At one point 
26d90 74 68 65 20 63 6f 64 65 20 68 65 72 65 20 63 61  the code here ca
26da0 6c 6c 65 64 20 61 73 73 65 72 74 54 72 75 6e 63  lled assertTrunc
26db0 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 29 20  ateConstraint() 
26dc0 74 6f 0a 20 20 2a 2a 20 65 6e 73 75 72 65 20 74  to.  ** ensure t
26dd0 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20 62 65  hat all pages be
26de0 69 6e 67 20 74 72 75 6e 63 61 74 65 64 20 61 77  ing truncated aw
26df0 61 79 20 62 79 20 74 68 69 73 20 6f 70 65 72 61  ay by this opera
26e00 74 69 6f 6e 20 61 72 65 2c 0a 20 20 2a 2a 20 69  tion are,.  ** i
26e10 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 61  f one or more sa
26e20 76 65 70 6f 69 6e 74 73 20 61 72 65 20 6f 70 65  vepoints are ope
26e30 6e 2c 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  n, present in th
26e40 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a  e savepoint .  *
26e50 2a 20 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61  * journal so tha
26e60 74 20 74 68 65 79 20 63 61 6e 20 62 65 20 72 65  t they can be re
26e70 73 74 6f 72 65 64 20 69 66 20 74 68 65 20 73 61  stored if the sa
26e80 76 65 70 6f 69 6e 74 20 69 73 20 72 6f 6c 6c 65  vepoint is rolle
26e90 64 0a 20 20 2a 2a 20 62 61 63 6b 2e 20 54 68 69  d.  ** back. Thi
26ea0 73 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6e  s is no longer n
26eb0 65 63 65 73 73 61 72 79 20 61 73 20 74 68 69 73  ecessary as this
26ec0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 77   function is now
26ed0 20 6f 6e 6c 79 0a 20 20 2a 2a 20 63 61 6c 6c 65   only.  ** calle
26ee0 64 20 72 69 67 68 74 20 62 65 66 6f 72 65 20 63  d right before c
26ef0 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e  ommitting a tran
26f00 73 61 63 74 69 6f 6e 2e 20 53 6f 20 61 6c 74 68  saction. So alth
26f10 6f 75 67 68 20 74 68 65 20 0a 20 20 2a 2a 20 50  ough the .  ** P
26f20 61 67 65 72 20 6f 62 6a 65 63 74 20 6d 61 79 20  ager object may 
26f30 73 74 69 6c 6c 20 68 61 76 65 20 6f 70 65 6e 20  still have open 
26f40 73 61 76 65 70 6f 69 6e 74 73 20 28 50 61 67 65  savepoints (Page
26f50 72 2e 6e 53 61 76 65 70 6f 69 6e 74 21 3d 30 29  r.nSavepoint!=0)
26f60 2c 20 0a 20 20 2a 2a 20 74 68 65 79 20 63 61 6e  , .  ** they can
26f70 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  not be rolled ba
26f80 63 6b 2e 20 53 6f 20 74 68 65 20 61 73 73 65 72  ck. So the asser
26f90 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
26fa0 69 6e 74 28 29 20 63 61 6c 6c 0a 20 20 2a 2a 20  int() call.  ** 
26fb0 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 63 6f 72  is no longer cor
26fc0 72 65 63 74 2e 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a  rect. */.}.../*.
26fd0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
26fe0 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   is called befor
26ff0 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 20 68  e attempting a h
27000 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
27010 61 63 6b 2e 20 49 74 0a 2a 2a 20 73 79 6e 63 73  ack. It.** syncs
27020 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
27030 65 20 74 6f 20 64 69 73 6b 2c 20 74 68 65 6e 20  e to disk, then 
27040 73 65 74 73 20 70 50 61 67 65 72 2d 3e 6a 6f 75  sets pPager->jou
27050 72 6e 61 6c 48 64 72 20 74 6f 20 74 68 65 0a 2a  rnalHdr to the.*
27060 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  * size of the jo
27070 75 72 6e 61 6c 20 66 69 6c 65 20 73 6f 20 74 68  urnal file so th
27080 61 74 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61  at the pager_pla
27090 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20  yback() routine 
270a0 6b 6e 6f 77 73 0a 2a 2a 20 74 68 61 74 20 74 68  knows.** that th
270b0 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c  e entire journal
270c0 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73   file has been s
270d0 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 79 6e  ynced..**.** Syn
270e0 63 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  cing a hot-journ
270f0 61 6c 20 74 6f 20 64 69 73 6b 20 62 65 66 6f 72  al to disk befor
27100 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  e attempting to 
27110 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 65 6e 73  roll it back ens
27120 75 72 65 73 20 0a 2a 2a 20 74 68 61 74 20 69 66  ures .** that if
27130 20 61 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65   a power-failure
27140 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74   occurs during t
27150 68 65 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  he rollback, the
27160 20 70 72 6f 63 65 73 73 20 74 68 61 74 0a 2a 2a   process that.**
27170 20 61 74 74 65 6d 70 74 73 20 72 6f 6c 6c 62 61   attempts rollba
27180 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 79 73  ck following sys
27190 74 65 6d 20 72 65 63 6f 76 65 72 79 20 73 65 65  tem recovery see
271a0 73 20 74 68 65 20 73 61 6d 65 20 6a 6f 75 72 6e  s the same journ
271b0 61 6c 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 61 73  al.** content as
271c0 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 2a   this process..*
271d0 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69  *.** If everythi
271e0 6e 67 20 67 6f 65 73 20 61 73 20 70 6c 61 6e 6e  ng goes as plann
271f0 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ed, SQLITE_OK is
27200 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
27210 77 69 73 65 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c  wise, .** an SQL
27220 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ite error code..
27230 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
27240 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61  gerSyncHotJourna
27250 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
27260 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
27270 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70  ITE_OK;.  if( !p
27280 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
27290 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
272a0 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
272b0 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43  jfd, SQLITE_SYNC
272c0 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 7d 0a 20 20  _NORMAL);.  }.  
272d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
272e0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
272f0 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
27300 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50  pPager->jfd, &pP
27310 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
27320 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
27330 72 63 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  rc;.}..#if SQLIT
27340 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
27350 30 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61  0./*.** Obtain a
27360 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20   reference to a 
27370 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 70 61  memory mapped pa
27380 67 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 70 61  ge object for pa
27390 67 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f 2e 20  ge number pgno. 
273a0 0a 2a 2a 20 54 68 65 20 6e 65 77 20 6f 62 6a 65  .** The new obje
273b0 63 74 20 77 69 6c 6c 20 75 73 65 20 74 68 65 20  ct will use the 
273c0 70 6f 69 6e 74 65 72 20 70 44 61 74 61 2c 20 6f  pointer pData, o
273d0 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 78 46 65  btained from xFe
273e0 74 63 68 28 29 2e 0a 2a 2a 20 49 66 20 73 75 63  tch()..** If suc
273f0 63 65 73 73 66 75 6c 2c 20 73 65 74 20 2a 70 70  cessful, set *pp
27400 50 61 67 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f  Page to point to
27410 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 72 65   the new page re
27420 66 65 72 65 6e 63 65 0a 2a 2a 20 61 6e 64 20 72  ference.** and r
27430 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
27440 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
27450 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  rn an SQLite err
27460 6f 72 20 63 6f 64 65 20 61 6e 64 20 73 65 74 0a  or code and set.
27470 2a 2a 20 2a 70 70 50 61 67 65 20 74 6f 20 7a 65  ** *ppPage to ze
27480 72 6f 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 72  ro..**.** Page r
27490 65 66 65 72 65 6e 63 65 73 20 6f 62 74 61 69 6e  eferences obtain
274a0 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68  ed by calling th
274b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  is function shou
274c0 6c 64 20 62 65 20 72 65 6c 65 61 73 65 64 0a 2a  ld be released.*
274d0 2a 20 62 79 20 63 61 6c 6c 69 6e 67 20 70 61 67  * by calling pag
274e0 65 72 52 65 6c 65 61 73 65 4d 61 70 50 61 67 65  erReleaseMapPage
274f0 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
27500 74 20 70 61 67 65 72 41 63 71 75 69 72 65 4d 61  t pagerAcquireMa
27510 70 50 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a  pPage(.  Pager *
27520 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
27530 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
27540 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67  r object */.  Pg
27550 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
27560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27570 20 50 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   Page number */.
27580 20 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 20    void *pData,  
27590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
275a0 20 20 2f 2a 20 78 46 65 74 63 68 28 29 27 64 20    /* xFetch()'d 
275b0 64 61 74 61 20 66 6f 72 20 74 68 69 73 20 70 61  data for this pa
275c0 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 2a  ge */.  PgHdr **
275d0 70 70 50 61 67 65 20 20 20 20 20 20 20 20 20 20  ppPage          
275e0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
275f0 41 63 71 75 69 72 65 64 20 70 61 67 65 20 6f 62  Acquired page ob
27600 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 50 67 48  ject */.){.  PgH
27610 64 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  dr *p;          
27620 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27630 4d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 70 61  Memory mapped pa
27640 67 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ge to return */.
27650 20 20 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d    .  if( pPager-
27660 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 29  >pMmapFreelist )
27670 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20  {.    *ppPage = 
27680 70 20 3d 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61  p = pPager->pMma
27690 70 46 72 65 65 6c 69 73 74 3b 0a 20 20 20 20 70  pFreelist;.    p
276a0 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65  Pager->pMmapFree
276b0 6c 69 73 74 20 3d 20 70 2d 3e 70 44 69 72 74 79  list = p->pDirty
276c0 3b 0a 20 20 20 20 70 2d 3e 70 44 69 72 74 79 20  ;.    p->pDirty 
276d0 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28  = 0;.    assert(
276e0 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 3e   pPager->nExtra>
276f0 3d 38 20 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74  =8 );.    memset
27700 28 70 2d 3e 70 45 78 74 72 61 2c 20 30 2c 20 38  (p->pExtra, 0, 8
27710 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
27720 2a 70 70 50 61 67 65 20 3d 20 70 20 3d 20 28 50  *ppPage = p = (P
27730 67 48 64 72 20 2a 29 73 71 6c 69 74 65 33 4d 61  gHdr *)sqlite3Ma
27740 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28  llocZero(sizeof(
27750 50 67 48 64 72 29 20 2b 20 70 50 61 67 65 72 2d  PgHdr) + pPager-
27760 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 69 66  >nExtra);.    if
27770 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( p==0 ){.      
27780 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68  sqlite3OsUnfetch
27790 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36  (pPager->fd, (i6
277a0 34 29 28 70 67 6e 6f 2d 31 29 20 2a 20 70 50 61  4)(pgno-1) * pPa
277b0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70  ger->pageSize, p
277c0 44 61 74 61 29 3b 0a 20 20 20 20 20 20 72 65 74  Data);.      ret
277d0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
277e0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
277f0 20 70 2d 3e 70 45 78 74 72 61 20 3d 20 28 76 6f   p->pExtra = (vo
27800 69 64 20 2a 29 26 70 5b 31 5d 3b 0a 20 20 20 20  id *)&p[1];.    
27810 70 2d 3e 66 6c 61 67 73 20 3d 20 50 47 48 44 52  p->flags = PGHDR
27820 5f 4d 4d 41 50 3b 0a 20 20 20 20 70 2d 3e 6e 52  _MMAP;.    p->nR
27830 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 2d 3e 70  ef = 1;.    p->p
27840 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a  Pager = pPager;.
27850 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70    }..  assert( p
27860 2d 3e 70 45 78 74 72 61 3d 3d 28 76 6f 69 64 20  ->pExtra==(void 
27870 2a 29 26 70 5b 31 5d 20 29 3b 0a 20 20 61 73 73  *)&p[1] );.  ass
27880 65 72 74 28 20 70 2d 3e 70 50 61 67 65 3d 3d 30  ert( p->pPage==0
27890 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
278a0 3e 66 6c 61 67 73 3d 3d 50 47 48 44 52 5f 4d 4d  >flags==PGHDR_MM
278b0 41 50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  AP );.  assert( 
278c0 70 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65  p->pPager==pPage
278d0 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
278e0 2d 3e 6e 52 65 66 3d 3d 31 20 29 3b 0a 0a 20 20  ->nRef==1 );..  
278f0 70 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a  p->pgno = pgno;.
27900 20 20 70 2d 3e 70 44 61 74 61 20 3d 20 70 44 61    p->pData = pDa
27910 74 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 4d  ta;.  pPager->nM
27920 6d 61 70 4f 75 74 2b 2b 3b 0a 0a 20 20 72 65 74  mapOut++;..  ret
27930 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
27940 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
27950 65 6c 65 61 73 65 20 61 20 72 65 66 65 72 65 6e  elease a referen
27960 63 65 20 74 6f 20 70 61 67 65 20 70 50 67 2e 20  ce to page pPg. 
27970 70 50 67 20 6d 75 73 74 20 68 61 76 65 20 62 65  pPg must have be
27980 65 6e 20 72 65 74 75 72 6e 65 64 20 62 79 20 61  en returned by a
27990 6e 20 0a 2a 2a 20 65 61 72 6c 69 65 72 20 63 61  n .** earlier ca
279a0 6c 6c 20 74 6f 20 70 61 67 65 72 41 63 71 75 69  ll to pagerAcqui
279b0 72 65 4d 61 70 50 61 67 65 28 29 2e 0a 2a 2f 0a  reMapPage()..*/.
279c0 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
279d0 72 52 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28  rReleaseMapPage(
279e0 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
279f0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
27a00 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 70 50  Pg->pPager;.  pP
27a10 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2d 2d  ager->nMmapOut--
27a20 3b 0a 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20  ;.  pPg->pDirty 
27a30 3d 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46  = pPager->pMmapF
27a40 72 65 65 6c 69 73 74 3b 0a 20 20 70 50 61 67 65  reelist;.  pPage
27a50 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74  r->pMmapFreelist
27a60 20 3d 20 70 50 67 3b 0a 0a 20 20 61 73 73 65 72   = pPg;..  asser
27a70 74 28 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  t( pPager->fd->p
27a80 4d 65 74 68 6f 64 73 2d 3e 69 56 65 72 73 69 6f  Methods->iVersio
27a90 6e 3e 3d 33 20 29 3b 0a 20 20 73 71 6c 69 74 65  n>=3 );.  sqlite
27aa0 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65  3OsUnfetch(pPage
27ab0 72 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 50 67  r->fd, (i64)(pPg
27ac0 2d 3e 70 67 6e 6f 2d 31 29 2a 70 50 61 67 65 72  ->pgno-1)*pPager
27ad0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 50 67 2d  ->pageSize, pPg-
27ae0 3e 70 44 61 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  >pData);.}../*.*
27af0 2a 20 46 72 65 65 20 61 6c 6c 20 50 67 48 64 72  * Free all PgHdr
27b00 20 6f 62 6a 65 63 74 73 20 73 74 6f 72 65 64 20   objects stored 
27b10 69 6e 20 74 68 65 20 50 61 67 65 72 2e 70 4d 6d  in the Pager.pMm
27b20 61 70 46 72 65 65 6c 69 73 74 20 6c 69 73 74 2e  apFreelist list.
27b30 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
27b40 70 61 67 65 72 46 72 65 65 4d 61 70 48 64 72 73  pagerFreeMapHdrs
27b50 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
27b60 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 50  .  PgHdr *p;.  P
27b70 67 48 64 72 20 2a 70 4e 65 78 74 3b 0a 20 20 66  gHdr *pNext;.  f
27b80 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 4d 6d  or(p=pPager->pMm
27b90 61 70 46 72 65 65 6c 69 73 74 3b 20 70 3b 20 70  apFreelist; p; p
27ba0 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65  =pNext){.    pNe
27bb0 78 74 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a  xt = p->pDirty;.
27bc0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
27bd0 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 56  (p);.  }.}../* V
27be0 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 64  erify that the d
27bf0 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
27c00 20 6e 6f 74 20 62 65 20 64 65 6c 65 74 65 64 20   not be deleted 
27c10 6f 72 20 72 65 6e 61 6d 65 64 20 6f 75 74 20 66  or renamed out f
27c20 72 6f 6d 0a 2a 2a 20 75 6e 64 65 72 20 74 68 65  rom.** under the
27c30 20 70 61 67 65 72 2e 20 20 52 65 74 75 72 6e 20   pager.  Return 
27c40 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 65  SQLITE_OK if the
27c50 20 64 61 74 61 62 61 73 65 20 69 73 20 73 74 69   database is sti
27c60 6c 6c 20 77 68 65 72 65 20 69 74 20 6f 75 67 68  ll where it ough
27c70 74 0a 2a 2a 20 74 6f 20 62 65 20 6f 6e 20 64 69  t.** to be on di
27c80 73 6b 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d  sk.  Return non-
27c90 7a 65 72 6f 20 28 53 51 4c 49 54 45 5f 52 45 41  zero (SQLITE_REA
27ca0 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 20 6f 72  DONLY_DBMOVED or
27cb0 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f   some other erro
27cc0 72 0a 2a 2a 20 63 6f 64 65 20 66 72 6f 6d 20 73  r.** code from s
27cd0 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29  qlite3OsAccess()
27ce0 29 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  ) if the databas
27cf0 65 20 68 61 73 20 67 6f 6e 65 20 6d 69 73 73 69  e has gone missi
27d00 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
27d10 74 20 64 61 74 61 62 61 73 65 49 73 55 6e 6d 6f  t databaseIsUnmo
27d20 76 65 64 28 50 61 67 65 72 20 2a 70 50 61 67 65  ved(Pager *pPage
27d30 72 29 7b 0a 20 20 69 6e 74 20 62 48 61 73 4d 6f  r){.  int bHasMo
27d40 76 65 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  ved = 0;.  int r
27d50 63 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  c;..  if( pPager
27d60 2d 3e 74 65 6d 70 46 69 6c 65 20 29 20 72 65 74  ->tempFile ) ret
27d70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
27d80 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
27d90 69 7a 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ize==0 ) return 
27da0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
27db0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 7a 46 69  ert( pPager->zFi
27dc0 6c 65 6e 61 6d 65 20 26 26 20 70 50 61 67 65 72  lename && pPager
27dd0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29  ->zFilename[0] )
27de0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
27df0 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50  OsFileControl(pP
27e00 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45  ager->fd, SQLITE
27e10 5f 46 43 4e 54 4c 5f 48 41 53 5f 4d 4f 56 45 44  _FCNTL_HAS_MOVED
27e20 2c 20 26 62 48 61 73 4d 6f 76 65 64 29 3b 0a 20  , &bHasMoved);. 
27e30 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
27e40 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20  NOTFOUND ){.    
27e50 2f 2a 20 49 66 20 74 68 65 20 48 41 53 5f 4d 4f  /* If the HAS_MO
27e60 56 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c  VED file-control
27e70 20 69 73 20 75 6e 69 6d 70 6c 65 6d 65 6e 74 65   is unimplemente
27e80 64 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  d, assume that t
27e90 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 68  he file.    ** h
27ea0 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 76 65  as not been move
27eb0 64 2e 20 20 54 68 61 74 20 69 73 20 74 68 65 20  d.  That is the 
27ec0 68 69 73 74 6f 72 69 63 61 6c 20 62 65 68 61 76  historical behav
27ed0 69 6f 72 20 6f 66 20 53 51 4c 69 74 65 3a 20 70  ior of SQLite: p
27ee0 72 69 6f 72 20 74 6f 0a 20 20 20 20 2a 2a 20 76  rior to.    ** v
27ef0 65 72 73 69 6f 6e 20 33 2e 38 2e 33 2c 20 69 74  ersion 3.8.3, it
27f00 20 6e 65 76 65 72 20 63 68 65 63 6b 65 64 20 2a   never checked *
27f10 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  /.    rc = SQLIT
27f20 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  E_OK;.  }else if
27f30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
27f40 26 26 20 62 48 61 73 4d 6f 76 65 64 20 29 7b 0a  && bHasMoved ){.
27f50 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
27f60 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44  READONLY_DBMOVED
27f70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
27f80 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 68 75  c;.}.../*.** Shu
27f90 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63  tdown the page c
27fa0 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20  ache.  Free all 
27fb0 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65  memory and close
27fc0 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a   all files..**.*
27fd0 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  * If a transacti
27fe0 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65  on was in progre
27ff0 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ss when this rou
28000 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
28010 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  that.** transact
28020 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
28030 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e  ck.  All outstan
28040 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69  ding pages are i
28050 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e  nvalidated.** an
28060 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69  d their memory i
28070 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74  s freed.  Any at
28080 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70  tempt to use a p
28090 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  age associated.*
280a0 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65  * with this page
280b0 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69   cache after thi
280c0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
280d0 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a  ns will likely.*
280e0 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f  * result in a co
280f0 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  redump..**.** Th
28100 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61  is function alwa
28110 79 73 20 73 75 63 63 65 65 64 73 2e 20 49 66 20  ys succeeds. If 
28120 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
28130 20 61 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d   active an attem
28140 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f  pt.** is made to
28150 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49   roll it back. I
28160 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
28170 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c  s during the rol
28180 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20  lback .** a hot 
28190 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c  journal may be l
281a0 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73  eft in the files
281b0 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72  ystem but no err
281c0 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  or is returned.*
281d0 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  * to the caller.
281e0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
281f0 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72 20  agerClose(Pager 
28200 2a 70 50 61 67 65 72 2c 20 73 71 6c 69 74 65 33  *pPager, sqlite3
28210 20 2a 64 62 29 7b 0a 20 20 75 38 20 2a 70 54 6d   *db){.  u8 *pTm
28220 70 20 3d 20 28 75 38 2a 29 70 50 61 67 65 72 2d  p = (u8*)pPager-
28230 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 61 73  >pTmpSpace;.  as
28240 73 65 72 74 28 20 64 62 20 7c 7c 20 70 61 67 65  sert( db || page
28250 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d  rUseWal(pPager)=
28260 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
28270 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
28280 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
28290 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
282a0 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
282b0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
282c0 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 70  ignMalloc();.  p
282d0 61 67 65 72 46 72 65 65 4d 61 70 48 64 72 73 28  agerFreeMapHdrs(
282e0 70 50 61 67 65 72 29 3b 0a 20 20 2f 2a 20 70 50  pPager);.  /* pP
282f0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20  ager->errCode = 
28300 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
28310 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
28320 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
28330 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 7b 0a 20  E_OMIT_WAL.  {. 
28340 20 20 20 75 38 20 2a 61 20 3d 20 30 3b 0a 20 20     u8 *a = 0;.  
28350 20 20 61 73 73 65 72 74 28 20 64 62 20 7c 7c 20    assert( db || 
28360 70 50 61 67 65 72 2d 3e 70 57 61 6c 3d 3d 30 20  pPager->pWal==0 
28370 29 3b 0a 20 20 20 20 69 66 28 20 64 62 20 26 26  );.    if( db &&
28380 20 30 3d 3d 28 64 62 2d 3e 66 6c 61 67 73 20 26   0==(db->flags &
28390 20 53 51 4c 49 54 45 5f 4e 6f 43 6b 70 74 4f 6e   SQLITE_NoCkptOn
283a0 43 6c 6f 73 65 29 20 0a 20 20 20 20 20 26 26 20  Close) .     && 
283b0 53 51 4c 49 54 45 5f 4f 4b 3d 3d 64 61 74 61 62  SQLITE_OK==datab
283c0 61 73 65 49 73 55 6e 6d 6f 76 65 64 28 70 50 61  aseIsUnmoved(pPa
283d0 67 65 72 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  ger).    ){.    
283e0 20 20 61 20 3d 20 70 54 6d 70 3b 0a 20 20 20 20    a = pTmp;.    
283f0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c  }.    sqlite3Wal
28400 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 57  Close(pPager->pW
28410 61 6c 2c 20 64 62 2c 20 70 50 61 67 65 72 2d 3e  al, db, pPager->
28420 77 61 6c 53 79 6e 63 46 6c 61 67 73 2c 20 70 50  walSyncFlags, pP
28430 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 61  ager->pageSize,a
28440 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  );.    pPager->p
28450 57 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e  Wal = 0;.  }.#en
28460 64 69 66 0a 20 20 70 61 67 65 72 5f 72 65 73 65  dif.  pager_rese
28470 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  t(pPager);.  if(
28480 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 61   MEMDB ){.    pa
28490 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65  ger_unlock(pPage
284a0 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
284b0 20 2f 2a 20 49 66 20 69 74 20 69 73 20 6f 70 65   /* If it is ope
284c0 6e 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  n, sync the jour
284d0 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20  nal file before 
284e0 63 61 6c 6c 69 6e 67 20 55 6e 6c 6f 63 6b 41 6e  calling UnlockAn
284f0 64 52 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 2a  dRollback..    *
28500 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74  * If this is not
28510 20 64 6f 6e 65 2c 20 74 68 65 6e 20 61 6e 20 75   done, then an u
28520 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20  nsynced portion 
28530 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72  of the open jour
28540 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65  nal .    ** file
28550 20 6d 61 79 20 62 65 20 70 6c 61 79 65 64 20 62   may be played b
28560 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ack into the dat
28570 61 62 61 73 65 2e 20 49 66 20 61 20 70 6f 77 65  abase. If a powe
28580 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  r failure occurs
28590 20 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65 20 74   .    ** while t
285a0 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67  his is happening
285b0 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  , the database c
285c0 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72 72  ould become corr
285d0 75 70 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  upt..    **.    
285e0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
285f0 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69  ccurs while tryi
28600 6e 67 20 74 6f 20 73 79 6e 63 20 74 68 65 20 6a  ng to sync the j
28610 6f 75 72 6e 61 6c 2c 20 73 68 69 66 74 20 74 68  ournal, shift th
28620 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 69  e pager.    ** i
28630 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74  nto the ERROR st
28640 61 74 65 2e 20 54 68 69 73 20 63 61 75 73 65 73  ate. This causes
28650 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61   UnlockAndRollba
28660 63 6b 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65  ck to unlock the
28670 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
28680 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 6a   and close the j
28690 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 74 68  ournal file with
286a0 6f 75 74 20 61 74 74 65 6d 70 74 69 6e 67 20 74  out attempting t
286b0 6f 20 72 6f 6c 6c 20 69 74 0a 20 20 20 20 2a 2a  o roll it.    **
286c0 20 62 61 63 6b 20 6f 72 20 66 69 6e 61 6c 69 7a   back or finaliz
286d0 65 20 69 74 2e 20 54 68 65 20 6e 65 78 74 20 64  e it. The next d
286e0 61 74 61 62 61 73 65 20 75 73 65 72 20 77 69 6c  atabase user wil
286f0 6c 20 68 61 76 65 20 74 6f 20 64 6f 20 68 6f 74  l have to do hot
28700 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20  -journal.    ** 
28710 72 6f 6c 6c 62 61 63 6b 20 62 65 66 6f 72 65 20  rollback before 
28720 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 64 61  accessing the da
28730 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
28740 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 4f 70   */.    if( isOp
28750 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
28760 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65  ){.      pager_e
28770 72 72 6f 72 28 70 50 61 67 65 72 2c 20 70 61 67  rror(pPager, pag
28780 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c  erSyncHotJournal
28790 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d  (pPager));.    }
287a0 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b  .    pagerUnlock
287b0 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  AndRollback(pPag
287c0 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  er);.  }.  sqlit
287d0 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
287e0 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69  c();.  enable_si
287f0 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
28800 73 28 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43  s();.  PAGERTRAC
28810 45 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c  E(("CLOSE %d\n",
28820 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
28830 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  ));.  IOTRACE(("
28840 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50 61  CLOSE %p\n", pPa
28850 67 65 72 29 29 0a 20 20 73 71 6c 69 74 65 33 4f  ger)).  sqlite3O
28860 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
28870 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73  fd);.  sqlite3Os
28880 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64  Close(pPager->fd
28890 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
288a0 46 72 65 65 28 70 54 6d 70 29 3b 0a 20 20 73 71  Free(pTmp);.  sq
288b0 6c 69 74 65 33 50 63 61 63 68 65 43 6c 6f 73 65  lite3PcacheClose
288c0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
288d0 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  );..#ifdef SQLIT
288e0 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66  E_HAS_CODEC.  if
288f0 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63  ( pPager->xCodec
28900 46 72 65 65 20 29 20 70 50 61 67 65 72 2d 3e 78  Free ) pPager->x
28910 43 6f 64 65 63 46 72 65 65 28 70 50 61 67 65 72  CodecFree(pPager
28920 2d 3e 70 43 6f 64 65 63 29 3b 0a 23 65 6e 64 69  ->pCodec);.#endi
28930 66 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  f..  assert( !pP
28940 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
28950 20 26 26 20 21 70 50 61 67 65 72 2d 3e 70 49 6e   && !pPager->pIn
28960 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73  Journal );.  ass
28970 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61  ert( !isOpen(pPa
28980 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 21 69 73  ger->jfd) && !is
28990 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66  Open(pPager->sjf
289a0 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  d) );..  sqlite3
289b0 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20  _free(pPager);. 
289c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
289d0 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  K;.}..#if !defin
289e0 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64 65  ed(NDEBUG) || de
289f0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
28a00 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  T)./*.** Return 
28a10 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
28a20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f  for page pPg..*/
28a30 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61 67  .Pgno sqlite3Pag
28a40 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62 50  erPagenumber(DbP
28a50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74  age *pPg){.  ret
28a60 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 7d  urn pPg->pgno;.}
28a70 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
28a80 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ncrement the ref
28a90 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72  erence count for
28aa0 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 76 6f   page pPg..*/.vo
28ab0 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  id sqlite3PagerR
28ac0 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ef(DbPage *pPg){
28ad0 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
28ae0 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a  Ref(pPg);.}../*.
28af0 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72  ** Sync the jour
28b00 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f  nal. In other wo
28b10 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61  rds, make sure a
28b20 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74 68 61  ll the pages tha
28b30 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77  t have.** been w
28b40 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
28b50 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61  urnal have actua
28b60 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68 65 20  lly reached the 
28b70 73 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a  surface of the.*
28b80 2a 20 64 69 73 6b 20 61 6e 64 20 63 61 6e 20 62  * disk and can b
28b90 65 20 72 65 73 74 6f 72 65 64 20 69 6e 20 74 68  e restored in th
28ba0 65 20 65 76 65 6e 74 20 6f 66 20 61 20 68 6f 74  e event of a hot
28bb0 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
28bc0 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
28bd0 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66 6c 61  Pager.noSync fla
28be0 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74  g is set, then t
28bf0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
28c00 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 68 65  a no-op..** Othe
28c10 72 77 69 73 65 2c 20 74 68 65 20 61 63 74 69 6f  rwise, the actio
28c20 6e 73 20 72 65 71 75 69 72 65 64 20 64 65 70 65  ns required depe
28c30 6e 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  nd on the journa
28c40 6c 2d 6d 6f 64 65 20 61 6e 64 20 74 68 65 20 0a  l-mode and the .
28c50 2a 2a 20 64 65 76 69 63 65 20 63 68 61 72 61 63  ** device charac
28c60 74 65 72 69 73 74 69 63 73 20 6f 66 20 74 68 65  teristics of the
28c70 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 61 73   file-system, as
28c80 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
28c90 20 20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e    * If the journ
28ca0 61 6c 20 66 69 6c 65 20 69 73 20 61 6e 20 69 6e  al file is an in
28cb0 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20  -memory journal 
28cc0 66 69 6c 65 2c 20 6e 6f 20 61 63 74 69 6f 6e 20  file, no action 
28cd0 6e 65 65 64 0a 2a 2a 20 20 20 20 20 62 65 20 74  need.**     be t
28ce0 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  aken..**.**   * 
28cf0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
28d00 65 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f  e device does no
28d10 74 20 73 75 70 70 6f 72 74 20 74 68 65 20 53 41  t support the SA
28d20 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72  FE_APPEND proper
28d30 74 79 2c 0a 2a 2a 20 20 20 20 20 74 68 65 6e 20  ty,.**     then 
28d40 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 6f  the nRec field o
28d50 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
28d60 74 6c 79 20 77 72 69 74 74 65 6e 20 6a 6f 75 72  tly written jour
28d70 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 20 20  nal header.**   
28d80 20 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20    is updated to 
28d90 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62  contain the numb
28da0 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 72 65  er of journal re
28db0 63 6f 72 64 73 20 74 68 61 74 20 68 61 76 65 0a  cords that have.
28dc0 2a 2a 20 20 20 20 20 62 65 65 6e 20 77 72 69 74  **     been writ
28dd0 74 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74  ten following it
28de0 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  . If the pager i
28df0 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 66  s operating in f
28e00 75 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20 20 20  ull-sync.**     
28e10 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a  mode, then the j
28e20 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73  ournal file is s
28e30 79 6e 63 65 64 20 62 65 66 6f 72 65 20 74 68 69  ynced before thi
28e40 73 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74  s field is updat
28e50 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66  ed..**.**   * If
28e60 20 74 68 65 20 64 65 76 69 63 65 20 64 6f 65 73   the device does
28e70 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65   not support the
28e80 20 53 45 51 55 45 4e 54 49 41 4c 20 70 72 6f 70   SEQUENTIAL prop
28e90 65 72 74 79 2c 20 74 68 65 6e 20 0a 2a 2a 20 20  erty, then .**  
28ea0 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
28eb0 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a  is synced..**.**
28ec0 20 4f 72 2c 20 69 6e 20 70 73 65 75 64 6f 2d 63   Or, in pseudo-c
28ed0 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28  ode:.**.**   if(
28ee0 20 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79 20   NOT <in-memory 
28ef0 6a 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20 20  journal> ){.**  
28f00 20 20 20 69 66 28 20 4e 4f 54 20 53 41 46 45 5f     if( NOT SAFE_
28f10 41 50 50 45 4e 44 20 29 7b 0a 2a 2a 20 20 20 20  APPEND ){.**    
28f20 20 20 20 69 66 28 20 3c 66 75 6c 6c 2d 73 79 6e     if( <full-syn
28f30 63 20 6d 6f 64 65 3e 20 29 20 78 53 79 6e 63 28  c mode> ) xSync(
28f40 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b  <journal file>);
28f50 0a 2a 2a 20 20 20 20 20 20 20 3c 75 70 64 61 74  .**       <updat
28f60 65 20 6e 52 65 63 20 66 69 65 6c 64 3e 0a 2a 2a  e nRec field>.**
28f70 20 20 20 20 20 7d 20 0a 2a 2a 20 20 20 20 20 69       } .**     i
28f80 66 28 20 4e 4f 54 20 53 45 51 55 45 4e 54 49 41  f( NOT SEQUENTIA
28f90 4c 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e  L ) xSync(<journ
28fa0 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20  al file>);.**   
28fb0 7d 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  }.**.** If succe
28fc0 73 73 66 75 6c 2c 20 74 68 69 73 20 72 6f 75 74  ssful, this rout
28fd0 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20 50  ine clears the P
28fe0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
28ff0 6c 61 67 20 6f 66 20 65 76 65 72 79 20 0a 2a 2a  lag of every .**
29000 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20   page currently 
29010 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 20 62  held in memory b
29020 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
29030 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e  SQLITE_OK. If an
29040 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 69 73 20   IO.** error is 
29050 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65  encountered, the
29060 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  n the IO error c
29070 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
29080 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  to the caller..*
29090 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e  /.static int syn
290a0 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  cJournal(Pager *
290b0 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 65 77 48  pPager, int newH
290c0 64 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  dr){.  int rc;  
290d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
290e0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
290f0 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65   code */..  asse
29100 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
29110 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
29120 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20  _CACHEMOD.      
29130 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
29140 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
29150 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73  _DBMOD.  );.  as
29160 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
29170 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
29180 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
29190 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
291a0 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71  r) );..  rc = sq
291b0 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c 75 73  lite3PagerExclus
291c0 69 76 65 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b  iveLock(pPager);
291d0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
291e0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
291f0 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  ;..  if( !pPager
29200 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
29210 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
29220 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20  >tempFile );.   
29230 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
29240 65 72 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67  er->jfd) && pPag
29250 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21  er->journalMode!
29260 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
29270 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20  DE_MEMORY ){.   
29280 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 63     const int iDc
29290 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69   = sqlite3OsDevi
292a0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
292b0 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  s(pPager->fd);. 
292c0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f       assert( isO
292d0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
292e0 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 30   );..      if( 0
292f0 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f  ==(iDc&SQLITE_IO
29300 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29  CAP_SAFE_APPEND)
29310 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
29320 68 69 73 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20  his block deals 
29330 77 69 74 68 20 61 6e 20 6f 62 73 63 75 72 65 20  with an obscure 
29340 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74 68 65 20  problem. If the 
29350 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  last connection.
29360 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
29370 77 72 6f 74 65 20 74 6f 20 74 68 69 73 20 64 61  wrote to this da
29380 74 61 62 61 73 65 20 77 61 73 20 6f 70 65 72 61  tabase was opera
29390 74 69 6e 67 20 69 6e 20 70 65 72 73 69 73 74 65  ting in persiste
293a0 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  nt-journal.     
293b0 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e     ** mode, then
293c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
293d0 65 20 6d 61 79 20 61 74 20 74 68 69 73 20 70 6f  e may at this po
293e0 69 6e 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20  int actually be 
293f0 6c 61 72 67 65 72 0a 20 20 20 20 20 20 20 20 2a  larger.        *
29400 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 6a 6f 75  * than Pager.jou
29410 72 6e 61 6c 4f 66 66 20 62 79 74 65 73 2e 20 49  rnalOff bytes. I
29420 66 20 74 68 65 20 6e 65 78 74 20 74 68 69 6e 67  f the next thing
29430 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
29440 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20          ** file 
29450 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20  happens to be a 
29460 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 28  journal-header (
29470 77 72 69 74 74 65 6e 20 61 73 20 70 61 72 74 20  written as part 
29480 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  of the.        *
29490 2a 20 70 72 65 76 69 6f 75 73 20 63 6f 6e 6e 65  * previous conne
294a0 63 74 69 6f 6e 27 73 20 74 72 61 6e 73 61 63 74  ction's transact
294b0 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63 72 61 73  ion), and a cras
294c0 68 20 6f 72 20 70 6f 77 65 72 2d 66 61 69 6c 75  h or power-failu
294d0 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  re .        ** o
294e0 63 63 75 72 73 20 61 66 74 65 72 20 6e 52 65 63  ccurs after nRec
294f0 20 69 73 20 75 70 64 61 74 65 64 20 62 75 74 20   is updated but 
29500 62 65 66 6f 72 65 20 74 68 69 73 20 63 6f 6e 6e  before this conn
29510 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20 0a 20  ection writes . 
29520 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 74 68 69         ** anythi
29530 6e 67 20 65 6c 73 65 20 74 6f 20 74 68 65 20 6a  ng else to the j
29540 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20  ournal file (or 
29550 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20 62 61  commits/rolls ba
29560 63 6b 20 69 74 73 20 0a 20 20 20 20 20 20 20 20  ck its .        
29570 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c  ** transaction),
29580 20 74 68 65 6e 20 53 51 4c 69 74 65 20 6d 61 79   then SQLite may
29590 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75 73 65 64   become confused
295a0 20 77 68 65 6e 20 64 6f 69 6e 67 20 74 68 65 20   when doing the 
295b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d  .        ** hot-
295c0 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
295d0 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 63 6f 76   following recov
295e0 65 72 79 2e 20 49 74 20 6d 61 79 20 72 6f 6c 6c  ery. It may roll
295f0 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20 20 20 20   back all.      
29600 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 63 6f 6e    ** of this con
29610 6e 65 63 74 69 6f 6e 73 20 64 61 74 61 2c 20 74  nections data, t
29620 68 65 6e 20 70 72 6f 63 65 65 64 20 74 6f 20 72  hen proceed to r
29630 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74 68 65 20  olling back the 
29640 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  old,.        ** 
29650 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64 61 74 61  out-of-date data
29660 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69 74   that follows it
29670 2e 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75  . Database corru
29680 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a  ption..        *
29690 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 6f 20  *.        ** To 
296a0 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73  work around this
296b0 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  , if the journal
296c0 20 66 69 6c 65 20 64 6f 65 73 20 61 70 70 65 61   file does appea
296d0 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20  r to contain.   
296e0 20 20 20 20 20 2a 2a 20 61 20 76 61 6c 69 64 20       ** a valid 
296f0 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77 69 6e 67  header following
29700 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
29710 66 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61 20  f, then write a 
29720 30 78 30 30 0a 20 20 20 20 20 20 20 20 2a 2a 20  0x00.        ** 
29730 62 79 74 65 20 74 6f 20 74 68 65 20 73 74 61 72  byte to the star
29740 74 20 6f 66 20 69 74 20 74 6f 20 70 72 65 76 65  t of it to preve
29750 6e 74 20 69 74 20 66 72 6f 6d 20 62 65 69 6e 67  nt it from being
29760 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a 20 20 20   recognized..   
29770 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
29780 2a 2a 20 56 61 72 69 61 62 6c 65 20 69 4e 65 78  ** Variable iNex
29790 74 48 64 72 4f 66 66 73 65 74 20 69 73 20 73 65  tHdrOffset is se
297a0 74 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20  t to the offset 
297b0 61 74 20 77 68 69 63 68 20 74 68 69 73 0a 20 20  at which this.  
297c0 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d        ** problem
297d0 61 74 69 63 20 68 65 61 64 65 72 20 77 69 6c 6c  atic header will
297e0 20 6f 63 63 75 72 2c 20 69 66 20 69 74 20 65 78   occur, if it ex
297f0 69 73 74 73 2e 20 61 4d 61 67 69 63 20 69 73 20  ists. aMagic is 
29800 75 73 65 64 20 0a 20 20 20 20 20 20 20 20 2a 2a  used .        **
29810 20 61 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   as a temporary 
29820 62 75 66 66 65 72 20 74 6f 20 69 6e 73 70 65 63  buffer to inspec
29830 74 20 74 68 65 20 66 69 72 73 74 20 63 6f 75 70  t the first coup
29840 6c 65 20 6f 66 20 62 79 74 65 73 20 6f 66 0a 20  le of bytes of. 
29850 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6f         ** the po
29860 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e 61 6c 20  tential journal 
29870 68 65 61 64 65 72 2e 0a 20 20 20 20 20 20 20 20  header..        
29880 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20 69  */.        i64 i
29890 4e 65 78 74 48 64 72 4f 66 66 73 65 74 3b 0a 20  NextHdrOffset;. 
298a0 20 20 20 20 20 20 20 75 38 20 61 4d 61 67 69 63         u8 aMagic
298b0 5b 38 5d 3b 0a 20 20 20 20 20 20 20 20 75 38 20  [8];.        u8 
298c0 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
298d0 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d  JournalMagic)+4]
298e0 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ;..        memcp
298f0 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72  y(zHeader, aJour
29900 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
29910 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
29920 3b 0a 20 20 20 20 20 20 20 20 70 75 74 33 32 62  ;.        put32b
29930 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
29940 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
29950 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65  c)], pPager->nRe
29960 63 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 4e 65  c);..        iNe
29970 78 74 48 64 72 4f 66 66 73 65 74 20 3d 20 6a 6f  xtHdrOffset = jo
29980 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
29990 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
299a0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
299b0 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ad(pPager->jfd, 
299c0 61 4d 61 67 69 63 2c 20 38 2c 20 69 4e 65 78 74  aMagic, 8, iNext
299d0 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  HdrOffset);.    
299e0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
299f0 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65 6d 63  TE_OK && 0==memc
29a00 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72  mp(aMagic, aJour
29a10 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 7b 0a  nalMagic, 8) ){.
29a20 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63            static
29a30 20 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f 62 79   const u8 zeroby
29a40 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  te = 0;.        
29a50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
29a60 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
29a70 64 2c 20 26 7a 65 72 6f 62 79 74 65 2c 20 31 2c  d, &zerobyte, 1,
29a80 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29   iNextHdrOffset)
29a90 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
29aa0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
29ab0 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c  TE_OK && rc!=SQL
29ac0 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
29ad0 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20  READ ){.        
29ae0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
29af0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
29b00 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65  /* Write the nRe
29b10 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65  c value into the
29b20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65   journal file he
29b30 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20  ader. If in.    
29b40 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63      ** full-sync
29b50 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79  hronous mode, sy
29b60 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
29b70 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72  irst. This ensur
29b80 65 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  es that.        
29b90 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20  ** all data has 
29ba0 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64  really hit the d
29bb0 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20  isk before nRec 
29bc0 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61  is updated to ma
29bd0 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74  rk.        ** it
29be0 20 61 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   as a candidate 
29bf0 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20  for rollback..  
29c00 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
29c10 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20   ** This is not 
29c20 72 65 71 75 69 72 65 64 20 69 66 20 74 68 65 20  required if the 
29c30 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61  persistent media
29c40 20 73 75 70 70 6f 72 74 73 20 74 68 65 0a 20 20   supports the.  
29c50 20 20 20 20 20 20 2a 2a 20 53 41 46 45 5f 41 50        ** SAFE_AP
29c60 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2e 20 42  PEND property. B
29c70 65 63 61 75 73 65 20 69 6e 20 74 68 69 73 20 63  ecause in this c
29c80 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  ase it is not po
29c90 73 73 69 62 6c 65 20 0a 20 20 20 20 20 20 20 20  ssible .        
29ca0 2a 2a 20 66 6f 72 20 67 61 72 62 61 67 65 20 64  ** for garbage d
29cb0 61 74 61 20 74 6f 20 62 65 20 61 70 70 65 6e 64  ata to be append
29cc0 65 64 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 20  ed to the file, 
29cd0 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 20  the nRec field. 
29ce0 20 20 20 20 20 20 20 2a 2a 20 69 73 20 70 6f 70         ** is pop
29cf0 75 6c 61 74 65 64 20 77 69 74 68 20 30 78 46 46  ulated with 0xFF
29d00 46 46 46 46 46 46 20 77 68 65 6e 20 74 68 65 20  FFFFFF when the 
29d10 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
29d20 73 20 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20  s written.      
29d30 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e    ** and never n
29d40 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74  eeds to be updat
29d50 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ed..        */. 
29d60 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
29d70 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 30  r->fullSync && 0
29d80 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f  ==(iDc&SQLITE_IO
29d90 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20  CAP_SEQUENTIAL) 
29da0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47  ){.          PAG
29db0 45 52 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a  ERTRACE(("SYNC j
29dc0 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c  ournal of %d\n",
29dd0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
29de0 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f  ));.          IO
29df0 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70  TRACE(("JSYNC %p
29e00 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
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 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
29e30 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
29e40 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20 20  syncFlags);.    
29e50 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
29e60 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
29e70 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
29e80 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
29e90 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 5c 6e 22  "JHDR %p %lld\n"
29ea0 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  , pPager, pPager
29eb0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 29 3b 0a  ->journalHdr));.
29ec0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
29ed0 69 74 65 33 4f 73 57 72 69 74 65 28 0a 20 20 20  ite3OsWrite(.   
29ee0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
29ef0 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 73  >jfd, zHeader, s
29f00 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29 2c 20  izeof(zHeader), 
29f10 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
29f20 64 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  dr.        );.  
29f30 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
29f40 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
29f50 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
29f60 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53     if( 0==(iDc&S
29f70 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
29f80 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20  ENTIAL) ){.     
29f90 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
29fa0 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20  SYNC journal of 
29fb0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
29fc0 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20  Pager)));.      
29fd0 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e    IOTRACE(("JSYN
29fe0 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  C %p\n", pPager)
29ff0 29 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ).        rc = s
2a000 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
2a010 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
2a020 2d 3e 73 79 6e 63 46 6c 61 67 73 7c 20 0a 20 20  ->syncFlags| .  
2a030 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d          (pPager-
2a040 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 53 51 4c 49  >syncFlags==SQLI
2a050 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c  TE_SYNC_FULL?SQL
2a060 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c  ITE_SYNC_DATAONL
2a070 59 3a 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  Y:0).        );.
2a080 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
2a090 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
2a0a0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a  rn rc;.      }..
2a0b0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
2a0c0 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65  urnalHdr = pPage
2a0d0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
2a0e0 20 20 20 20 20 69 66 28 20 6e 65 77 48 64 72 20       if( newHdr 
2a0f0 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  && 0==(iDc&SQLIT
2a100 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
2a110 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20  END) ){.        
2a120 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
2a130 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ;.        rc = w
2a140 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70  riteJournalHdr(p
2a150 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
2a160 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2a170 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
2a180 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
2a190 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
2a1a0 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61  journalHdr = pPa
2a1b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
2a1c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
2a1d0 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65   Unless the page
2a1e0 72 20 69 73 20 69 6e 20 6e 6f 53 79 6e 63 20 6d  r is in noSync m
2a1f0 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ode, the journal
2a200 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74 20 0a   file was just .
2a210 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c    ** successfull
2a220 79 20 73 79 6e 63 65 64 2e 20 45 69 74 68 65 72  y synced. Either
2a230 20 77 61 79 2c 20 63 6c 65 61 72 20 74 68 65 20   way, clear the 
2a240 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
2a250 66 6c 61 67 20 6f 6e 20 0a 20 20 2a 2a 20 61 6c  flag on .  ** al
2a260 6c 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20  l pages..  */.  
2a270 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65  sqlite3PcacheCle
2a280 61 72 53 79 6e 63 46 6c 61 67 73 28 70 50 61 67  arSyncFlags(pPag
2a290 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
2a2a0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
2a2b0 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42   PAGER_WRITER_DB
2a2c0 4d 4f 44 3b 0a 20 20 61 73 73 65 72 74 28 20 61  MOD;.  assert( a
2a2d0 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
2a2e0 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72  e(pPager) );.  r
2a2f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2a300 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72  .}../*.** The ar
2a310 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69  gument is the fi
2a320 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b 65 64 20  rst in a linked 
2a330 6c 69 73 74 20 6f 66 20 64 69 72 74 79 20 70 61  list of dirty pa
2a340 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a  ges connected.**
2a350 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44   by the PgHdr.pD
2a360 69 72 74 79 20 70 6f 69 6e 74 65 72 2e 20 54 68  irty pointer. Th
2a370 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74  is function writ
2a380 65 73 20 65 61 63 68 20 6f 6e 65 20 6f 66 20 74  es each one of t
2a390 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20  he.** in-memory 
2a3a0 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73  pages in the lis
2a3b0 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
2a3c0 65 20 66 69 6c 65 2e 20 54 68 65 20 61 72 67 75  e file. The argu
2a3d0 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62 65 20 4e  ment may.** be N
2a3e0 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e 74 69 6e  ULL, representin
2a3f0 67 20 61 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e  g an empty list.
2a400 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
2a410 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a  is function is.*
2a420 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  * a no-op..**.**
2a430 20 54 68 65 20 70 61 67 65 72 20 6d 75 73 74 20   The pager must 
2a440 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 61 20  hold at least a 
2a450 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 77 68  RESERVED lock wh
2a460 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
2a470 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 42  .** is called. B
2a480 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 61 6e  efore writing an
2a490 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61  ything to the da
2a4a0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69  tabase file, thi
2a4b0 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75 70 67  s lock.** is upg
2a4c0 72 61 64 65 64 20 74 6f 20 61 6e 20 45 58 43 4c  raded to an EXCL
2a4d0 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 74  USIVE lock. If t
2a4e0 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62  he lock cannot b
2a4f0 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a 20 53  e obtained,.** S
2a500 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
2a510 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20 64 61  turned and no da
2a520 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ta is written to
2a530 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a540 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68  le..** .** If th
2a550 65 20 70 61 67 65 72 20 69 73 20 61 20 74 65 6d  e pager is a tem
2a560 70 2d 66 69 6c 65 20 70 61 67 65 72 20 61 6e 64  p-file pager and
2a570 20 74 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65   the actual file
2a580 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a 2a 2a 20  -system file.** 
2a590 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 2c  is not yet open,
2a5a0 20 69 74 20 69 73 20 63 72 65 61 74 65 64 20 61   it is created a
2a5b0 6e 64 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65  nd opened before
2a5c0 20 61 6e 79 20 64 61 74 61 20 69 73 20 0a 2a 2a   any data is .**
2a5d0 20 77 72 69 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a   written out..**
2a5e0 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20 6c 6f 63  .** Once the loc
2a5f0 6b 20 68 61 73 20 62 65 65 6e 20 75 70 67 72 61  k has been upgra
2a600 64 65 64 20 61 6e 64 2c 20 69 66 20 6e 65 63 65  ded and, if nece
2a610 73 73 61 72 79 2c 20 74 68 65 20 66 69 6c 65 20  ssary, the file 
2a620 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68 65 20 70  opened,.** the p
2a630 61 67 65 73 20 61 72 65 20 77 72 69 74 74 65 6e  ages are written
2a640 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
2a650 62 61 73 65 20 66 69 6c 65 20 69 6e 20 6c 69 73  base file in lis
2a660 74 20 6f 72 64 65 72 2e 20 57 72 69 74 69 6e 67  t order. Writing
2a670 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 73 6b  .** a page is sk
2a680 69 70 70 65 64 20 69 66 20 69 74 20 6d 65 65 74  ipped if it meet
2a690 73 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  s either of the 
2a6a0 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72  following criter
2a6b0 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68  ia:.**.**   * Th
2a6c0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
2a6d0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 50 61   greater than Pa
2a6e0 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f 72 0a 2a  ger.dbSize, or.*
2a6f0 2a 20 20 20 2a 20 54 68 65 20 50 47 48 44 52 5f  *   * The PGHDR_
2a700 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 20  DONT_WRITE flag 
2a710 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20 70 61  is set on the pa
2a720 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 69  ge..**.** If wri
2a730 74 69 6e 67 20 6f 75 74 20 61 20 70 61 67 65 20  ting out a page 
2a740 63 61 75 73 65 73 20 74 68 65 20 64 61 74 61 62  causes the datab
2a750 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77  ase file to grow
2a760 2c 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69  , Pager.dbFileSi
2a770 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61 74 65 64  ze.** is updated
2a780 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66   accordingly. If
2a790 20 70 61 67 65 20 31 20 69 73 20 77 72 69 74 74   page 1 is writt
2a7a0 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20 74 68 65  en out, then the
2a7b0 20 76 61 6c 75 65 20 63 61 63 68 65 64 0a 2a 2a   value cached.**
2a7c0 20 69 6e 20 50 61 67 65 72 2e 64 62 46 69 6c 65   in Pager.dbFile
2a7d0 56 65 72 73 5b 5d 20 69 73 20 75 70 64 61 74 65  Vers[] is update
2a7e0 64 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 6e  d to match the n
2a7f0 65 77 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  ew value stored 
2a800 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  in.** the databa
2a810 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  se file..**.** I
2a820 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  f everything is 
2a830 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49  successful, SQLI
2a840 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
2a850 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
2a860 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 61 6e  r .** occurs, an
2a870 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
2a880 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20  s returned. Or, 
2a890 69 66 20 74 68 65 20 45 58 43 4c 55 53 49 56 45  if the EXCLUSIVE
2a8a0 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20   lock cannot.** 
2a8b0 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 53 51 4c  be obtained, SQL
2a8c0 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
2a8d0 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
2a8e0 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f  int pager_write_
2a8f0 70 61 67 65 6c 69 73 74 28 50 61 67 65 72 20 2a  pagelist(Pager *
2a900 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70  pPager, PgHdr *p
2a910 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  List){.  int rc 
2a920 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2a930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a940 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
2a950 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74  .  /* This funct
2a960 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ion is only call
2a970 65 64 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  ed for rollback 
2a980 70 61 67 65 72 73 20 69 6e 20 57 52 49 54 45 52  pagers in WRITER
2a990 5f 44 42 4d 4f 44 20 73 74 61 74 65 2e 20 2a 2f  _DBMOD state. */
2a9a0 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65  .  assert( !page
2a9b0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
2a9c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
2a9d0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c  ger->tempFile ||
2a9e0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
2a9f0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
2aa00 4d 4f 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MOD );.  assert(
2aa10 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
2aa20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
2aa30 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
2aa40 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
2aa50 7c 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3d  | pList->pDirty=
2aa60 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  =0 );..  /* If t
2aa70 68 65 20 66 69 6c 65 20 69 73 20 61 20 74 65 6d  he file is a tem
2aa80 70 2d 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79  p-file has not y
2aa90 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20  et been opened, 
2aaa0 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 49 74 0a  open it now. It.
2aab0 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73    ** is not poss
2aac0 69 62 6c 65 20 66 6f 72 20 72 63 20 74 6f 20 62  ible for rc to b
2aad0 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c  e other than SQL
2aae0 49 54 45 5f 4f 4b 20 69 66 20 74 68 69 73 20 62  ITE_OK if this b
2aaf0 72 61 6e 63 68 0a 20 20 2a 2a 20 69 73 20 74 61  ranch.  ** is ta
2ab00 6b 65 6e 2c 20 61 73 20 70 61 67 65 72 5f 77 61  ken, as pager_wa
2ab10 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73 20  it_on_lock() is 
2ab20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 65 6d 70  a no-op for temp
2ab30 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69  -files..  */.  i
2ab40 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  f( !isOpen(pPage
2ab50 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73  r->fd) ){.    as
2ab60 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65  sert( pPager->te
2ab70 6d 70 46 69 6c 65 20 26 26 20 72 63 3d 3d 53 51  mpFile && rc==SQ
2ab80 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72  LITE_OK );.    r
2ab90 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d  c = pagerOpentem
2aba0 70 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  p(pPager, pPager
2abb0 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 76 66  ->fd, pPager->vf
2abc0 73 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20  sFlags);.  }..  
2abd0 2f 2a 20 42 65 66 6f 72 65 20 74 68 65 20 66 69  /* Before the fi
2abe0 72 73 74 20 77 72 69 74 65 2c 20 67 69 76 65 20  rst write, give 
2abf0 74 68 65 20 56 46 53 20 61 20 68 69 6e 74 20 6f  the VFS a hint o
2ac00 66 20 77 68 61 74 20 74 68 65 20 66 69 6e 61 6c  f what the final
2ac10 0a 20 20 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20  .  ** file size 
2ac20 77 69 6c 6c 20 62 65 2e 0a 20 20 2a 2f 0a 20 20  will be..  */.  
2ac30 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
2ac40 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28  TE_OK || isOpen(
2ac50 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20  pPager->fd) );. 
2ac60 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2ac70 4f 4b 20 0a 20 20 20 26 26 20 70 50 61 67 65 72  OK .   && pPager
2ac80 2d 3e 64 62 48 69 6e 74 53 69 7a 65 3c 70 50 61  ->dbHintSize<pPa
2ac90 67 65 72 2d 3e 64 62 53 69 7a 65 0a 20 20 20 26  ger->dbSize.   &
2aca0 26 20 28 70 4c 69 73 74 2d 3e 70 44 69 72 74 79  & (pList->pDirty
2acb0 20 7c 7c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3e   || pList->pgno>
2acc0 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69  pPager->dbHintSi
2acd0 7a 65 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c  ze).  ){.    sql
2ace0 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 46 69 6c  ite3_int64 szFil
2acf0 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  e = pPager->page
2ad00 53 69 7a 65 20 2a 20 28 73 71 6c 69 74 65 33 5f  Size * (sqlite3_
2ad10 69 6e 74 36 34 29 70 50 61 67 65 72 2d 3e 64 62  int64)pPager->db
2ad20 53 69 7a 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  Size;.    sqlite
2ad30 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69  3OsFileControlHi
2ad40 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  nt(pPager->fd, S
2ad50 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45  QLITE_FCNTL_SIZE
2ad60 5f 48 49 4e 54 2c 20 26 73 7a 46 69 6c 65 29 3b  _HINT, &szFile);
2ad70 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 48  .    pPager->dbH
2ad80 69 6e 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72  intSize = pPager
2ad90 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20  ->dbSize;.  }.. 
2ada0 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
2adb0 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20 29  TE_OK && pList )
2adc0 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20  {.    Pgno pgno 
2add0 3d 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a  = pList->pgno;..
2ade0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
2adf0 61 72 65 20 64 69 72 74 79 20 70 61 67 65 73 20  are dirty pages 
2ae00 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  in the page cach
2ae10 65 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62  e with page numb
2ae20 65 72 73 20 67 72 65 61 74 65 72 0a 20 20 20 20  ers greater.    
2ae30 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62  ** than Pager.db
2ae40 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73  Size, this means
2ae50 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
2ae60 6e 63 61 74 65 49 6d 61 67 65 28 29 20 77 61 73  ncateImage() was
2ae70 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a   called to.    *
2ae80 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20  * make the file 
2ae90 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61  smaller (presuma
2aea0 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75  bly by auto-vacu
2aeb0 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74  um code). Do not
2aec0 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e   write.    ** an
2aed0 79 20 73 75 63 68 20 70 61 67 65 73 20 74 6f 20  y such pages to 
2aee0 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a  the file..    **
2aef0 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f  .    ** Also, do
2af00 20 6e 6f 74 20 77 72 69 74 65 20 6f 75 74 20 61   not write out a
2af10 6e 79 20 70 61 67 65 20 74 68 61 74 20 68 61 73  ny page that has
2af20 20 74 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f   the PGHDR_DONT_
2af30 57 52 49 54 45 20 66 6c 61 67 0a 20 20 20 20 2a  WRITE flag.    *
2af40 2a 20 73 65 74 20 28 73 65 74 20 62 79 20 73 71  * set (set by sq
2af50 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72  lite3PagerDontWr
2af60 69 74 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20  ite())..    */. 
2af70 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61     if( pgno<=pPa
2af80 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 30  ger->dbSize && 0
2af90 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26  ==(pList->flags&
2afa0 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45  PGHDR_DONT_WRITE
2afb0 29 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f  ) ){.      i64 o
2afc0 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29  ffset = (pgno-1)
2afd0 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61  *(i64)pPager->pa
2afe0 67 65 53 69 7a 65 3b 20 20 20 2f 2a 20 4f 66 66  geSize;   /* Off
2aff0 73 65 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a  set to write */.
2b000 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74        char *pDat
2b010 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
2b020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b030 20 20 20 20 20 2f 2a 20 44 61 74 61 20 74 6f 20       /* Data to 
2b040 77 72 69 74 65 20 2a 2f 20 20 20 20 0a 0a 20 20  write */    ..  
2b050 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 69      assert( (pLi
2b060 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  st->flags&PGHDR_
2b070 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b  NEED_SYNC)==0 );
2b080 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74  .      if( pList
2b090 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65  ->pgno==1 ) page
2b0a0 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f  r_write_changeco
2b0b0 75 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a 0a 20  unter(pList);.. 
2b0c0 20 20 20 20 20 2f 2a 20 45 6e 63 6f 64 65 20 74       /* Encode t
2b0d0 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
2b0e0 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67       CODEC2(pPag
2b0f0 65 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61 74 61  er, pList->pData
2b100 2c 20 70 67 6e 6f 2c 20 36 2c 20 72 65 74 75 72  , pgno, 6, retur
2b110 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
2b120 4b 50 54 2c 20 70 44 61 74 61 29 3b 0a 0a 20 20  KPT, pData);..  
2b130 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6f 75 74      /* Write out
2b140 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 20   the page data. 
2b150 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
2b160 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
2b170 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20  ger->fd, pData, 
2b180 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
2b190 2c 20 6f 66 66 73 65 74 29 3b 0a 0a 20 20 20 20  , offset);..    
2b1a0 20 20 2f 2a 20 49 66 20 70 61 67 65 20 31 20 77    /* If page 1 w
2b1b0 61 73 20 6a 75 73 74 20 77 72 69 74 74 65 6e 2c  as just written,
2b1c0 20 75 70 64 61 74 65 20 50 61 67 65 72 2e 64 62   update Pager.db
2b1d0 46 69 6c 65 56 65 72 73 20 74 6f 20 6d 61 74 63  FileVers to matc
2b1e0 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 76  h.      ** the v
2b1f0 61 6c 75 65 20 6e 6f 77 20 73 74 6f 72 65 64 20  alue now stored 
2b200 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
2b210 66 69 6c 65 2e 20 49 66 20 77 72 69 74 69 6e 67  file. If writing
2b220 20 74 68 69 73 20 0a 20 20 20 20 20 20 2a 2a 20   this .      ** 
2b230 70 61 67 65 20 63 61 75 73 65 64 20 74 68 65 20  page caused the 
2b240 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
2b250 20 67 72 6f 77 2c 20 75 70 64 61 74 65 20 64 62   grow, update db
2b260 46 69 6c 65 53 69 7a 65 2e 20 0a 20 20 20 20 20  FileSize. .     
2b270 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 67   */.      if( pg
2b280 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  no==1 ){.       
2b290 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
2b2a0 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 70 44  >dbFileVers, &pD
2b2b0 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28  ata[24], sizeof(
2b2c0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
2b2d0 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rs));.      }.  
2b2e0 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61      if( pgno>pPa
2b2f0 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
2b300 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
2b310 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20  r->dbFileSize = 
2b320 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pgno;.      }.  
2b330 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61      pPager->aSta
2b340 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 57 52 49  t[PAGER_STAT_WRI
2b350 54 45 5d 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a  TE]++;..      /*
2b360 20 55 70 64 61 74 65 20 61 6e 79 20 62 61 63 6b   Update any back
2b370 75 70 20 6f 62 6a 65 63 74 73 20 63 6f 70 79 69  up objects copyi
2b380 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ng the contents 
2b390 6f 66 20 74 68 69 73 20 70 61 67 65 72 2e 20 2a  of this pager. *
2b3a0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  /.      sqlite3B
2b3b0 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67  ackupUpdate(pPag
2b3c0 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e  er->pBackup, pgn
2b3d0 6f 2c 20 28 75 38 2a 29 70 4c 69 73 74 2d 3e 70  o, (u8*)pList->p
2b3e0 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 50 41  Data);..      PA
2b3f0 47 45 52 54 52 41 43 45 28 28 22 53 54 4f 52 45  GERTRACE(("STORE
2b400 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68   %d page %d hash
2b410 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20  (%08x)\n",.     
2b420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
2b430 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
2b440 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68  gno, pager_pageh
2b450 61 73 68 28 70 4c 69 73 74 29 29 29 3b 0a 20 20  ash(pList)));.  
2b460 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50 47      IOTRACE(("PG
2b470 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  OUT %p %d\n", pP
2b480 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ager, pgno));.  
2b490 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73      PAGER_INCR(s
2b4a0 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
2b4b0 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20  tedb_count);.   
2b4c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41   }else{.      PA
2b4d0 47 45 52 54 52 41 43 45 28 28 22 4e 4f 53 54 4f  GERTRACE(("NOSTO
2b4e0 52 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  RE %d page %d\n"
2b4f0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
2b500 29 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d  ), pgno));.    }
2b510 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70  .    pager_set_p
2b520 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a  agehash(pList);.
2b530 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73      pList = pLis
2b540 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 0a  t->pDirty;.  }..
2b550 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2b560 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65 20 74 68 61  /*.** Ensure tha
2b570 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  t the sub-journa
2b580 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2e 20  l file is open. 
2b590 49 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  If it is already
2b5a0 20 6f 70 65 6e 2c 20 74 68 69 73 20 0a 2a 2a 20   open, this .** 
2b5b0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
2b5c0 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  -op..**.** SQLIT
2b5d0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
2b5e0 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 67   if everything g
2b5f0 6f 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  oes according to
2b600 20 70 6c 61 6e 2e 20 41 6e 20 0a 2a 2a 20 53 51   plan. An .** SQ
2b610 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65  LITE_IOERR_XXX e
2b620 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
2b630 75 72 6e 65 64 20 69 66 20 61 20 63 61 6c 6c 20  urned if a call 
2b640 74 6f 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e  to sqlite3OsOpen
2b650 28 29 20 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2f  () .** fails..*/
2b660 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e  .static int open
2b670 53 75 62 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  SubJournal(Pager
2b680 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
2b690 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2b6a0 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70  .  if( !isOpen(p
2b6b0 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a  Pager->sjfd) ){.
2b6c0 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c      const int fl
2b6d0 61 67 73 20 3d 20 20 53 51 4c 49 54 45 5f 4f 50  ags =  SQLITE_OP
2b6e0 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 7c 20  EN_SUBJOURNAL | 
2b6f0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
2b700 57 52 49 54 45 20 0a 20 20 20 20 20 20 7c 20 53  WRITE .      | S
2b710 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
2b720 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
2b730 45 58 43 4c 55 53 49 56 45 20 0a 20 20 20 20 20  EXCLUSIVE .     
2b740 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44   | SQLITE_OPEN_D
2b750 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20  ELETEONCLOSE;.  
2b760 20 20 69 6e 74 20 6e 53 74 6d 74 53 70 69 6c 6c    int nStmtSpill
2b770 20 3d 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67   = sqlite3Config
2b780 2e 6e 53 74 6d 74 53 70 69 6c 6c 3b 0a 20 20 20  .nStmtSpill;.   
2b790 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
2b7a0 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
2b7b0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
2b7c0 52 59 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75  RY || pPager->su
2b7d0 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20  bjInMemory ){.  
2b7e0 20 20 20 20 6e 53 74 6d 74 53 70 69 6c 6c 20 3d      nStmtSpill =
2b7f0 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   -1;.    }.    r
2b800 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  c = sqlite3Journ
2b810 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 70  alOpen(pPager->p
2b820 56 66 73 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  Vfs, 0, pPager->
2b830 73 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6e 53 74  sjfd, flags, nSt
2b840 6d 74 53 70 69 6c 6c 29 3b 0a 20 20 7d 0a 20 20  mtSpill);.  }.  
2b850 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2b860 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 72 65 63  .** Append a rec
2b870 6f 72 64 20 6f 66 20 74 68 65 20 63 75 72 72 65  ord of the curre
2b880 6e 74 20 73 74 61 74 65 20 6f 66 20 70 61 67 65  nt state of page
2b890 20 70 50 67 20 74 6f 20 74 68 65 20 73 75 62 2d   pPg to the sub-
2b8a0 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a 0a 2a 2a 20  journal. .**.** 
2b8b0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73  If successful, s
2b8c0 65 74 20 74 68 65 20 62 69 74 20 63 6f 72 72 65  et the bit corre
2b8d0 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 50 67 2d  sponding to pPg-
2b8e0 3e 70 67 6e 6f 20 69 6e 20 74 68 65 20 62 69 74  >pgno in the bit
2b8f0 76 65 63 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20  vecs.** for all 
2b900 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20  open savepoints 
2b910 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
2b920 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
2b930 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51  ction returns SQ
2b940 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
2b950 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73  thing is success
2b960 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65 72  ful, an IO.** er
2b970 72 6f 72 20 63 6f 64 65 20 69 66 20 74 68 65 20  ror code if the 
2b980 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65  attempt to write
2b990 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   to the sub-jour
2b9a0 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a  nal fails, or .*
2b9b0 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  * SQLITE_NOMEM i
2b9c0 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73  f a malloc fails
2b9d0 20 77 68 69 6c 65 20 73 65 74 74 69 6e 67 20 61   while setting a
2b9e0 20 62 69 74 20 69 6e 20 61 20 73 61 76 65 70 6f   bit in a savepo
2b9f0 69 6e 74 0a 2a 2a 20 62 69 74 76 65 63 2e 0a 2a  int.** bitvec..*
2ba00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62  /.static int sub
2ba10 6a 6f 75 72 6e 61 6c 50 61 67 65 28 50 67 48 64  journalPage(PgHd
2ba20 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20 72  r *pPg){.  int r
2ba30 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2ba40 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
2ba50 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
2ba60 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
2ba70 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
2ba80 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29  OURNALMODE_OFF )
2ba90 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74  {..    /* Open t
2baa0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20  he sub-journal, 
2bab0 69 66 20 69 74 20 68 61 73 20 6e 6f 74 20 61 6c  if it has not al
2bac0 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65  ready been opene
2bad0 64 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  d */.    assert(
2bae0 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
2baf0 6e 61 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72  nal );.    asser
2bb00 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
2bb10 2d 3e 6a 66 64 29 20 7c 7c 20 70 61 67 65 72 55  ->jfd) || pagerU
2bb20 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
2bb30 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f  .    assert( isO
2bb40 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
2bb50 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 53 75  ) || pPager->nSu
2bb60 62 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61  bRec==0 );.    a
2bb70 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57  ssert( pagerUseW
2bb80 61 6c 28 70 50 61 67 65 72 29 20 0a 20 20 20 20  al(pPager) .    
2bb90 20 20 20 20 20 7c 7c 20 70 61 67 65 49 6e 4a 6f       || pageInJo
2bba0 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 70 50  urnal(pPager, pP
2bbb0 67 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  g) .         || 
2bbc0 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72  pPg->pgno>pPager
2bbd0 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a 20 20  ->dbOrigSize .  
2bbe0 20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f 70    );.    rc = op
2bbf0 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50 61  enSubJournal(pPa
2bc00 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  ger);..    /* If
2bc10 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
2bc20 20 77 61 73 20 6f 70 65 6e 65 64 20 73 75 63 63   was opened succ
2bc30 65 73 73 66 75 6c 6c 79 20 28 6f 72 20 77 61 73  essfully (or was
2bc40 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 2c 0a   already open),.
2bc50 20 20 20 20 2a 2a 20 77 72 69 74 65 20 74 68 65      ** write the
2bc60 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20   journal record 
2bc70 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20  into the file.  
2bc80 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
2bc90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2bca0 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20    void *pData = 
2bcb0 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20  pPg->pData;.    
2bcc0 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28    i64 offset = (
2bcd0 69 36 34 29 70 50 61 67 65 72 2d 3e 6e 53 75 62  i64)pPager->nSub
2bce0 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70  Rec*(4+pPager->p
2bcf0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
2bd00 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 0a 23  char *pData2;..#
2bd10 69 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  if SQLITE_HAS_CO
2bd20 44 45 43 20 20 20 0a 20 20 20 20 20 20 69 66 28  DEC   .      if(
2bd30 20 21 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e   !pPager->subjIn
2bd40 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20 20  Memory ){.      
2bd50 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c    CODEC2(pPager,
2bd60 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
2bd70 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c  o, 7, return SQL
2bd80 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 20  ITE_NOMEM_BKPT, 
2bd90 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20 7d  pData2);.      }
2bda0 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
2bdb0 20 20 70 44 61 74 61 32 20 3d 20 70 44 61 74 61    pData2 = pData
2bdc0 3b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  ;.      PAGERTRA
2bdd0 43 45 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41  CE(("STMT-JOURNA
2bde0 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  L %d page %d\n",
2bdf0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
2be00 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20  , pPg->pgno));. 
2be10 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33       rc = write3
2be20 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 73 6a  2bits(pPager->sj
2be30 66 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 67 2d  fd, offset, pPg-
2be40 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66  >pgno);.      if
2be50 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2be60 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
2be70 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
2be80 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61  Pager->sjfd, pDa
2be90 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ta2, pPager->pag
2bea0 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29  eSize, offset+4)
2beb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2bec0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
2bed0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
2bee0 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2b 2b  Pager->nSubRec++
2bef0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
2bf00 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
2bf10 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61  >0 );.    rc = a
2bf20 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74  ddToSavepointBit
2bf30 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 50 67  vecs(pPager, pPg
2bf40 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72  ->pgno);.  }.  r
2bf50 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74  eturn rc;.}.stat
2bf60 69 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61  ic int subjourna
2bf70 6c 50 61 67 65 49 66 52 65 71 75 69 72 65 64 28  lPageIfRequired(
2bf80 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
2bf90 66 28 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  f( subjRequiresP
2bfa0 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20  age(pPg) ){.    
2bfb0 72 65 74 75 72 6e 20 73 75 62 6a 6f 75 72 6e 61  return subjourna
2bfc0 6c 50 61 67 65 28 70 50 67 29 3b 0a 20 20 7d 65  lPage(pPg);.  }e
2bfd0 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
2bfe0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d  SQLITE_OK;.  }.}
2bff0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
2c000 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
2c010 62 79 20 74 68 65 20 70 63 61 63 68 65 20 6c 61  by the pcache la
2c020 79 65 72 20 77 68 65 6e 20 69 74 20 68 61 73 20  yer when it has 
2c030 72 65 61 63 68 65 64 20 73 6f 6d 65 0a 2a 2a 20  reached some.** 
2c040 73 6f 66 74 20 6d 65 6d 6f 72 79 20 6c 69 6d 69  soft memory limi
2c050 74 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67  t. The first arg
2c060 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74  ument is a point
2c070 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 6f 62  er to a Pager ob
2c080 6a 65 63 74 0a 2a 2a 20 28 63 61 73 74 20 61 73  ject.** (cast as
2c090 20 61 20 76 6f 69 64 2a 29 2e 20 54 68 65 20 70   a void*). The p
2c0a0 61 67 65 72 20 69 73 20 61 6c 77 61 79 73 20 27  ager is always '
2c0b0 70 75 72 67 65 61 62 6c 65 27 20 28 6e 6f 74 20  purgeable' (not 
2c0c0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  an in-memory.** 
2c0d0 64 61 74 61 62 61 73 65 29 2e 20 54 68 65 20 73  database). The s
2c0e0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
2c0f0 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  s a reference to
2c100 20 61 20 70 61 67 65 20 74 68 61 74 20 69 73 20   a page that is 
2c110 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 64 69  .** currently di
2c120 72 74 79 20 62 75 74 20 68 61 73 20 6e 6f 20 6f  rty but has no o
2c130 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
2c140 65 6e 63 65 73 2e 20 54 68 65 20 70 61 67 65 0a  ences. The page.
2c150 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 61 73 73  ** is always ass
2c160 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
2c170 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61   Pager object pa
2c180 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
2c190 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  t .** argument..
2c1a0 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66  **.** The job of
2c1b0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2c1c0 73 20 74 6f 20 6d 61 6b 65 20 70 50 67 20 63 6c  s to make pPg cl
2c1d0 65 61 6e 20 62 79 20 77 72 69 74 69 6e 67 20 69  ean by writing i
2c1e0 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f  ts contents.** o
2c1f0 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
2c200 73 65 20 66 69 6c 65 2c 20 69 66 20 70 6f 73 73  se file, if poss
2c210 69 62 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 69  ible. This may i
2c220 6e 76 6f 6c 76 65 20 73 79 6e 63 69 6e 67 20 74  nvolve syncing t
2c230 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
2c240 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  le. .**.** If su
2c250 63 63 65 73 73 66 75 6c 2c 20 73 71 6c 69 74 65  ccessful, sqlite
2c260 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e  3PcacheMakeClean
2c270 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  () is called on 
2c280 74 68 65 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20  the page and.** 
2c290 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
2c2a0 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  ed. If an IO err
2c2b0 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
2c2c0 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20 74  trying to make t
2c2d0 68 65 0a 2a 2a 20 70 61 67 65 20 63 6c 65 61 6e  he.** page clean
2c2e0 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  , the IO error c
2c2f0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
2c300 20 49 66 20 74 68 65 20 70 61 67 65 20 63 61 6e   If the page can
2c310 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61 64 65 20 63  not be.** made c
2c320 6c 65 61 6e 20 66 6f 72 20 73 6f 6d 65 20 6f 74  lean for some ot
2c330 68 65 72 20 72 65 61 73 6f 6e 2c 20 62 75 74 20  her reason, but 
2c340 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
2c350 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a   then SQLITE_OK.
2c360 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 62  ** is returned b
2c370 79 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d  y sqlite3PcacheM
2c380 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 6e 6f  akeClean() is no
2c390 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61  t called..*/.sta
2c3a0 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 74 72  tic int pagerStr
2c3b0 65 73 73 28 76 6f 69 64 20 2a 70 2c 20 50 67 48  ess(void *p, PgH
2c3c0 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
2c3d0 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67  r *pPager = (Pag
2c3e0 65 72 20 2a 29 70 3b 0a 20 20 69 6e 74 20 72 63  er *)p;.  int rc
2c3f0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
2c400 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
2c410 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a  ager==pPager );.
2c420 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66    assert( pPg->f
2c430 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
2c440 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64 6f   );..  /* The do
2c450 4e 6f 74 53 70 69 6c 6c 20 4e 4f 53 59 4e 43 20  NotSpill NOSYNC 
2c460 62 69 74 20 69 73 20 73 65 74 20 64 75 72 69 6e  bit is set durin
2c470 67 20 74 69 6d 65 73 20 77 68 65 6e 20 64 6f 69  g times when doi
2c480 6e 67 20 61 20 73 79 6e 63 20 6f 66 0a 20 20 2a  ng a sync of.  *
2c490 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61  * journal (and a
2c4a0 64 64 69 6e 67 20 61 20 6e 65 77 20 68 65 61 64  dding a new head
2c4b0 65 72 29 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  er) is not allow
2c4c0 65 64 2e 20 20 54 68 69 73 20 6f 63 63 75 72 73  ed.  This occurs
2c4d0 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 63 61 6c  .  ** during cal
2c4e0 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ls to sqlite3Pag
2c4f0 65 72 57 72 69 74 65 28 29 20 77 68 69 6c 65 20  erWrite() while 
2c500 74 72 79 69 6e 67 20 74 6f 20 6a 6f 75 72 6e 61  trying to journa
2c510 6c 20 6d 75 6c 74 69 70 6c 65 0a 20 20 2a 2a 20  l multiple.  ** 
2c520 70 61 67 65 73 20 62 65 6c 6f 6e 67 69 6e 67 20  pages belonging 
2c530 74 6f 20 74 68 65 20 73 61 6d 65 20 73 65 63 74  to the same sect
2c540 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  or..  **.  ** Th
2c550 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 52 4f 4c  e doNotSpill ROL
2c560 4c 42 41 43 4b 20 61 6e 64 20 4f 46 46 20 62 69  LBACK and OFF bi
2c570 74 73 20 69 6e 68 69 62 69 74 73 20 61 6c 6c 20  ts inhibits all 
2c580 63 61 63 68 65 20 73 70 69 6c 6c 69 6e 67 0a 20  cache spilling. 
2c590 20 2a 2a 20 72 65 67 61 72 64 6c 65 73 73 20 6f   ** regardless o
2c5a0 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  f whether or not
2c5b0 20 61 20 73 79 6e 63 20 69 73 20 72 65 71 75 69   a sync is requi
2c5c0 72 65 64 2e 20 20 54 68 69 73 20 69 73 20 73 65  red.  This is se
2c5d0 74 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 61 20  t during.  ** a 
2c5e0 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 62 79 20 75  rollback or by u
2c5f0 73 65 72 20 72 65 71 75 65 73 74 2c 20 72 65 73  ser request, res
2c600 70 65 63 74 69 76 65 6c 79 2e 0a 20 20 2a 2a 0a  pectively..  **.
2c610 20 20 2a 2a 20 53 70 69 6c 6c 69 6e 67 20 69 73    ** Spilling is
2c620 20 61 6c 73 6f 20 70 72 6f 68 69 62 69 74 65 64   also prohibited
2c630 20 77 68 65 6e 20 69 6e 20 61 6e 20 65 72 72 6f   when in an erro
2c640 72 20 73 74 61 74 65 20 73 69 6e 63 65 20 74 68  r state since th
2c650 61 74 20 63 6f 75 6c 64 0a 20 20 2a 2a 20 6c 65  at could.  ** le
2c660 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 20 63  ad to database c
2c670 6f 72 72 75 70 74 69 6f 6e 2e 20 20 20 49 6e 20  orruption.   In 
2c680 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c  the current impl
2c690 65 6d 65 6e 74 61 74 69 6f 6e 20 69 74 20 0a 20  ementation it . 
2c6a0 20 2a 2a 20 69 73 20 69 6d 70 6f 73 73 69 62 6c   ** is impossibl
2c6b0 65 20 66 6f 72 20 73 71 6c 69 74 65 33 50 63 61  e for sqlite3Pca
2c6c0 63 68 65 46 65 74 63 68 28 29 20 74 6f 20 62 65  cheFetch() to be
2c6d0 20 63 61 6c 6c 65 64 20 77 69 74 68 20 63 72 65   called with cre
2c6e0 61 74 65 46 6c 61 67 3d 3d 33 0a 20 20 2a 2a 20  ateFlag==3.  ** 
2c6f0 77 68 69 6c 65 20 69 6e 20 74 68 65 20 65 72 72  while in the err
2c700 6f 72 20 73 74 61 74 65 2c 20 68 65 6e 63 65 20  or state, hence 
2c710 69 74 20 69 73 20 69 6d 70 6f 73 73 69 62 6c 65  it is impossible
2c720 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e   for this routin
2c730 65 20 74 6f 0a 20 20 2a 2a 20 62 65 20 63 61 6c  e to.  ** be cal
2c740 6c 65 64 20 69 6e 20 74 68 65 20 65 72 72 6f 72  led in the error
2c750 20 73 74 61 74 65 2e 20 20 4e 65 76 65 72 74 68   state.  Neverth
2c760 65 6c 65 73 73 2c 20 77 65 20 69 6e 63 6c 75 64  eless, we includ
2c770 65 20 61 20 4e 45 56 45 52 28 29 0a 20 20 2a 2a  e a NEVER().  **
2c780 20 74 65 73 74 20 66 6f 72 20 74 68 65 20 65 72   test for the er
2c790 72 6f 72 20 73 74 61 74 65 20 61 73 20 61 20 73  ror state as a s
2c7a0 61 66 65 67 75 61 72 64 20 61 67 61 69 6e 73 74  afeguard against
2c7b0 20 66 75 74 75 72 65 20 63 68 61 6e 67 65 73 2e   future changes.
2c7c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  .  */.  if( NEVE
2c7d0 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  R(pPager->errCod
2c7e0 65 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  e) ) return SQLI
2c7f0 54 45 5f 4f 4b 3b 0a 20 20 74 65 73 74 63 61 73  TE_OK;.  testcas
2c800 65 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  e( pPager->doNot
2c810 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41  Spill & SPILLFLA
2c820 47 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20  G_ROLLBACK );.  
2c830 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65 72  testcase( pPager
2c840 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53  ->doNotSpill & S
2c850 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 29 3b 0a  PILLFLAG_OFF );.
2c860 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
2c870 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26  er->doNotSpill &
2c880 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e   SPILLFLAG_NOSYN
2c890 43 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  C );.  if( pPage
2c8a0 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 0a 20 20  r->doNotSpill.  
2c8b0 20 26 26 20 28 28 70 50 61 67 65 72 2d 3e 64 6f   && ((pPager->do
2c8c0 4e 6f 74 53 70 69 6c 6c 20 26 20 28 53 50 49 4c  NotSpill & (SPIL
2c8d0 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 7c 53  LFLAG_ROLLBACK|S
2c8e0 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 29 29 21 3d  PILLFLAG_OFF))!=
2c8f0 30 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 67 2d  0.      || (pPg-
2c900 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e  >flags & PGHDR_N
2c910 45 45 44 5f 53 59 4e 43 29 21 3d 30 29 0a 20 20  EED_SYNC)!=0).  
2c920 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2c930 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
2c940 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41  pPager->aStat[PA
2c950 47 45 52 5f 53 54 41 54 5f 53 50 49 4c 4c 5d 2b  GER_STAT_SPILL]+
2c960 2b 3b 0a 20 20 70 50 67 2d 3e 70 44 69 72 74 79  +;.  pPg->pDirty
2c970 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 61 67 65   = 0;.  if( page
2c980 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
2c990 29 7b 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20  ){.    /* Write 
2c9a0 61 20 73 69 6e 67 6c 65 20 66 72 61 6d 65 20 66  a single frame f
2c9b0 6f 72 20 74 68 69 73 20 70 61 67 65 20 74 6f 20  or this page to 
2c9c0 74 68 65 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20  the log. */.    
2c9d0 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50  rc = subjournalP
2c9e0 61 67 65 49 66 52 65 71 75 69 72 65 64 28 70 50  ageIfRequired(pP
2c9f0 67 29 3b 20 0a 20 20 20 20 69 66 28 20 72 63 3d  g); .    if( rc=
2ca00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2ca10 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 57 61      rc = pagerWa
2ca20 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72 2c 20  lFrames(pPager, 
2ca30 70 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  pPg, 0, 0);.    
2ca40 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 0a  }.  }else{.    .
2ca50 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
2ca60 41 42 4c 45 5f 42 41 54 43 48 5f 41 54 4f 4d 49  ABLE_BATCH_ATOMI
2ca70 43 5f 57 52 49 54 45 0a 20 20 20 20 69 66 28 20  C_WRITE.    if( 
2ca80 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
2ca90 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
2caa0 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  = sqlite3Journal
2cab0 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  Create(pPager->j
2cac0 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  fd);.      if( r
2cad0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
2cae0 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f  eturn pager_erro
2caf0 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
2cb00 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20     }.#endif.  . 
2cb10 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a     /* Sync the j
2cb20 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 72  ournal file if r
2cb30 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20  equired. */.    
2cb40 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50  if( pPg->flags&P
2cb50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 0a  GHDR_NEED_SYNC .
2cb60 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
2cb70 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
2cb80 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20  ITER_CACHEMOD.  
2cb90 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20    ){.      rc = 
2cba0 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
2cbb0 65 72 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  er, 1);.    }.  
2cbc0 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68  .    /* Write th
2cbd0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2cbe0 65 20 70 61 67 65 20 6f 75 74 20 74 6f 20 74 68  e page out to th
2cbf0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2cc00 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
2cc10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2cc20 20 20 20 61 73 73 65 72 74 28 20 28 70 50 67 2d     assert( (pPg-
2cc30 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
2cc40 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20  D_SYNC)==0 );.  
2cc50 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
2cc60 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50  rite_pagelist(pP
2cc70 61 67 65 72 2c 20 70 50 67 29 3b 0a 20 20 20 20  ager, pPg);.    
2cc80 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b  }.  }..  /* Mark
2cc90 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65   the page as cle
2cca0 61 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  an. */.  if( rc=
2ccb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2ccc0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
2ccd0 54 52 45 53 53 20 25 64 20 70 61 67 65 20 25 64  TRESS %d page %d
2cce0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
2ccf0 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ger), pPg->pgno)
2cd00 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  );.    sqlite3Pc
2cd10 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50  acheMakeClean(pP
2cd20 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  g);.  }..  retur
2cd30 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  n pager_error(pP
2cd40 61 67 65 72 2c 20 72 63 29 3b 20 0a 7d 0a 0a 2f  ager, rc); .}../
2cd50 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6c 6c 20 75  *.** Flush all u
2cd60 6e 72 65 66 65 72 65 6e 63 65 64 20 64 69 72 74  nreferenced dirt
2cd70 79 20 70 61 67 65 73 20 74 6f 20 64 69 73 6b 2e  y pages to disk.
2cd80 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
2cd90 61 67 65 72 46 6c 75 73 68 28 50 61 67 65 72 20  agerFlush(Pager 
2cda0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
2cdb0 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
2cdc0 43 6f 64 65 3b 0a 20 20 69 66 28 20 21 4d 45 4d  Code;.  if( !MEM
2cdd0 44 42 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  DB ){.    PgHdr 
2cde0 2a 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  *pList = sqlite3
2cdf0 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28  PcacheDirtyList(
2ce00 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
2ce10 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 73  ;.    assert( as
2ce20 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
2ce30 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
2ce40 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
2ce50 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20 29 7b  E_OK && pList ){
2ce60 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 4e  .      PgHdr *pN
2ce70 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69  ext = pList->pDi
2ce80 72 74 79 3b 0a 20 20 20 20 20 20 69 66 28 20 70  rty;.      if( p
2ce90 4c 69 73 74 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  List->nRef==0 ){
2cea0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
2ceb0 67 65 72 53 74 72 65 73 73 28 28 76 6f 69 64 2a  gerStress((void*
2cec0 29 70 50 61 67 65 72 2c 20 70 4c 69 73 74 29 3b  )pPager, pList);
2ced0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
2cee0 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20  List = pNext;.  
2cef0 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
2cf00 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
2cf10 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74  llocate and init
2cf20 69 61 6c 69 7a 65 20 61 20 6e 65 77 20 50 61 67  ialize a new Pag
2cf30 65 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 70 75  er object and pu
2cf40 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  t a pointer to i
2cf50 74 0a 2a 2a 20 69 6e 20 2a 70 70 50 61 67 65 72  t.** in *ppPager
2cf60 2e 20 54 68 65 20 70 61 67 65 72 20 73 68 6f 75  . The pager shou
2cf70 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79 20 62 65  ld eventually be
2cf80 20 66 72 65 65 64 20 62 79 20 70 61 73 73 69 6e   freed by passin
2cf90 67 20 69 74 0a 2a 2a 20 74 6f 20 73 71 6c 69 74  g it.** to sqlit
2cfa0 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29 2e 0a  e3PagerClose()..
2cfb0 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e  **.** The zFilen
2cfc0 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ame argument is 
2cfd0 74 68 65 20 70 61 74 68 20 74 6f 20 74 68 65 20  the path to the 
2cfe0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
2cff0 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69   open..** If zFi
2d000 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74  lename is NULL t
2d010 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e  hen a randomly-n
2d020 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66  amed temporary f
2d030 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ile is created.*
2d040 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20 74 68  * and used as th
2d050 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63  e file to be cac
2d060 68 65 64 2e 20 54 65 6d 70 6f 72 61 72 79 20 66  hed. Temporary f
2d070 69 6c 65 73 20 61 72 65 20 62 65 20 64 65 6c 65  iles are be dele
2d080 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63  ted.** automatic
2d090 61 6c 6c 79 20 77 68 65 6e 20 74 68 65 79 20 61  ally when they a
2d0a0 72 65 20 63 6c 6f 73 65 64 2e 20 49 66 20 7a 46  re closed. If zF
2d0b0 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d  ilename is ":mem
2d0c0 6f 72 79 3a 22 20 74 68 65 6e 20 0a 2a 2a 20 61  ory:" then .** a
2d0d0 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ll information i
2d0e0 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e  s held in cache.
2d0f0 20 49 74 20 69 73 20 6e 65 76 65 72 20 77 72 69   It is never wri
2d100 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 0a 2a  tten to disk. .*
2d110 2a 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73  * This can be us
2d120 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
2d130 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
2d140 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  abase..**.** The
2d150 20 6e 45 78 74 72 61 20 70 61 72 61 6d 65 74 65   nExtra paramete
2d160 72 20 73 70 65 63 69 66 69 65 73 20 74 68 65 20  r specifies the 
2d170 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
2d180 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74  of space allocat
2d190 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69 74 68  ed.** along with
2d1a0 20 65 61 63 68 20 70 61 67 65 20 72 65 66 65 72   each page refer
2d1b0 65 6e 63 65 2e 20 54 68 69 73 20 73 70 61 63 65  ence. This space
2d1c0 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f   is available to
2d1d0 20 74 68 65 20 75 73 65 72 0a 2a 2a 20 76 69 61   the user.** via
2d1e0 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65   the sqlite3Page
2d1f0 72 47 65 74 45 78 74 72 61 28 29 20 41 50 49 2e  rGetExtra() API.
2d200 20 20 57 68 65 6e 20 61 20 6e 65 77 20 70 61 67    When a new pag
2d210 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2c 20  e is allocated, 
2d220 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 38 20 62  the.** first 8 b
2d230 79 74 65 73 20 6f 66 20 74 68 69 73 20 73 70 61  ytes of this spa
2d240 63 65 20 61 72 65 20 7a 65 72 6f 65 64 20 62 75  ce are zeroed bu
2d250 74 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20  t the remainder 
2d260 69 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  is uninitialized
2d270 2e 0a 2a 2a 20 28 54 68 65 20 65 78 74 72 61 20  ..** (The extra 
2d280 73 70 61 63 65 20 69 73 20 75 73 65 64 20 62 79  space is used by
2d290 20 62 74 72 65 65 20 61 73 20 74 68 65 20 4d 65   btree as the Me
2d2a0 6d 50 61 67 65 20 6f 62 6a 65 63 74 2e 29 0a 2a  mPage object.).*
2d2b0 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 61  *.** The flags a
2d2c0 72 67 75 6d 65 6e 74 20 69 73 20 75 73 65 64 20  rgument is used 
2d2d0 74 6f 20 73 70 65 63 69 66 79 20 70 72 6f 70 65  to specify prope
2d2e0 72 74 69 65 73 20 74 68 61 74 20 61 66 66 65 63  rties that affec
2d2f0 74 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69  t the.** operati
2d300 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72 2e  on of the pager.
2d310 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20 70 61   It should be pa
2d320 73 73 65 64 20 73 6f 6d 65 20 62 69 74 77 69 73  ssed some bitwis
2d330 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a  e combination.**
2d340 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 2a 20   of the PAGER_* 
2d350 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  flags..**.** The
2d360 20 76 66 73 46 6c 61 67 73 20 70 61 72 61 6d 65   vfsFlags parame
2d370 74 65 72 20 69 73 20 61 20 62 69 74 6d 61 73 6b  ter is a bitmask
2d380 20 74 6f 20 70 61 73 73 20 74 6f 20 74 68 65 20   to pass to the 
2d390 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 0a  flags parameter.
2d3a0 2a 2a 20 6f 66 20 74 68 65 20 78 4f 70 65 6e 28  ** of the xOpen(
2d3b0 29 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20  ) method of the 
2d3c0 73 75 70 70 6c 69 65 64 20 56 46 53 20 77 68 65  supplied VFS whe
2d3d0 6e 20 6f 70 65 6e 69 6e 67 20 66 69 6c 65 73 2e  n opening files.
2d3e0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70   .**.** If the p
2d3f0 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20 61  ager object is a
2d400 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65  llocated and the
2d410 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20   specified file 
2d420 6f 70 65 6e 65 64 20 0a 2a 2a 20 73 75 63 63 65  opened .** succe
2d430 73 73 66 75 6c 6c 79 2c 20 53 51 4c 49 54 45 5f  ssfully, SQLITE_
2d440 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  OK is returned a
2d450 6e 64 20 2a 70 70 50 61 67 65 72 20 73 65 74 20  nd *ppPager set 
2d460 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74  to point to.** t
2d470 68 65 20 6e 65 77 20 70 61 67 65 72 20 6f 62 6a  he new pager obj
2d480 65 63 74 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ect. If an error
2d490 20 6f 63 63 75 72 73 2c 20 2a 70 70 50 61 67 65   occurs, *ppPage
2d4a0 72 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  r is set to NULL
2d4b0 0a 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 63 6f  .** and error co
2d4c0 64 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69  de returned. Thi
2d4d0 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72  s function may r
2d4e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2d4f0 45 4d 0a 2a 2a 20 28 73 71 6c 69 74 65 33 4d 61  EM.** (sqlite3Ma
2d500 6c 6c 6f 63 28 29 20 69 73 20 75 73 65 64 20 74  lloc() is used t
2d510 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  o allocate memor
2d520 79 29 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  y), SQLITE_CANTO
2d530 50 45 4e 20 6f 72 20 0a 2a 2a 20 76 61 72 69 6f  PEN or .** vario
2d540 75 73 20 53 51 4c 49 54 45 5f 49 4f 5f 58 58 58  us SQLITE_IO_XXX
2d550 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20   errors..*/.int 
2d560 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
2d570 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
2d580 2a 70 56 66 73 2c 20 20 20 20 20 20 20 2f 2a 20  *pVfs,       /* 
2d590 54 68 65 20 76 69 72 74 75 61 6c 20 66 69 6c 65  The virtual file
2d5a0 20 73 79 73 74 65 6d 20 74 6f 20 75 73 65 20 2a   system to use *
2d5b0 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61  /.  Pager **ppPa
2d5c0 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ger,         /* 
2d5d0 4f 55 54 3a 20 52 65 74 75 72 6e 20 74 68 65 20  OUT: Return the 
2d5e0 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
2d5f0 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  here */.  const 
2d600 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
2d610 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
2d620 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2d630 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
2d640 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20   nExtra,        
2d650 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62        /* Extra b
2d660 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65  ytes append to e
2d670 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
2d680 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ge */.  int flag
2d690 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
2d6a0 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f   /* flags contro
2d6b0 6c 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20  lling this file 
2d6c0 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67  */.  int vfsFlag
2d6d0 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s,            /*
2d6e0 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 68   flags passed th
2d6f0 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33  rough to sqlite3
2d700 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a  _vfs.xOpen() */.
2d710 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74    void (*xReinit
2d720 29 28 44 62 50 61 67 65 2a 29 20 2f 2a 20 46 75  )(DbPage*) /* Fu
2d730 6e 63 74 69 6f 6e 20 74 6f 20 72 65 69 6e 69 74  nction to reinit
2d740 69 61 6c 69 7a 65 20 70 61 67 65 73 20 2a 2f 0a  ialize pages */.
2d750 29 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a 20  ){.  u8 *pPtr;. 
2d760 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
2d770 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67   0;       /* Pag
2d780 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 61 6c 6c  er object to all
2d790 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e  ocate and return
2d7a0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
2d7b0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f  QLITE_OK;      /
2d7c0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
2d7d0 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20  .  int tempFile 
2d7e0 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  = 0;        /* T
2d7f0 72 75 65 20 66 6f 72 20 74 65 6d 70 20 66 69 6c  rue for temp fil
2d800 65 73 20 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d  es (incl. in-mem
2d810 6f 72 79 20 66 69 6c 65 73 29 20 2a 2f 0a 20 20  ory files) */.  
2d820 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 20 20  int memDb = 0;  
2d830 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2d840 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 69   if this is an i
2d850 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f  n-memory file */
2d860 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
2d870 4e 41 42 4c 45 5f 44 45 53 45 52 49 41 4c 49 5a  NABLE_DESERIALIZ
2d880 45 0a 20 20 69 6e 74 20 6d 65 6d 4a 4d 20 3d 20  E.  int memJM = 
2d890 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
2d8a0 4d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 6d  Memory journal m
2d8b0 6f 64 65 20 2a 2f 0a 23 65 6c 73 65 0a 23 20 64  ode */.#else.# d
2d8c0 65 66 69 6e 65 20 6d 65 6d 4a 4d 20 30 0a 23 65  efine memJM 0.#e
2d8d0 6e 64 69 66 0a 20 20 69 6e 74 20 72 65 61 64 4f  ndif.  int readO
2d8e0 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nly = 0;        
2d8f0 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
2d900 69 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 66  is a read-only f
2d910 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75  ile */.  int jou
2d920 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 20 20 20  rnalFileSize;   
2d930 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c    /* Bytes to al
2d940 6c 6f 63 61 74 65 20 66 6f 72 20 65 61 63 68 20  locate for each 
2d950 6a 6f 75 72 6e 61 6c 20 66 64 20 2a 2f 0a 20 20  journal fd */.  
2d960 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20  char *zPathname 
2d970 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46 75 6c 6c  = 0;     /* Full
2d980 20 70 61 74 68 20 74 6f 20 64 61 74 61 62 61 73   path to databas
2d990 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
2d9a0 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20  nPathname = 0;  
2d9b0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2d9c0 66 20 62 79 74 65 73 20 69 6e 20 7a 50 61 74 68  f bytes in zPath
2d9d0 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73  name */.  int us
2d9e0 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67  eJournal = (flag
2d9f0 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a  s & PAGER_OMIT_J
2da00 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46  OURNAL)==0; /* F
2da10 61 6c 73 65 20 74 6f 20 6f 6d 69 74 20 6a 6f 75  alse to omit jou
2da20 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 70 63  rnal */.  int pc
2da30 61 63 68 65 53 69 7a 65 20 3d 20 73 71 6c 69 74  acheSize = sqlit
2da40 65 33 50 63 61 63 68 65 53 69 7a 65 28 29 3b 20  e3PcacheSize(); 
2da50 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74        /* Bytes t
2da60 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 50  o allocate for P
2da70 43 61 63 68 65 20 2a 2f 0a 20 20 75 33 32 20 73  Cache */.  u32 s
2da80 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49  zPageDflt = SQLI
2da90 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
2daa0 53 49 5a 45 3b 20 20 2f 2a 20 44 65 66 61 75 6c  SIZE;  /* Defaul
2dab0 74 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20  t page size */. 
2dac0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 72   const char *zUr
2dad0 69 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55 52 49  i = 0;    /* URI
2dae0 20 61 72 67 73 20 74 6f 20 63 6f 70 79 20 2a 2f   args to copy */
2daf0 0a 20 20 69 6e 74 20 6e 55 72 69 20 3d 20 30 3b  .  int nUri = 0;
2db00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2db10 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
2db20 66 20 55 52 49 20 61 72 67 73 20 61 74 20 2a 7a  f URI args at *z
2db30 55 72 69 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67  Uri */..  /* Fig
2db40 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75 63 68  ure out how much
2db50 20 73 70 61 63 65 20 69 73 20 72 65 71 75 69 72   space is requir
2db60 65 64 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72  ed for each jour
2db70 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 0a  nal file-handle.
2db80 20 20 2a 2a 20 28 74 68 65 72 65 20 61 72 65 20    ** (there are 
2db90 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20 74 68 65  two of them, the
2dba0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e   main journal an
2dbb0 64 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  d the sub-journa
2dbc0 6c 29 2e 20 20 2a 2f 0a 20 20 6a 6f 75 72 6e 61  l).  */.  journa
2dbd0 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e  lFileSize = ROUN
2dbe0 44 38 28 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61  D8(sqlite3Journa
2dbf0 6c 53 69 7a 65 28 70 56 66 73 29 29 3b 0a 0a 20  lSize(pVfs));.. 
2dc00 20 2f 2a 20 53 65 74 20 74 68 65 20 6f 75 74 70   /* Set the outp
2dc10 75 74 20 76 61 72 69 61 62 6c 65 20 74 6f 20 4e  ut variable to N
2dc20 55 4c 4c 20 69 6e 20 63 61 73 65 20 61 6e 20 65  ULL in case an e
2dc30 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a  rror occurs. */.
2dc40 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a    *ppPager = 0;.
2dc50 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2dc60 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20  OMIT_MEMORYDB.  
2dc70 69 66 28 20 66 6c 61 67 73 20 26 20 50 41 47 45  if( flags & PAGE
2dc80 52 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20  R_MEMORY ){.    
2dc90 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 69  memDb = 1;.    i
2dca0 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  f( zFilename && 
2dcb0 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a  zFilename[0] ){.
2dcc0 20 20 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20        zPathname 
2dcd0 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
2dce0 70 28 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  p(0, zFilename);
2dcf0 0a 20 20 20 20 20 20 69 66 28 20 7a 50 61 74 68  .      if( zPath
2dd00 6e 61 6d 65 3d 3d 30 20 20 29 20 72 65 74 75 72  name==0  ) retur
2dd10 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
2dd20 4b 50 54 3b 0a 20 20 20 20 20 20 6e 50 61 74 68  KPT;.      nPath
2dd30 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  name = sqlite3St
2dd40 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65  rlen30(zPathname
2dd50 29 3b 0a 20 20 20 20 20 20 7a 46 69 6c 65 6e 61  );.      zFilena
2dd60 6d 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  me = 0;.    }.  
2dd70 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43  }.#endif..  /* C
2dd80 6f 6d 70 75 74 65 20 61 6e 64 20 73 74 6f 72 65  ompute and store
2dd90 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61   the full pathna
2dda0 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f 63 61 74  me in an allocat
2ddb0 65 64 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  ed buffer pointe
2ddc0 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20 7a 50 61  d.  ** to by zPa
2ddd0 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e  thname, length n
2dde0 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c 20 69 66  Pathname. Or, if
2ddf0 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f   this is a tempo
2de00 72 61 72 79 20 66 69 6c 65 2c 0a 20 20 2a 2a 20  rary file,.  ** 
2de10 6c 65 61 76 65 20 62 6f 74 68 20 6e 50 61 74 68  leave both nPath
2de20 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74 68 6e 61  name and zPathna
2de30 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a 20 20 2a  me set to 0..  *
2de40 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  /.  if( zFilenam
2de50 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  e && zFilename[0
2de60 5d 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ] ){.    const c
2de70 68 61 72 20 2a 7a 3b 0a 20 20 20 20 6e 50 61 74  har *z;.    nPat
2de80 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78  hname = pVfs->mx
2de90 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20  Pathname+1;.    
2dea0 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  zPathname = sqli
2deb0 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 30  te3DbMallocRaw(0
2dec0 2c 20 6e 50 61 74 68 6e 61 6d 65 2a 32 29 3b 0a  , nPathname*2);.
2ded0 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d      if( zPathnam
2dee0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  e==0 ){.      re
2def0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2df00 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  M_BKPT;.    }.  
2df10 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d    zPathname[0] =
2df20 20 30 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65   0; /* Make sure
2df30 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 65 76 65   initialized eve
2df40 6e 20 69 66 20 46 75 6c 6c 50 61 74 68 6e 61 6d  n if FullPathnam
2df50 65 28 29 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20  e() fails */.   
2df60 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
2df70 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73  ullPathname(pVfs
2df80 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61  , zFilename, nPa
2df90 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d  thname, zPathnam
2dfa0 65 29 3b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d  e);.    nPathnam
2dfb0 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
2dfc0 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  n30(zPathname);.
2dfd0 20 20 20 20 7a 20 3d 20 7a 55 72 69 20 3d 20 26      z = zUri = &
2dfe0 7a 46 69 6c 65 6e 61 6d 65 5b 73 71 6c 69 74 65  zFilename[sqlite
2dff0 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e  3Strlen30(zFilen
2e000 61 6d 65 29 2b 31 5d 3b 0a 20 20 20 20 77 68 69  ame)+1];.    whi
2e010 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 20 20  le( *z ){.      
2e020 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  z += sqlite3Strl
2e030 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20 20  en30(z)+1;.     
2e040 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72   z += sqlite3Str
2e050 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20  len30(z)+1;.    
2e060 7d 0a 20 20 20 20 6e 55 72 69 20 3d 20 28 69 6e  }.    nUri = (in
2e070 74 29 28 26 7a 5b 31 5d 20 2d 20 7a 55 72 69 29  t)(&z[1] - zUri)
2e080 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 55  ;.    assert( nU
2e090 72 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ri>=0 );.    if(
2e0a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2e0b0 26 20 6e 50 61 74 68 6e 61 6d 65 2b 38 3e 70 56  & nPathname+8>pV
2e0c0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29  fs->mxPathname )
2e0d0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
2e0e0 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20  branch is taken 
2e0f0 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  when the journal
2e100 20 70 61 74 68 20 72 65 71 75 69 72 65 64 20 62   path required b
2e110 79 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64  y.      ** the d
2e120 61 74 61 62 61 73 65 20 62 65 69 6e 67 20 6f 70  atabase being op
2e130 65 6e 65 64 20 77 69 6c 6c 20 62 65 20 6d 6f 72  ened will be mor
2e140 65 20 74 68 61 6e 20 70 56 66 73 2d 3e 6d 78 50  e than pVfs->mxP
2e150 61 74 68 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a  athname.      **
2e160 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68   bytes in length
2e170 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65  . This means the
2e180 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74   database cannot
2e190 20 62 65 20 6f 70 65 6e 65 64 2c 0a 20 20 20 20   be opened,.    
2e1a0 20 20 2a 2a 20 61 73 20 69 74 20 77 69 6c 6c 20    ** as it will 
2e1b0 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20  not be possible 
2e1c0 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72  to open the jour
2e1d0 6e 61 6c 20 66 69 6c 65 20 6f 72 20 65 76 65 6e  nal file or even
2e1e0 0a 20 20 20 20 20 20 2a 2a 20 63 68 65 63 6b 20  .      ** check 
2e1f0 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  for a hot-journa
2e200 6c 20 62 65 66 6f 72 65 20 72 65 61 64 69 6e 67  l before reading
2e210 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2e220 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e   rc = SQLITE_CAN
2e230 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20  TOPEN_BKPT;.    
2e240 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
2e250 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2e260 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30   sqlite3DbFree(0
2e270 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , zPathname);.  
2e280 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2e290 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
2e2a0 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66  llocate memory f
2e2b0 6f 72 20 74 68 65 20 50 61 67 65 72 20 73 74 72  or the Pager str
2e2c0 75 63 74 75 72 65 2c 20 50 43 61 63 68 65 20 6f  ucture, PCache o
2e2d0 62 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a 2a 20  bject, the.  ** 
2e2e0 74 68 72 65 65 20 66 69 6c 65 20 64 65 73 63 72  three file descr
2e2f0 69 70 74 6f 72 73 2c 20 74 68 65 20 64 61 74 61  iptors, the data
2e300 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61  base file name a
2e310 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a  nd the journal .
2e320 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 2e 20    ** file name. 
2e330 54 68 65 20 6c 61 79 6f 75 74 20 69 6e 20 6d 65  The layout in me
2e340 6d 6f 72 79 20 69 73 20 61 73 20 66 6f 6c 6c 6f  mory is as follo
2e350 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ws:.  **.  **   
2e360 20 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 20    Pager object  
2e370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e380 20 20 28 73 69 7a 65 6f 66 28 50 61 67 65 72 29    (sizeof(Pager)
2e390 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
2e3a0 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 20   PCache object  
2e3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e3c0 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 53   (sqlite3PcacheS
2e3d0 69 7a 65 28 29 20 62 79 74 65 73 29 0a 20 20 2a  ize() bytes).  *
2e3e0 2a 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66  *     Database f
2e3f0 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20  ile handle      
2e400 20 20 20 20 20 20 28 70 56 66 73 2d 3e 73 7a 4f        (pVfs->szO
2e410 73 46 69 6c 65 20 62 79 74 65 73 29 0a 20 20 2a  sFile bytes).  *
2e420 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75 72 6e 61  *     Sub-journa
2e430 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20  l file handle   
2e440 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69        (journalFi
2e450 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20  leSize bytes).  
2e460 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f 75 72  **     Main jour
2e470 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  nal file handle 
2e480 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46         (journalF
2e490 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20  ileSize bytes). 
2e4a0 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65   **     Database
2e4b0 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20   file name      
2e4c0 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61          (nPathna
2e4d0 6d 65 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2a  me+1 bytes).  **
2e4e0 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c       Journal fil
2e4f0 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20  e name          
2e500 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b       (nPathname+
2e510 38 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2f 0a  8+1 bytes).  */.
2e520 20 20 70 50 74 72 20 3d 20 28 75 38 20 2a 29 73    pPtr = (u8 *)s
2e530 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
2e540 28 0a 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a  (.    ROUND8(siz
2e550 65 6f 66 28 2a 70 50 61 67 65 72 29 29 20 2b 20  eof(*pPager)) + 
2e560 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74       /* Pager st
2e570 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 52  ructure */.    R
2e580 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65  OUND8(pcacheSize
2e590 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ) +           /*
2e5a0 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 2a   PCache object *
2e5b0 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 56 66  /.    ROUND8(pVf
2e5c0 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b 20 20  s->szOsFile) +  
2e5d0 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e       /* The main
2e5e0 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20   db file */.    
2e5f0 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
2e600 2a 20 32 20 2b 20 20 20 20 20 20 20 20 20 20 2f  * 2 +          /
2e610 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75 72 6e 61  * The two journa
2e620 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20  l files */ .    
2e630 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20  nPathname + 1 + 
2e640 6e 55 72 69 20 2b 20 20 20 20 20 20 20 20 20 2f  nUri +         /
2e650 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20  * zFilename */. 
2e660 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 38     nPathname + 8
2e670 20 2b 20 32 20 20 20 20 20 20 20 20 20 20 20 20   + 2            
2e680 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f    /* zJournal */
2e690 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2e6a0 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 2b 20 6e  OMIT_WAL.    + n
2e6b0 50 61 74 68 6e 61 6d 65 20 2b 20 34 20 2b 20 32  Pathname + 4 + 2
2e6c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
2e6d0 57 61 6c 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  Wal */.#endif.  
2e6e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  );.  assert( EIG
2e6f0 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
2e700 54 28 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f  T(SQLITE_INT_TO_
2e710 50 54 52 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53  PTR(journalFileS
2e720 69 7a 65 29 29 20 29 3b 0a 20 20 69 66 28 20 21  ize)) );.  if( !
2e730 70 50 74 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  pPtr ){.    sqli
2e740 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50 61  te3DbFree(0, zPa
2e750 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  thname);.    ret
2e760 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2e770 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 50 61  _BKPT;.  }.  pPa
2e780 67 65 72 20 3d 20 20 20 20 20 20 20 20 20 20 20  ger =           
2e790 20 20 20 28 50 61 67 65 72 2a 29 28 70 50 74 72     (Pager*)(pPtr
2e7a0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 50 43  );.  pPager->pPC
2e7b0 61 63 68 65 20 3d 20 20 20 20 28 50 43 61 63 68  ache =    (PCach
2e7c0 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e  e*)(pPtr += ROUN
2e7d0 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65  D8(sizeof(*pPage
2e7e0 72 29 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  r)));.  pPager->
2e7f0 66 64 20 3d 20 20 20 28 73 71 6c 69 74 65 33 5f  fd =   (sqlite3_
2e800 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52  file*)(pPtr += R
2e810 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65  OUND8(pcacheSize
2e820 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 6a  ));.  pPager->sj
2e830 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  fd = (sqlite3_fi
2e840 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55  le*)(pPtr += ROU
2e850 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ND8(pVfs->szOsFi
2e860 6c 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  le));.  pPager->
2e870 6a 66 64 20 3d 20 20 28 73 71 6c 69 74 65 33 5f  jfd =  (sqlite3_
2e880 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 6a  file*)(pPtr += j
2e890 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b  ournalFileSize);
2e8a0 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  .  pPager->zFile
2e8b0 6e 61 6d 65 20 3d 20 20 20 20 28 63 68 61 72 2a  name =    (char*
2e8c0 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61  )(pPtr += journa
2e8d0 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 61 73  lFileSize);.  as
2e8e0 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
2e8f0 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 50 61 67 65  _ALIGNMENT(pPage
2e900 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a  r->jfd) );..  /*
2e910 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 50 61 67   Fill in the Pag
2e920 65 72 2e 7a 46 69 6c 65 6e 61 6d 65 20 61 6e 64  er.zFilename and
2e930 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20   Pager.zJournal 
2e940 62 75 66 66 65 72 73 2c 20 69 66 20 72 65 71 75  buffers, if requ
2e950 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 7a  ired. */.  if( z
2e960 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
2e970 61 73 73 65 72 74 28 20 6e 50 61 74 68 6e 61 6d  assert( nPathnam
2e980 65 3e 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  e>0 );.    pPage
2e990 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20 20  r->zJournal =   
2e9a0 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20  (char*)(pPtr += 
2e9b0 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20  nPathname + 1 + 
2e9c0 6e 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70  nUri);.    memcp
2e9d0 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  y(pPager->zFilen
2e9e0 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20  ame, zPathname, 
2e9f0 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  nPathname);.    
2ea00 69 66 28 20 6e 55 72 69 20 29 20 6d 65 6d 63 70  if( nUri ) memcp
2ea10 79 28 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  y(&pPager->zFile
2ea20 6e 61 6d 65 5b 6e 50 61 74 68 6e 61 6d 65 2b 31  name[nPathname+1
2ea30 5d 2c 20 7a 55 72 69 2c 20 6e 55 72 69 29 3b 0a  ], zUri, nUri);.
2ea40 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65      memcpy(pPage
2ea50 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61  r->zJournal, zPa
2ea60 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  thname, nPathnam
2ea70 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  e);.    memcpy(&
2ea80 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
2ea90 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a  [nPathname], "-j
2eaa0 6f 75 72 6e 61 6c 5c 30 30 30 22 2c 20 38 2b 32  ournal\000", 8+2
2eab0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69  );.    sqlite3Fi
2eac0 6c 65 53 75 66 66 69 78 33 28 70 50 61 67 65 72  leSuffix3(pPager
2ead0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61  ->zFilename, pPa
2eae0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a  ger->zJournal);.
2eaf0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2eb00 4d 49 54 5f 57 41 4c 0a 20 20 20 20 70 50 61 67  MIT_WAL.    pPag
2eb10 65 72 2d 3e 7a 57 61 6c 20 3d 20 26 70 50 61 67  er->zWal = &pPag
2eb20 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61  er->zJournal[nPa
2eb30 74 68 6e 61 6d 65 2b 38 2b 31 5d 3b 0a 20 20 20  thname+8+1];.   
2eb40 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
2eb50 7a 57 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c  zWal, zPathname,
2eb60 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   nPathname);.   
2eb70 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
2eb80 3e 7a 57 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d  >zWal[nPathname]
2eb90 2c 20 22 2d 77 61 6c 5c 30 30 30 22 2c 20 34 2b  , "-wal\000", 4+
2eba0 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  1);.    sqlite3F
2ebb0 69 6c 65 53 75 66 66 69 78 33 28 70 50 61 67 65  ileSuffix3(pPage
2ebc0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50  r->zFilename, pP
2ebd0 61 67 65 72 2d 3e 7a 57 61 6c 29 3b 0a 23 65 6e  ager->zWal);.#en
2ebe0 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 44  dif.    sqlite3D
2ebf0 62 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61  bFree(0, zPathna
2ec00 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  me);.  }.  pPage
2ec10 72 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a  r->pVfs = pVfs;.
2ec20 20 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61    pPager->vfsFla
2ec30 67 73 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a 0a  gs = vfsFlags;..
2ec40 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 61    /* Open the pa
2ec50 67 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  ger file..  */. 
2ec60 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26   if( zFilename &
2ec70 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29  & zFilename[0] )
2ec80 7b 0a 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d  {.    int fout =
2ec90 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2eca0 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c         /* VFS fl
2ecb0 61 67 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  ags returned by 
2ecc0 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 20 20 72  xOpen() */.    r
2ecd0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
2ece0 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
2ecf0 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65  zFilename, pPage
2ed00 72 2d 3e 66 64 2c 20 76 66 73 46 6c 61 67 73 2c  r->fd, vfsFlags,
2ed10 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 61 73 73   &fout);.    ass
2ed20 65 72 74 28 20 21 6d 65 6d 44 62 20 29 3b 0a 23  ert( !memDb );.#
2ed30 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
2ed40 42 4c 45 5f 44 45 53 45 52 49 41 4c 49 5a 45 0a  BLE_DESERIALIZE.
2ed50 20 20 20 20 6d 65 6d 4a 4d 20 3d 20 28 66 6f 75      memJM = (fou
2ed60 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45  t&SQLITE_OPEN_ME
2ed70 4d 4f 52 59 29 21 3d 30 3b 0a 23 65 6e 64 69 66  MORY)!=0;.#endif
2ed80 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20  .    readOnly = 
2ed90 28 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45  (fout&SQLITE_OPE
2eda0 4e 5f 52 45 41 44 4f 4e 4c 59 29 21 3d 30 3b 0a  N_READONLY)!=0;.
2edb0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66  .    /* If the f
2edc0 69 6c 65 20 77 61 73 20 73 75 63 63 65 73 73 66  ile was successf
2edd0 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20  ully opened for 
2ede0 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73  read/write acces
2edf0 73 2c 0a 20 20 20 20 2a 2a 20 63 68 6f 6f 73 65  s,.    ** choose
2ee00 20 61 20 64 65 66 61 75 6c 74 20 70 61 67 65 20   a default page 
2ee10 73 69 7a 65 20 69 6e 20 63 61 73 65 20 77 65 20  size in case we 
2ee20 68 61 76 65 20 74 6f 20 63 72 65 61 74 65 20 74  have to create t
2ee30 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
2ee40 73 65 20 66 69 6c 65 2e 20 54 68 65 20 64 65 66  se file. The def
2ee50 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69  ault page size i
2ee60 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66  s the maximum of
2ee70 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
2ee80 20 20 20 2b 20 53 51 4c 49 54 45 5f 44 45 46 41     + SQLITE_DEFA
2ee90 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c 0a 20  ULT_PAGE_SIZE,. 
2eea0 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 76     **    + The v
2eeb0 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
2eec0 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72   sqlite3OsSector
2eed0 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 20 20  Size().    **   
2eee0 20 2b 20 54 68 65 20 6c 61 72 67 65 73 74 20 70   + The largest p
2eef0 61 67 65 20 73 69 7a 65 20 74 68 61 74 20 63 61  age size that ca
2ef00 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f  n be written ato
2ef10 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20 2a 2f 0a  mically..    */.
2ef20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2ef30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
2ef40 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33  nt iDc = sqlite3
2ef50 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
2ef60 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
2ef70 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  fd);.      if( !
2ef80 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
2ef90 20 20 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a      setSectorSiz
2efa0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  e(pPager);.     
2efb0 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
2efc0 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2efd0 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ZE<=SQLITE_MAX_D
2efe0 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2eff0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
2f000 7a 50 61 67 65 44 66 6c 74 3c 70 50 61 67 65 72  zPageDflt<pPager
2f010 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 29 7b 0a  ->sectorSize ){.
2f020 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50            if( pP
2f030 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
2f040 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41  >SQLITE_MAX_DEFA
2f050 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b  ULT_PAGE_SIZE ){
2f060 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 50  .            szP
2f070 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45  ageDflt = SQLITE
2f080 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
2f090 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20  E_SIZE;.        
2f0a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2f0b0 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20       szPageDflt 
2f0c0 3d 20 28 75 33 32 29 70 50 61 67 65 72 2d 3e 73  = (u32)pPager->s
2f0d0 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20  ectorSize;.     
2f0e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2f0f0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
2f100 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
2f110 54 45 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  TE.        {.   
2f120 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20         int ii;. 
2f130 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2f140 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
2f150 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29  MIC512==(512>>8)
2f160 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
2f170 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  ert(SQLITE_IOCAP
2f180 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35  _ATOMIC64K==(655
2f190 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20  36>>8));.       
2f1a0 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
2f1b0 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
2f1c0 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a  E_SIZE<=65536);.
2f1d0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 69            for(ii
2f1e0 3d 73 7a 50 61 67 65 44 66 6c 74 3b 20 69 69 3c  =szPageDflt; ii<
2f1f0 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41  =SQLITE_MAX_DEFA
2f200 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69  ULT_PAGE_SIZE; i
2f210 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20 20 20  i=ii*2){.       
2f220 20 20 20 20 20 69 66 28 20 69 44 63 26 28 53 51       if( iDc&(SQ
2f230 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
2f240 43 7c 28 69 69 3e 3e 38 29 29 20 29 7b 0a 20 20  C|(ii>>8)) ){.  
2f250 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 50 61              szPa
2f260 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a 20 20 20  geDflt = ii;.   
2f270 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2f280 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2f290 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a  .#endif.      }.
2f2a0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f        pPager->no
2f2b0 4c 6f 63 6b 20 3d 20 73 71 6c 69 74 65 33 5f 75  Lock = sqlite3_u
2f2c0 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 46 69 6c 65  ri_boolean(zFile
2f2d0 6e 61 6d 65 2c 20 22 6e 6f 6c 6f 63 6b 22 2c 20  name, "nolock", 
2f2e0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69  0);.      if( (i
2f2f0 44 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 43 41  Dc & SQLITE_IOCA
2f300 50 5f 49 4d 4d 55 54 41 42 4c 45 29 21 3d 30 0a  P_IMMUTABLE)!=0.
2f310 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
2f320 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 46  3_uri_boolean(zF
2f330 69 6c 65 6e 61 6d 65 2c 20 22 69 6d 6d 75 74 61  ilename, "immuta
2f340 62 6c 65 22 2c 20 30 29 20 29 7b 0a 20 20 20 20  ble", 0) ){.    
2f350 20 20 20 20 20 20 76 66 73 46 6c 61 67 73 20 7c        vfsFlags |
2f360 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
2f370 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20  ADONLY;.        
2f380 20 20 67 6f 74 6f 20 61 63 74 5f 6c 69 6b 65 5f    goto act_like_
2f390 74 65 6d 70 5f 66 69 6c 65 3b 0a 20 20 20 20 20  temp_file;.     
2f3a0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
2f3b0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 74 65  {.    /* If a te
2f3c0 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20  mporary file is 
2f3d0 72 65 71 75 65 73 74 65 64 2c 20 69 74 20 69 73  requested, it is
2f3e0 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d 6d 65   not opened imme
2f3f0 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20  diately..    ** 
2f400 49 6e 20 74 68 69 73 20 63 61 73 65 20 77 65 20  In this case we 
2f410 61 63 63 65 70 74 20 74 68 65 20 64 65 66 61 75  accept the defau
2f420 6c 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e 64  lt page size and
2f430 20 64 65 6c 61 79 20 61 63 74 75 61 6c 6c 79 0a   delay actually.
2f440 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20 74      ** opening t
2f450 68 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74 68  he file until th
2f460 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20  e first call to 
2f470 4f 73 57 72 69 74 65 28 29 2e 0a 20 20 20 20 2a  OsWrite()..    *
2f480 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62 72  *.    ** This br
2f490 61 6e 63 68 20 69 73 20 61 6c 73 6f 20 72 75 6e  anch is also run
2f4a0 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   for an in-memor
2f4b0 79 20 64 61 74 61 62 61 73 65 2e 20 41 6e 20 69  y database. An i
2f4c0 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a 20  n-memory.    ** 
2f4d0 64 61 74 61 62 61 73 65 20 69 73 20 74 68 65 20  database is the 
2f4e0 73 61 6d 65 20 61 73 20 61 20 74 65 6d 70 2d 66  same as a temp-f
2f4f0 69 6c 65 20 74 68 61 74 20 69 73 20 6e 65 76 65  ile that is neve
2f500 72 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f  r written out to
2f510 0a 20 20 20 20 2a 2a 20 64 69 73 6b 20 61 6e 64  .    ** disk and
2f520 20 75 73 65 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f   uses an in-memo
2f530 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  ry rollback jour
2f540 6e 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  nal..    **.    
2f550 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 61  ** This branch a
2f560 6c 73 6f 20 72 75 6e 73 20 66 6f 72 20 66 69 6c  lso runs for fil
2f570 65 73 20 6d 61 72 6b 65 64 20 61 73 20 69 6d 6d  es marked as imm
2f580 75 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 20 0a  utable..    */ .
2f590 61 63 74 5f 6c 69 6b 65 5f 74 65 6d 70 5f 66 69  act_like_temp_fi
2f5a0 6c 65 3a 0a 20 20 20 20 74 65 6d 70 46 69 6c 65  le:.    tempFile
2f5b0 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72   = 1;.    pPager
2f5c0 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
2f5d0 5f 52 45 41 44 45 52 3b 20 20 20 20 20 2f 2a 20  _READER;     /* 
2f5e0 50 72 65 74 65 6e 64 20 77 65 20 61 6c 72 65 61  Pretend we alrea
2f5f0 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 20 2a  dy have a lock *
2f600 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c  /.    pPager->eL
2f610 6f 63 6b 20 3d 20 45 58 43 4c 55 53 49 56 45 5f  ock = EXCLUSIVE_
2f620 4c 4f 43 4b 3b 20 20 20 20 2f 2a 20 50 72 65 74  LOCK;    /* Pret
2f630 65 6e 64 20 77 65 20 61 72 65 20 69 6e 20 45 58  end we are in EX
2f640 43 4c 55 53 49 56 45 20 6d 6f 64 65 20 2a 2f 0a  CLUSIVE mode */.
2f650 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f      pPager->noLo
2f660 63 6b 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  ck = 1;         
2f670 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 20         /* Do no 
2f680 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 72  locking */.    r
2f690 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66 73 46 6c  eadOnly = (vfsFl
2f6a0 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ags&SQLITE_OPEN_
2f6b0 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 0a  READONLY);.  }..
2f6c0 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
2f6d0 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61 67 65 72  ng call to Pager
2f6e0 53 65 74 50 61 67 65 73 69 7a 65 28 29 20 73 65  SetPagesize() se
2f6f0 72 76 65 73 20 74 6f 20 73 65 74 20 74 68 65 20  rves to set the 
2f700 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a 2a 20 50  value of .  ** P
2f710 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 61 6e  ager.pageSize an
2f720 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68  d to allocate th
2f730 65 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63  e Pager.pTmpSpac
2f740 65 20 62 75 66 66 65 72 2e 0a 20 20 2a 2f 0a 20  e buffer..  */. 
2f750 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2f760 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
2f770 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d  ( pPager->memDb=
2f780 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  =0 );.    rc = s
2f790 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
2f7a0 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26  gesize(pPager, &
2f7b0 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d 31 29 3b  szPageDflt, -1);
2f7c0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
2f7d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
2f7e0 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61    }..  /* Initia
2f7f0 6c 69 7a 65 20 74 68 65 20 50 43 61 63 68 65 20  lize the PCache 
2f800 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 69 66 28  object. */.  if(
2f810 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2f820 7b 0a 20 20 20 20 6e 45 78 74 72 61 20 3d 20 52  {.    nExtra = R
2f830 4f 55 4e 44 38 28 6e 45 78 74 72 61 29 3b 0a 20  OUND8(nExtra);. 
2f840 20 20 20 61 73 73 65 72 74 28 20 6e 45 78 74 72     assert( nExtr
2f850 61 3e 3d 38 20 26 26 20 6e 45 78 74 72 61 3c 31  a>=8 && nExtra<1
2f860 30 30 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  000 );.    rc = 
2f870 73 71 6c 69 74 65 33 50 63 61 63 68 65 4f 70 65  sqlite3PcacheOpe
2f880 6e 28 73 7a 50 61 67 65 44 66 6c 74 2c 20 6e 45  n(szPageDflt, nE
2f890 78 74 72 61 2c 20 21 6d 65 6d 44 62 2c 0a 20 20  xtra, !memDb,.  
2f8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f8b0 20 20 20 20 20 21 6d 65 6d 44 62 3f 70 61 67 65       !memDb?page
2f8c0 72 53 74 72 65 73 73 3a 30 2c 20 28 76 6f 69 64  rStress:0, (void
2f8d0 20 2a 29 70 50 61 67 65 72 2c 20 70 50 61 67 65   *)pPager, pPage
2f8e0 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 7d  r->pPCache);.  }
2f8f0 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72  ..  /* If an err
2f900 6f 72 20 6f 63 63 75 72 72 65 64 20 61 62 6f 76  or occurred abov
2f910 65 2c 20 66 72 65 65 20 74 68 65 20 20 50 61 67  e, free the  Pag
2f920 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  er structure and
2f930 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e   close the file.
2f940 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 21 3d  .  */.  if( rc!=
2f950 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2f960 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
2f970 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
2f980 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
2f990 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61  (pPager->pTmpSpa
2f9a0 63 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ce);.    sqlite3
2f9b0 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20  _free(pPager);. 
2f9c0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2f9d0 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  }..  PAGERTRACE(
2f9e0 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c  ("OPEN %d %s\n",
2f9f0 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 70 50   FILEHANDLEID(pP
2fa00 61 67 65 72 2d 3e 66 64 29 2c 20 70 50 61 67 65  ager->fd), pPage
2fa10 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a  r->zFilename));.
2fa20 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50 45 4e    IOTRACE(("OPEN
2fa30 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61 67 65   %p %s\n", pPage
2fa40 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  r, pPager->zFile
2fa50 6e 61 6d 65 29 29 0a 0a 20 20 70 50 61 67 65 72  name))..  pPager
2fa60 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28  ->useJournal = (
2fa70 75 38 29 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20  u8)useJournal;. 
2fa80 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
2fa90 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  Open = 0; */.  /
2faa0 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  * pPager->stmtIn
2fab0 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  Use = 0; */.  /*
2fac0 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20   pPager->nRef = 
2fad0 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
2fae0 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b  r->stmtSize = 0;
2faf0 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2fb00 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20  >stmtJSize = 0; 
2fb10 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2fb20 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  nPage = 0; */.  
2fb30 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d  pPager->mxPgno =
2fb40 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45   SQLITE_MAX_PAGE
2fb50 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70 50 61  _COUNT;.  /* pPa
2fb60 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
2fb70 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20  ER_UNLOCK; */.  
2fb80 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  /* pPager->errMa
2fb90 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  sk = 0; */.  pPa
2fba0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20  ger->tempFile = 
2fbb0 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 0a 20 20  (u8)tempFile;.  
2fbc0 61 73 73 65 72 74 28 20 74 65 6d 70 46 69 6c 65  assert( tempFile
2fbd0 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
2fbe0 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20  ODE_NORMAL .    
2fbf0 20 20 20 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c        || tempFil
2fc00 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
2fc10 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29  MODE_EXCLUSIVE )
2fc20 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
2fc30 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
2fc40 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20  CLUSIVE==1 );.  
2fc50 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
2fc60 65 4d 6f 64 65 20 3d 20 28 75 38 29 74 65 6d 70  eMode = (u8)temp
2fc70 46 69 6c 65 3b 20 0a 20 20 70 50 61 67 65 72 2d  File; .  pPager-
2fc80 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
2fc90 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
2fca0 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d  ile;.  pPager->m
2fcb0 65 6d 44 62 20 3d 20 28 75 38 29 6d 65 6d 44 62  emDb = (u8)memDb
2fcc0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64  ;.  pPager->read
2fcd0 4f 6e 6c 79 20 3d 20 28 75 38 29 72 65 61 64 4f  Only = (u8)readO
2fce0 6e 6c 79 3b 0a 20 20 61 73 73 65 72 74 28 20 75  nly;.  assert( u
2fcf0 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 50 61  seJournal || pPa
2fd00 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
2fd10 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  .  pPager->noSyn
2fd20 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  c = pPager->temp
2fd30 46 69 6c 65 3b 0a 20 20 69 66 28 20 70 50 61 67  File;.  if( pPag
2fd40 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
2fd50 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2fd60 2d 3e 66 75 6c 6c 53 79 6e 63 3d 3d 30 20 29 3b  ->fullSync==0 );
2fd70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2fd80 67 65 72 2d 3e 65 78 74 72 61 53 79 6e 63 3d 3d  ger->extraSync==
2fd90 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2fda0 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
2fdb0 67 73 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  gs==0 );.    ass
2fdc0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 77 61 6c  ert( pPager->wal
2fdd0 53 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a  SyncFlags==0 );.
2fde0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
2fdf0 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20  ger->fullSync = 
2fe00 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  1;.    pPager->e
2fe10 78 74 72 61 53 79 6e 63 20 3d 20 30 3b 0a 20 20  xtraSync = 0;.  
2fe20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c    pPager->syncFl
2fe30 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
2fe40 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50  C_NORMAL;.    pP
2fe50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61  ager->walSyncFla
2fe60 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
2fe70 5f 4e 4f 52 4d 41 4c 20 7c 20 28 53 51 4c 49 54  _NORMAL | (SQLIT
2fe80 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3c 3c 32  E_SYNC_NORMAL<<2
2fe90 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67  );.  }.  /* pPag
2fea0 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 20  er->pFirst = 0; 
2feb0 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2fec0 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30  pFirstSynced = 0
2fed0 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2fee0 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a  ->pLast = 0; */.
2fef0 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61    pPager->nExtra
2ff00 20 3d 20 28 75 31 36 29 6e 45 78 74 72 61 3b 0a   = (u16)nExtra;.
2ff10 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
2ff20 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 53 51 4c  lSizeLimit = SQL
2ff30 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a 4f 55 52  ITE_DEFAULT_JOUR
2ff40 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b 0a  NAL_SIZE_LIMIT;.
2ff50 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
2ff60 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
2ff70 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 73 65  tempFile );.  se
2ff80 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  tSectorSize(pPag
2ff90 65 72 29 3b 0a 20 20 69 66 28 20 21 75 73 65 4a  er);.  if( !useJ
2ffa0 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 70 50  ournal ){.    pP
2ffb0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
2ffc0 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  e = PAGER_JOURNA
2ffd0 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20 7d 65 6c  LMODE_OFF;.  }el
2ffe0 73 65 20 69 66 28 20 6d 65 6d 44 62 20 7c 7c 20  se if( memDb || 
2fff0 6d 65 6d 4a 4d 20 29 7b 0a 20 20 20 20 70 50 61  memJM ){.    pPa
30000 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
30010 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c   = PAGER_JOURNAL
30020 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d  MODE_MEMORY;.  }
30030 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 78 42  .  /* pPager->xB
30040 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20  usyHandler = 0; 
30050 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
30060 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20  pBusyHandlerArg 
30070 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
30080 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52  ->xReiniter = xR
30090 65 69 6e 69 74 3b 0a 20 20 73 65 74 47 65 74 74  einit;.  setGett
300a0 65 72 4d 65 74 68 6f 64 28 70 50 61 67 65 72 29  erMethod(pPager)
300b0 3b 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50  ;.  /* memset(pP
300c0 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20  ager->aHash, 0, 
300d0 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61  sizeof(pPager->a
300e0 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20 2f 2a 20  Hash)); */.  /* 
300f0 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 20 3d  pPager->szMmap =
30100 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
30110 4d 4d 41 50 5f 53 49 5a 45 20 2f 2f 20 77 69 6c  MMAP_SIZE // wil
30120 6c 20 62 65 20 73 65 74 20 62 79 20 62 74 72 65  l be set by btre
30130 65 2e 63 20 2a 2f 0a 0a 20 20 2a 70 70 50 61 67  e.c */..  *ppPag
30140 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 72  er = pPager;.  r
30150 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
30160 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  .}..../*.** This
30170 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
30180 6c 65 64 20 61 66 74 65 72 20 74 72 61 6e 73 69  led after transi
30190 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 50 41 47  tioning from PAG
301a0 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a 20  ER_UNLOCK to.** 
301b0 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74 61  PAGER_SHARED sta
301c0 74 65 2e 20 49 74 20 74 65 73 74 73 20 69 66 20  te. It tests if 
301d0 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a  there is a hot j
301e0 6f 75 72 6e 61 6c 20 70 72 65 73 65 6e 74 20 69  ournal present i
301f0 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79  n.** the file-sy
30200 73 74 65 6d 20 66 6f 72 20 74 68 65 20 67 69 76  stem for the giv
30210 65 6e 20 70 61 67 65 72 2e 20 41 20 68 6f 74 20  en pager. A hot 
30220 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74  journal is one t
30230 68 61 74 20 0a 2a 2a 20 6e 65 65 64 73 20 74 6f  hat .** needs to
30240 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   be played back.
30250 20 41 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   According to th
30260 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 68  is function, a h
30270 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  ot-journal.** fi
30280 6c 65 20 65 78 69 73 74 73 20 69 66 20 74 68 65  le exists if the
30290 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65   following crite
302a0 72 69 61 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a  ria are met:.**.
302b0 2a 2a 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e  **   * The journ
302c0 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 69  al file exists i
302d0 6e 20 74 68 65 20 66 69 6c 65 20 73 79 73 74 65  n the file syste
302e0 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f  m, and.**   * No
302f0 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61   process holds a
30300 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65   RESERVED or gre
30310 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ater lock on the
30320 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
30330 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64  and.**   * The d
30340 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 74 73  atabase file its
30350 65 6c 66 20 69 73 20 67 72 65 61 74 65 72 20 74  elf is greater t
30360 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73  han 0 bytes in s
30370 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  ize, and.**   * 
30380 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  The first byte o
30390 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
303a0 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20 69 73  le exists and is
303b0 20 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a   not 0x00..**.**
303c0 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
303d0 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
303e0 62 61 73 65 20 66 69 6c 65 20 69 73 20 30 20 62  base file is 0 b
303f0 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ut a journal fil
30400 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68 61  e.** exists, tha
30410 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61 6e  t is probably an
30420 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66   old journal lef
30430 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72  t over from a pr
30440 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ior.** database 
30450 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
30460 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  me. In this case
30470 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
30480 65 20 69 73 0a 2a 2a 20 6a 75 73 74 20 64 65 6c  e is.** just del
30490 65 74 65 64 20 75 73 69 6e 67 20 4f 73 44 65 6c  eted using OsDel
304a0 65 74 65 2c 20 2a 70 45 78 69 73 74 73 20 69 73  ete, *pExists is
304b0 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51   set to 0 and SQ
304c0 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65  LITE_OK.** is re
304d0 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  turned..**.** Th
304e0 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
304f0 6e 6f 74 20 63 68 65 63 6b 20 69 66 20 74 68 65  not check if the
30500 72 65 20 69 73 20 61 20 6d 61 73 74 65 72 20 6a  re is a master j
30510 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 0a  ournal filename.
30520 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ** at the end of
30530 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68   the file. If th
30540 65 72 65 20 69 73 2c 20 61 6e 64 20 74 68 61 74  ere is, and that
30550 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
30560 66 69 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74  file.** does not
30570 20 65 78 69 73 74 2c 20 74 68 65 6e 20 74 68 65   exist, then the
30580 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
30590 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 2e   not really hot.
305a0 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73 65   In this.** case
305b0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
305c0 6c 6c 20 72 65 74 75 72 6e 20 61 20 66 61 6c 73  ll return a fals
305d0 65 2d 70 6f 73 69 74 69 76 65 2e 20 54 68 65 20  e-positive. The 
305e0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
305f0 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  .** routine will
30600 20 64 69 73 63 6f 76 65 72 20 74 68 61 74 20 74   discover that t
30610 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
30620 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f  is not really ho
30630 74 20 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20 6e  t and .** will n
30640 6f 74 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  ot roll it back.
30650 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 68 6f 74   .**.** If a hot
30660 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73  -journal file is
30670 20 66 6f 75 6e 64 20 74 6f 20 65 78 69 73 74 2c   found to exist,
30680 20 2a 70 45 78 69 73 74 73 20 69 73 20 73 65 74   *pExists is set
30690 20 74 6f 20 31 20 61 6e 64 20 0a 2a 2a 20 53 51   to 1 and .** SQ
306a0 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
306b0 2e 20 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72  . If no hot-jour
306c0 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73  nal file is pres
306d0 65 6e 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73  ent, *pExists is
306e0 0a 2a 2a 20 73 65 74 20 74 6f 20 30 20 61 6e 64  .** set to 0 and
306f0 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
30700 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ned. If an IO er
30710 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
30720 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 64 65   trying.** to de
30730 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20  termine whether 
30740 6f 72 20 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f 75  or not a hot-jou
30750 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
30760 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 0a 2a  , the IO error.*
30770 2a 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  * code is return
30780 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65  ed and the value
30790 20 6f 66 20 2a 70 45 78 69 73 74 73 20 69 73 20   of *pExists is 
307a0 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74  undefined..*/.st
307b0 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74 4a  atic int hasHotJ
307c0 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
307d0 61 67 65 72 2c 20 69 6e 74 20 2a 70 45 78 69 73  ager, int *pExis
307e0 74 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ts){.  sqlite3_v
307f0 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20  fs * const pVfs 
30800 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
30810 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
30820 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
30830 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
30840 2f 0a 20 20 69 6e 74 20 65 78 69 73 74 73 20 3d  /.  int exists =
30850 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   1;             
30860 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6a    /* True if a j
30870 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70  ournal file is p
30880 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  resent */.  int 
30890 6a 72 6e 6c 4f 70 65 6e 20 3d 20 21 21 69 73 4f  jrnlOpen = !!isO
308a0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
308b0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
308c0 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
308d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  );.  assert( isO
308e0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
308f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
30900 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
30910 45 52 5f 4f 50 45 4e 20 29 3b 0a 0a 20 20 61 73  ER_OPEN );..  as
30920 73 65 72 74 28 20 6a 72 6e 6c 4f 70 65 6e 3d 3d  sert( jrnlOpen==
30930 30 20 7c 7c 20 28 20 73 71 6c 69 74 65 33 4f 73  0 || ( sqlite3Os
30940 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
30950 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 6a 66  stics(pPager->jf
30960 64 29 20 26 0a 20 20 20 20 53 51 4c 49 54 45 5f  d) &.    SQLITE_
30970 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c  IOCAP_UNDELETABL
30980 45 5f 57 48 45 4e 5f 4f 50 45 4e 0a 20 20 29 29  E_WHEN_OPEN.  ))
30990 3b 0a 0a 20 20 2a 70 45 78 69 73 74 73 20 3d 20  ;..  *pExists = 
309a0 30 3b 0a 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70  0;.  if( !jrnlOp
309b0 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  en ){.    rc = s
309c0 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
309d0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
309e0 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43  urnal, SQLITE_AC
309f0 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78  CESS_EXISTS, &ex
30a00 69 73 74 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ists);.  }.  if(
30a10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
30a20 26 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20  & exists ){.    
30a30 69 6e 74 20 6c 6f 63 6b 65 64 20 3d 20 30 3b 20  int locked = 0; 
30a40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
30a50 72 75 65 20 69 66 20 73 6f 6d 65 20 70 72 6f 63  rue if some proc
30a60 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45  ess holds a RESE
30a70 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20  RVED lock */..  
30a80 20 20 2f 2a 20 52 61 63 65 20 63 6f 6e 64 69 74    /* Race condit
30a90 69 6f 6e 20 68 65 72 65 3a 20 20 41 6e 6f 74 68  ion here:  Anoth
30aa0 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74  er process might
30ab0 20 68 61 76 65 20 62 65 65 6e 20 68 6f 6c 64 69   have been holdi
30ac0 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 68  ng the.    ** th
30ad0 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  e RESERVED lock 
30ae0 61 6e 64 20 68 61 76 65 20 61 20 6a 6f 75 72 6e  and have a journ
30af0 61 6c 20 6f 70 65 6e 20 61 74 20 74 68 65 20 73  al open at the s
30b00 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29  qlite3OsAccess()
30b10 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62   .    ** call ab
30b20 6f 76 65 2c 20 62 75 74 20 74 68 65 6e 20 64 65  ove, but then de
30b30 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
30b40 20 61 6e 64 20 64 72 6f 70 20 74 68 65 20 6c 6f   and drop the lo
30b50 63 6b 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a  ck before.    **
30b60 20 77 65 20 67 65 74 20 74 6f 20 74 68 65 20 66   we get to the f
30b70 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33  ollowing sqlite3
30b80 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  OsCheckReservedL
30b90 6f 63 6b 28 29 20 63 61 6c 6c 2e 20 20 49 66 20  ock() call.  If 
30ba0 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 73 20 74  that.    ** is t
30bb0 68 65 20 63 61 73 65 2c 20 74 68 69 73 20 72 6f  he case, this ro
30bc0 75 74 69 6e 65 20 6d 69 67 68 74 20 74 68 69 6e  utine might thin
30bd0 6b 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74  k there is a hot
30be0 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 0a 20 20   journal when.  
30bf0 20 20 2a 2a 20 69 6e 20 66 61 63 74 20 74 68 65    ** in fact the
30c00 72 65 20 69 73 20 6e 6f 6e 65 2e 20 20 54 68 69  re is none.  Thi
30c10 73 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 66  s results in a f
30c20 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 20 77 68  alse-positive wh
30c30 69 63 68 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  ich will.    ** 
30c40 62 65 20 64 65 61 6c 74 20 77 69 74 68 20 62 79  be dealt with by
30c50 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20 72 6f   the playback ro
30c60 75 74 69 6e 65 2e 20 20 54 69 63 6b 65 74 20 23  utine.  Ticket #
30c70 33 38 38 33 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  3883..    */.   
30c80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 43   rc = sqlite3OsC
30c90 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
30ca0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f  (pPager->fd, &lo
30cb0 63 6b 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72  cked);.    if( r
30cc0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
30cd0 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 20  !locked ){.     
30ce0 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20   Pgno nPage;    
30cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30d00 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
30d10 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
30d20 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73 65 72   */..      asser
30d30 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  t( pPager->tempF
30d40 69 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ile==0 );.      
30d50 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  rc = pagerPageco
30d60 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61  unt(pPager, &nPa
30d70 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
30d80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
30d90 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
30da0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 7a 65  e database is ze
30db0 72 6f 20 70 61 67 65 73 20 69 6e 20 73 69 7a 65  ro pages in size
30dc0 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61  , that means tha
30dd0 74 20 65 69 74 68 65 72 20 28 31 29 20 74 68 65  t either (1) the
30de0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72  .        ** jour
30df0 6e 61 6c 20 69 73 20 61 20 72 65 6d 6e 61 6e 74  nal is a remnant
30e00 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 64 61   from a prior da
30e10 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20  tabase with the 
30e20 73 61 6d 65 20 6e 61 6d 65 20 77 68 65 72 65 0a  same name where.
30e30 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64          ** the d
30e40 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 75 74  atabase file but
30e50 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c   not the journal
30e60 20 77 61 73 20 64 65 6c 65 74 65 64 2c 20 6f 72   was deleted, or
30e70 20 28 32 29 20 74 68 65 20 69 6e 69 74 69 61 6c   (2) the initial
30e80 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e  .        ** tran
30e90 73 61 63 74 69 6f 6e 20 74 68 61 74 20 70 6f 70  saction that pop
30ea0 75 6c 61 74 65 73 20 61 20 6e 65 77 20 64 61 74  ulates a new dat
30eb0 61 62 61 73 65 20 69 73 20 62 65 69 6e 67 20 72  abase is being r
30ec0 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20  olled back..    
30ed0 20 20 20 20 2a 2a 20 49 6e 20 65 69 74 68 65 72      ** In either
30ee0 20 63 61 73 65 2c 20 74 68 65 20 6a 6f 75 72 6e   case, the journ
30ef0 61 6c 20 66 69 6c 65 20 63 61 6e 20 62 65 20 64  al file can be d
30f00 65 6c 65 74 65 64 2e 20 20 48 6f 77 65 76 65 72  eleted.  However
30f10 2c 20 74 61 6b 65 20 63 61 72 65 0a 20 20 20 20  , take care.    
30f20 20 20 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 64 65      ** not to de
30f30 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
30f40 20 66 69 6c 65 20 69 66 20 69 74 20 69 73 20 61   file if it is a
30f50 6c 72 65 61 64 79 20 6f 70 65 6e 20 64 75 65 20  lready open due 
30f60 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f  to.        ** jo
30f70 75 72 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49  urnal_mode=PERSI
30f80 53 54 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ST..        */. 
30f90 20 20 20 20 20 20 20 69 66 28 20 6e 50 61 67 65         if( nPage
30fa0 3d 3d 30 20 26 26 20 21 6a 72 6e 6c 4f 70 65 6e  ==0 && !jrnlOpen
30fb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
30fc0 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
30fd0 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
30fe0 20 20 20 20 69 66 28 20 70 61 67 65 72 4c 6f 63      if( pagerLoc
30ff0 6b 44 62 28 70 50 61 67 65 72 2c 20 52 45 53 45  kDb(pPager, RESE
31000 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49  RVED_LOCK)==SQLI
31010 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
31020 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
31030 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61 67 65  lete(pVfs, pPage
31040 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b  r->zJournal, 0);
31050 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
31060 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
31070 69 76 65 4d 6f 64 65 20 29 20 70 61 67 65 72 55  iveMode ) pagerU
31080 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  nlockDb(pPager, 
31090 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
310a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
310b0 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
310c0 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
310d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
310e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f         /* The jo
310f0 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
31100 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 63  s and no other c
31110 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 20  onnection has a 
31120 72 65 73 65 72 76 65 64 0a 20 20 20 20 20 20 20  reserved.       
31130 20 20 20 2a 2a 20 6f 72 20 67 72 65 61 74 65 72     ** or greater
31140 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
31150 61 62 61 73 65 20 66 69 6c 65 2e 20 4e 6f 77 20  abase file. Now 
31160 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 72 65  check that there
31170 20 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   is.          **
31180 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6e 6f   at least one no
31190 6e 2d 7a 65 72 6f 20 62 79 74 65 73 20 61 74 20  n-zero bytes at 
311a0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
311b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
311c0 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74           ** If t
311d0 68 65 72 65 20 69 73 2c 20 74 68 65 6e 20 77 65  here is, then we
311e0 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20 6a   consider this j
311f0 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 68 6f 74  ournal to be hot
31200 2e 20 49 66 20 6e 6f 74 2c 20 0a 20 20 20 20 20  . If not, .     
31210 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62       ** it can b
31220 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20 20 20 20  e ignored..     
31230 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
31240 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20    if( !jrnlOpen 
31250 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
31260 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50  nt f = SQLITE_OP
31270 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49  EN_READONLY|SQLI
31280 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
31290 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20  RNAL;.          
312a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
312b0 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
312c0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
312d0 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 29  ger->jfd, f, &f)
312e0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
312f0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
31300 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
31310 20 20 20 20 20 20 20 20 20 75 38 20 66 69 72 73           u8 firs
31320 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
31330 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
31340 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66  sRead(pPager->jf
31350 64 2c 20 28 76 6f 69 64 20 2a 29 26 66 69 72 73  d, (void *)&firs
31360 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 1, 0);.      
31370 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
31380 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
31390 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20  _READ ){.       
313a0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
313b0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
313c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
313d0 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29   if( !jrnlOpen )
313e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
313f0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
31400 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
31410 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
31420 20 20 20 20 20 20 20 2a 70 45 78 69 73 74 73 20         *pExists 
31430 3d 20 28 66 69 72 73 74 21 3d 30 29 3b 0a 20 20  = (first!=0);.  
31440 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
31450 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e  ( rc==SQLITE_CAN
31460 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 20  TOPEN ){.       
31470 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63 61       /* If we ca
31480 6e 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20 72 6f  nnot open the ro
31490 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66  llback journal f
314a0 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ile in order to 
314b0 73 65 65 20 69 66 0a 20 20 20 20 20 20 20 20 20  see if.         
314c0 20 20 20 2a 2a 20 69 74 20 68 61 73 20 61 20 7a     ** it has a z
314d0 65 72 6f 20 68 65 61 64 65 72 2c 20 74 68 61 74  ero header, that
314e0 20 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f   might be due to
314f0 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 2c 20 6f   an I/O error, o
31500 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  r.            **
31510 20 69 74 20 6d 69 67 68 74 20 62 65 20 64 75 65   it might be due
31520 20 74 6f 20 74 68 65 20 72 61 63 65 20 63 6f 6e   to the race con
31530 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64  dition described
31540 20 61 62 6f 76 65 20 61 6e 64 20 69 6e 0a 20 20   above and in.  
31550 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 69 63            ** tic
31560 6b 65 74 20 23 33 38 38 33 2e 20 20 45 69 74 68  ket #3883.  Eith
31570 65 72 20 77 61 79 2c 20 61 73 73 75 6d 65 20 74  er way, assume t
31580 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
31590 69 73 20 68 6f 74 2e 0a 20 20 20 20 20 20 20 20  is hot..        
315a0 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68      ** This migh
315b0 74 20 62 65 20 61 20 66 61 6c 73 65 20 70 6f 73  t be a false pos
315c0 69 74 69 76 65 2e 20 20 42 75 74 20 69 66 20 69  itive.  But if i
315d0 74 20 69 73 2c 20 74 68 65 6e 20 74 68 65 0a 20  t is, then the. 
315e0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 75             ** au
315f0 74 6f 6d 61 74 69 63 20 6a 6f 75 72 6e 61 6c 20  tomatic journal 
31600 70 6c 61 79 62 61 63 6b 20 61 6e 64 20 72 65 63  playback and rec
31610 6f 76 65 72 79 20 6d 65 63 68 61 6e 69 73 6d 20  overy mechanism 
31620 77 69 6c 6c 20 64 65 61 6c 0a 20 20 20 20 20 20  will deal.      
31630 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 69 74        ** with it
31640 20 75 6e 64 65 72 20 61 6e 20 45 58 43 4c 55 53   under an EXCLUS
31650 49 56 45 20 6c 6f 63 6b 20 77 68 65 72 65 20 77  IVE lock where w
31660 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f  e do not need to
31670 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
31680 77 6f 72 72 79 20 73 6f 20 6d 75 63 68 20 77 69  worry so much wi
31690 74 68 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f  th race conditio
316a0 6e 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ns..            
316b0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  */.            *
316c0 70 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20 20  pExists = 1;.   
316d0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
316e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
316f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
31700 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
31710 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
31720 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
31730 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
31740 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72  to obtain a shar
31750 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ed lock on the d
31760 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
31770 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74   It is illegal t
31780 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61  o call sqlite3Pa
31790 67 65 72 47 65 74 28 29 20 75 6e 74 69 6c 20 61  gerGet() until a
317a0 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
317b0 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 73  on.** has been s
317c0 75 63 63 65 73 73 66 75 6c 6c 79 20 63 61 6c 6c  uccessfully call
317d0 65 64 2e 20 49 66 20 61 20 73 68 61 72 65 64 2d  ed. If a shared-
317e0 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20  lock is already 
317f0 68 65 6c 64 20 77 68 65 6e 0a 2a 2a 20 74 68 69  held when.** thi
31800 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
31810 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
31820 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  -op..**.** The f
31830 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74 69  ollowing operati
31840 6f 6e 73 20 61 72 65 20 61 6c 73 6f 20 70 65 72  ons are also per
31850 66 6f 72 6d 65 64 20 62 79 20 74 68 69 73 20 66  formed by this f
31860 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20  unction..**.**  
31870 20 31 29 20 49 66 20 74 68 65 20 70 61 67 65 72   1) If the pager
31880 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e   is currently in
31890 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
318a0 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a  e (no lock held.
318b0 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20 64  **      on the d
318c0 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20 74  atabase file), t
318d0 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69  hen an attempt i
318e0 73 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e  s made to obtain
318f0 20 61 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45   a.**      SHARE
31900 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  D lock on the da
31910 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d  tabase file. Imm
31920 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f  ediately after o
31930 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20  btaining.**     
31940 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b   the SHARED lock
31950 2c 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  , the file-syste
31960 6d 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f 72  m is checked for
31970 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a   a hot-journal,.
31980 2a 2a 20 20 20 20 20 20 77 68 69 63 68 20 69 73  **      which is
31990 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 66 20   played back if 
319a0 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69  present. Followi
319b0 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e  ng any hot-journ
319c0 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c  al .**      roll
319d0 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e  back, the conten
319e0 74 73 20 6f 66 20 74 68 65 20 63 61 63 68 65 20  ts of the cache 
319f0 61 72 65 20 76 61 6c 69 64 61 74 65 64 20 62 79  are validated by
31a00 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20   checking.**    
31a10 20 20 74 68 65 20 27 63 68 61 6e 67 65 2d 63 6f    the 'change-co
31a20 75 6e 74 65 72 27 20 66 69 65 6c 64 20 6f 66 20  unter' field of 
31a30 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
31a40 65 20 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20  e header and.** 
31a50 20 20 20 20 20 64 69 73 63 61 72 64 65 64 20 69       discarded i
31a60 66 20 74 68 65 79 20 61 72 65 20 66 6f 75 6e 64  f they are found
31a70 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a   to be invalid..
31a80 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20 74 68  **.**   2) If th
31a90 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69  e pager is runni
31aa0 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  ng in exclusive-
31ab0 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65 20  mode, and there 
31ac0 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a  are currently.**
31ad0 20 20 20 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e        no outstan
31ae0 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
31af0 74 6f 20 61 6e 79 20 70 61 67 65 73 2c 20 61 6e  to any pages, an
31b00 64 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f  d is in the erro
31b10 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20  r state,.**     
31b20 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74   then an attempt
31b30 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 65 61   is made to clea
31b40 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  r the error stat
31b50 65 20 62 79 20 64 69 73 63 61 72 64 69 6e 67 0a  e by discarding.
31b60 2a 2a 20 20 20 20 20 20 74 68 65 20 63 6f 6e 74  **      the cont
31b70 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
31b80 20 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69   cache and rolli
31b90 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e  ng back any open
31ba0 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
31bb0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
31bc0 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
31bd0 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
31be0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
31bf0 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
31c00 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68 69 6c 65  .** occurs while
31c10 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64 61 74   locking the dat
31c20 61 62 61 73 65 2c 20 63 68 65 63 6b 69 6e 67 20  abase, checking 
31c30 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  for a hot-journa
31c40 6c 20 66 69 6c 65 20 6f 72 20 0a 2a 2a 20 72 6f  l file or .** ro
31c50 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75  lling back a jou
31c60 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 49  rnal file, the I
31c70 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
31c80 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
31c90 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 61   sqlite3PagerSha
31ca0 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70  redLock(Pager *p
31cb0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
31cc0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
31cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31ce0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
31cf0 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
31d00 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  e is only called
31d10 20 66 72 6f 6d 20 62 2d 74 72 65 65 20 61 6e 64   from b-tree and
31d20 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 72 65   only when there
31d30 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74   are no.  ** out
31d40 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 2e 20  standing pages. 
31d50 54 68 69 73 20 69 6d 70 6c 69 65 73 20 74 68 61  This implies tha
31d60 74 20 74 68 65 20 70 61 67 65 72 20 73 74 61 74  t the pager stat
31d70 65 20 73 68 6f 75 6c 64 20 65 69 74 68 65 72 0a  e should either.
31d80 20 20 2a 2a 20 62 65 20 4f 50 45 4e 20 6f 72 20    ** be OPEN or 
31d90 52 45 41 44 45 52 2e 20 52 45 41 44 45 52 20 69  READER. READER i
31da0 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20  s only possible 
31db0 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
31dc0 6f 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20  or was in .  ** 
31dd0 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73  exclusive access
31de0 20 6d 6f 64 65 2e 20 20 2a 2f 0a 20 20 61 73 73   mode.  */.  ass
31df0 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63  ert( sqlite3Pcac
31e00 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
31e10 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29  r->pPCache)==0 )
31e20 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
31e30 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
31e40 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
31e50 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
31e60 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c  te==PAGER_OPEN |
31e70 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
31e80 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  ==PAGER_READER )
31e90 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
31ea0 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
31eb0 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66 28  ITE_OK );..  if(
31ec0 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
31ed0 61 67 65 72 29 20 26 26 20 70 50 61 67 65 72 2d  ager) && pPager-
31ee0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
31ef0 50 45 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20 62  PEN ){.    int b
31f00 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 20  HotJournal = 1; 
31f10 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
31f20 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73   if there exists
31f30 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2d 66   a hot journal-f
31f40 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  ile */..    asse
31f50 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
31f60 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
31f70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c  ->tempFile==0 ||
31f80 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
31f90 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
31fa0 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ;..    rc = page
31fb0 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
31fc0 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f  Pager, SHARED_LO
31fd0 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  CK);.    if( rc!
31fe0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
31ff0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
32000 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f  er->eLock==NO_LO
32010 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c  CK || pPager->eL
32020 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock==UNKNOWN_LOC
32030 4b 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K );.      goto 
32040 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20  failed;.    }.. 
32050 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e     /* If a journ
32060 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  al file exists, 
32070 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20  and there is no 
32080 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
32090 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
320a0 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
320b0 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73 20  it either needs 
320c0 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
320d0 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20  k or deleted..  
320e0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
320f0 67 65 72 2d 3e 65 4c 6f 63 6b 3c 3d 53 48 41 52  ger->eLock<=SHAR
32100 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  ED_LOCK ){.     
32110 20 72 63 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72   rc = hasHotJour
32120 6e 61 6c 28 70 50 61 67 65 72 2c 20 26 62 48 6f  nal(pPager, &bHo
32130 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 7d  tJournal);.    }
32140 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
32150 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
32160 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
32170 20 7d 0a 20 20 20 20 69 66 28 20 62 48 6f 74 4a   }.    if( bHotJ
32180 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
32190 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64  if( pPager->read
321a0 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Only ){.        
321b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
321c0 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20  ONLY_ROLLBACK;. 
321d0 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
321e0 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ed;.      }..   
321f0 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43     /* Get an EXC
32200 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
32210 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
32220 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
32230 69 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69  it is.      ** i
32240 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20  mportant that a 
32250 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
32260 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e   not obtained on
32270 20 74 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a   the way to the.
32280 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49        ** EXCLUSI
32290 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77  VE lock. If it w
322a0 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f  ere, another pro
322b0 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20  cess might open 
322c0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
322d0 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65  abase file, dete
322e0 63 74 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ct the RESERVED 
322f0 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75  lock, and conclu
32300 64 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  de that the.    
32310 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73    ** database is
32320 20 73 61 66 65 20 74 6f 20 72 65 61 64 20 77 68   safe to read wh
32330 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73  ile this process
32340 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e   is still rollin
32350 67 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  g the .      ** 
32360 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b  hot-journal back
32370 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20  ..      ** .    
32380 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65    ** Because the
32390 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45   intermediate RE
323a0 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e  SERVED lock is n
323b0 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e  ot requested, an
323c0 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72  y.      ** other
323d0 20 70 72 6f 63 65 73 73 20 61 74 74 65 6d 70 74   process attempt
323e0 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20 74 68  ing to access th
323f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
32400 77 69 6c 6c 20 67 65 74 20 74 6f 20 0a 20 20 20  will get to .   
32410 20 20 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74     ** this point
32420 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64   in the code and
32430 20 66 61 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20   fail to obtain 
32440 69 74 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56  its own EXCLUSIV
32450 45 20 6c 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a  E lock .      **
32460 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
32470 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a   file..      **.
32480 20 20 20 20 20 20 2a 2a 20 55 6e 6c 65 73 73 20        ** Unless 
32490 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
324a0 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63  locking_mode=exc
324b0 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65  lusive mode, the
324c0 20 6c 6f 63 6b 20 69 73 0a 20 20 20 20 20 20 2a   lock is.      *
324d0 2a 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20  * downgraded to 
324e0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 62 65 66 6f  SHARED_LOCK befo
324f0 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  re this function
32500 20 72 65 74 75 72 6e 73 2e 0a 20 20 20 20 20 20   returns..      
32510 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  */.      rc = pa
32520 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72  gerLockDb(pPager
32530 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
32540 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
32550 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
32560 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
32570 64 3b 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20  d;.      }. .   
32580 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20 6e     /* If it is n
32590 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20  ot already open 
325a0 61 6e 64 20 74 68 65 20 66 69 6c 65 20 65 78 69  and the file exi
325b0 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 6f 70 65  sts on disk, ope
325c0 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  n the .      ** 
325d0 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64  journal for read
325e0 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 57  /write access. W
325f0 72 69 74 65 20 61 63 63 65 73 73 20 69 73 20 72  rite access is r
32600 65 71 75 69 72 65 64 20 62 65 63 61 75 73 65 20  equired because 
32610 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 65 78 63  .      ** in exc
32620 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f  lusive-access mo
32630 64 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  de the file desc
32640 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b  riptor will be k
32650 65 70 74 20 6f 70 65 6e 20 0a 20 20 20 20 20 20  ept open .      
32660 2a 2a 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20  ** and possibly 
32670 75 73 65 64 20 66 6f 72 20 61 20 74 72 61 6e 73  used for a trans
32680 61 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e  action later on.
32690 20 41 6c 73 6f 2c 20 77 72 69 74 65 2d 61 63 63   Also, write-acc
326a0 65 73 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 73  ess .      ** is
326b0 20 75 73 75 61 6c 6c 79 20 72 65 71 75 69 72 65   usually require
326c0 64 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68  d to finalize th
326d0 65 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 6a 6f 75  e journal in jou
326e0 72 6e 61 6c 5f 6d 6f 64 65 3d 70 65 72 73 69 73  rnal_mode=persis
326f0 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65  t .      ** mode
32700 20 28 61 6e 64 20 61 6c 73 6f 20 66 6f 72 20 6a   (and also for j
32710 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 74 72 75 6e  ournal_mode=trun
32720 63 61 74 65 20 6f 6e 20 73 6f 6d 65 20 73 79 73  cate on some sys
32730 74 65 6d 73 29 2e 0a 20 20 20 20 20 20 2a 2a 0a  tems)..      **.
32740 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20        ** If the 
32750 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74  journal does not
32760 20 65 78 69 73 74 2c 20 69 74 20 75 73 75 61 6c   exist, it usual
32770 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20 73 6f  ly means that so
32780 6d 65 20 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68  me .      ** oth
32790 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61  er connection ma
327a0 6e 61 67 65 64 20 74 6f 20 67 65 74 20 69 6e 20  naged to get in 
327b0 61 6e 64 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b  and roll it back
327c0 20 62 65 66 6f 72 65 20 0a 20 20 20 20 20 20 2a   before .      *
327d0 2a 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  * this connectio
327e0 6e 20 6f 62 74 61 69 6e 65 64 20 74 68 65 20 65  n obtained the e
327f0 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 61 62  xclusive lock ab
32800 6f 76 65 2e 20 4f 72 2c 20 69 74 20 0a 20 20 20  ove. Or, it .   
32810 20 20 20 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74     ** may mean t
32820 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77 61  hat the pager wa
32830 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73  s in the error-s
32840 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 20  tate when this. 
32850 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
32860 20 77 61 73 20 63 61 6c 6c 65 64 20 61 6e 64 20   was called and 
32870 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
32880 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e   does not exist.
32890 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
328a0 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  if( !isOpen(pPag
328b0 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
328c0 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20      sqlite3_vfs 
328d0 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70  * const pVfs = p
328e0 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20  Pager->pVfs;.   
328f0 20 20 20 20 20 69 6e 74 20 62 45 78 69 73 74 73       int bExists
32900 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
32910 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61  * True if journa
32920 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f  l file exists */
32930 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
32940 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a 20  lite3OsAccess(. 
32950 20 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2c             pVfs,
32960 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
32970 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  l, SQLITE_ACCESS
32980 5f 45 58 49 53 54 53 2c 20 26 62 45 78 69 73 74  _EXISTS, &bExist
32990 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  s);.        if( 
329a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
329b0 20 62 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20   bExists ){.    
329c0 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d        int fout =
329d0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   0;.          in
329e0 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  t f = SQLITE_OPE
329f0 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
32a00 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
32a10 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20  RNAL;.          
32a20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
32a30 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20  >tempFile );.   
32a40 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
32a50 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
32a60 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
32a70 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
32a80 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20  , &fout);.      
32a90 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
32aa0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f  SQLITE_OK || isO
32ab0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
32ac0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
32ad0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
32ae0 26 26 20 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f  && fout&SQLITE_O
32af0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a  PEN_READONLY ){.
32b00 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
32b10 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
32b20 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
32b30 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
32b40 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
32b50 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
32b60 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 0a      }.      }. .
32b70 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63        /* Playbac
32b80 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  k and delete the
32b90 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20   journal.  Drop 
32ba0 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72 69  the database wri
32bb0 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b  te.      ** lock
32bc0 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20 74   and reacquire t
32bd0 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 20 50 75  he read lock. Pu
32be0 72 67 65 20 74 68 65 20 63 61 63 68 65 20 62 65  rge the cache be
32bf0 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c  fore.      ** pl
32c00 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 68  aying back the h
32c10 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68  ot-journal so th
32c20 61 74 20 77 65 20 64 6f 6e 27 74 20 65 6e 64 20  at we don't end 
32c30 75 70 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a  up with.      **
32c40 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
32c50 20 63 61 63 68 65 2e 20 20 53 79 6e 63 20 74 68   cache.  Sync th
32c60 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 62 65  e hot journal be
32c70 66 6f 72 65 20 70 6c 61 79 69 6e 67 0a 20 20 20  fore playing.   
32c80 20 20 20 2a 2a 20 69 74 20 62 61 63 6b 20 73 69     ** it back si
32c90 6e 63 65 20 74 68 65 20 70 72 6f 63 65 73 73 20  nce the process 
32ca0 74 68 61 74 20 63 72 61 73 68 65 64 20 61 6e 64  that crashed and
32cb0 20 6c 65 66 74 20 74 68 65 20 68 6f 74 20 6a 6f   left the hot jo
32cc0 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 70  urnal.      ** p
32cd0 72 6f 62 61 62 6c 79 20 64 69 64 20 6e 6f 74 20  robably did not 
32ce0 73 79 6e 63 20 69 74 20 61 6e 64 20 77 65 20 61  sync it and we a
32cf0 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 61  re required to a
32d00 6c 77 61 79 73 20 73 79 6e 63 0a 20 20 20 20 20  lways sync.     
32d10 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
32d20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 20 69  before playing i
32d30 74 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2f  t back..      */
32d40 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f 70 65  .      if( isOpe
32d50 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
32d60 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
32d70 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
32d80 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
32d90 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72  pagerSyncHotJour
32da0 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
32db0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
32dc0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
32dd0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
32de0 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
32df0 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
32e00 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  e);.          pP
32e10 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
32e20 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 20  AGER_OPEN;.     
32e30 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
32e40 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
32e50 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
32e60 20 20 20 20 20 20 20 70 61 67 65 72 55 6e 6c 6f         pagerUnlo
32e70 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48 41  ckDb(pPager, SHA
32e80 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  RED_LOCK);.     
32e90 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63   }..      if( rc
32ea0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
32eb0 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62         /* This b
32ec0 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 69  ranch is taken i
32ed0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
32ee0 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74  s while trying t
32ef0 6f 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a  o open.        *
32f00 2a 20 6f 72 20 72 6f 6c 6c 20 62 61 63 6b 20 61  * or roll back a
32f10 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 68 69   hot-journal whi
32f20 6c 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58  le holding an EX
32f30 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68  CLUSIVE lock. Th
32f40 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67  e.        ** pag
32f50 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 72 6f 75 74  er_unlock() rout
32f60 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c  ine will be call
32f70 65 64 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ed before return
32f80 69 6e 67 20 74 6f 20 75 6e 6c 6f 63 6b 0a 20 20  ing to unlock.  
32f90 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c        ** the fil
32fa0 65 2e 20 49 66 20 74 68 65 20 75 6e 6c 6f 63 6b  e. If the unlock
32fb0 20 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2c 20   attempt fails, 
32fc0 74 68 65 6e 20 50 61 67 65 72 2e 65 4c 6f 63 6b  then Pager.eLock
32fd0 20 6d 75 73 74 20 62 65 0a 20 20 20 20 20 20 20   must be.       
32fe0 20 2a 2a 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   ** set to UNKNO
32ff0 57 4e 5f 4c 4f 43 4b 20 28 73 65 65 20 74 68 65  WN_LOCK (see the
33000 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74   comment above t
33010 68 65 20 23 64 65 66 69 6e 65 20 66 6f 72 20 0a  he #define for .
33020 20 20 20 20 20 20 20 20 2a 2a 20 55 4e 4b 4e 4f          ** UNKNO
33030 57 4e 5f 4c 4f 43 4b 20 61 62 6f 76 65 20 66 6f  WN_LOCK above fo
33040 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e  r an explanation
33050 29 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ). .        **. 
33060 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 6f 72 64         ** In ord
33070 65 72 20 74 6f 20 67 65 74 20 70 61 67 65 72 5f  er to get pager_
33080 75 6e 6c 6f 63 6b 28 29 20 74 6f 20 64 6f 20 74  unlock() to do t
33090 68 69 73 2c 20 73 65 74 20 50 61 67 65 72 2e 65  his, set Pager.e
330a0 53 74 61 74 65 20 74 6f 0a 20 20 20 20 20 20 20  State to.       
330b0 20 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f 52 20   ** PAGER_ERROR 
330c0 6e 6f 77 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  now. This is not
330d0 20 61 63 74 75 61 6c 6c 79 20 63 6f 75 6e 74 65   actually counte
330e0 64 20 61 73 20 61 20 74 72 61 6e 73 69 74 69 6f  d as a transitio
330f0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  n.        ** to 
33100 45 52 52 4f 52 20 73 74 61 74 65 20 69 6e 20 74  ERROR state in t
33110 68 65 20 73 74 61 74 65 20 64 69 61 67 72 61 6d  he state diagram
33120 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74   at the top of t
33130 68 69 73 20 66 69 6c 65 2c 0a 20 20 20 20 20 20  his file,.      
33140 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b 6e    ** since we kn
33150 6f 77 20 74 68 61 74 20 74 68 65 20 73 61 6d 65  ow that the same
33160 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75   call to pager_u
33170 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 76 65 72  nlock() will ver
33180 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 68 6f  y.        ** sho
33190 72 74 6c 79 20 74 72 61 6e 73 69 74 69 6f 6e 20  rtly transition 
331a0 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
331b0 20 74 6f 20 74 68 65 20 4f 50 45 4e 20 73 74 61   to the OPEN sta
331c0 74 65 2e 20 43 61 6c 6c 69 6e 67 0a 20 20 20 20  te. Calling.    
331d0 20 20 20 20 2a 2a 20 61 73 73 65 72 74 5f 70 61      ** assert_pa
331e0 67 65 72 5f 73 74 61 74 65 28 29 20 77 6f 75 6c  ger_state() woul
331f0 64 20 66 61 69 6c 20 6e 6f 77 2c 20 61 73 20 69  d fail now, as i
33200 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  t should not be 
33210 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20  possible.       
33220 20 2a 2a 20 74 6f 20 62 65 20 69 6e 20 45 52 52   ** to be in ERR
33230 4f 52 20 73 74 61 74 65 20 77 68 65 6e 20 74 68  OR state when th
33240 65 72 65 20 61 72 65 20 7a 65 72 6f 20 6f 75 74  ere are zero out
33250 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 0a 20  standing page . 
33260 20 20 20 20 20 20 20 2a 2a 20 72 65 66 65 72 65         ** refere
33270 6e 63 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  nces..        */
33280 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 65  .        pager_e
33290 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
332a0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  ;.        goto f
332b0 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  ailed;.      }..
332c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
332d0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
332e0 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20  GER_OPEN );.    
332f0 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65    assert( (pPage
33300 72 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  r->eLock==SHARED
33310 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20 20 20  _LOCK).         
33320 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 78    || (pPager->ex
33330 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70  clusiveMode && p
33340 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 53 48 41  Pager->eLock>SHA
33350 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20  RED_LOCK).      
33360 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
33370 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
33380 69 6c 65 20 26 26 20 70 50 61 67 65 72 2d 3e 68  ile && pPager->h
33390 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b  asHeldSharedLock
333a0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
333b0 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73   shared-lock has
333c0 20 6a 75 73 74 20 62 65 65 6e 20 61 63 71 75 69   just been acqui
333d0 72 65 64 20 74 68 65 6e 20 63 68 65 63 6b 20 74  red then check t
333e0 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 20 69  o.      ** see i
333f0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  f the database h
33400 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  as been modified
33410 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61  .  If the databa
33420 73 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c 0a  se has changed,.
33430 20 20 20 20 20 20 2a 2a 20 66 6c 75 73 68 20 74        ** flush t
33440 68 65 20 63 61 63 68 65 2e 20 20 54 68 65 20 68  he cache.  The h
33450 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b  asHeldSharedLock
33460 20 66 6c 61 67 20 70 72 65 76 65 6e 74 73 20 74   flag prevents t
33470 68 69 73 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a  his from.      *
33480 2a 20 6f 63 63 75 72 72 69 6e 67 20 6f 6e 20 74  * occurring on t
33490 68 65 20 76 65 72 79 20 66 69 72 73 74 20 61 63  he very first ac
334a0 63 65 73 73 20 74 6f 20 61 20 66 69 6c 65 2c 20  cess to a file, 
334b0 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 61 76 65  in order to save
334c0 20 61 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 67   a.      ** sing
334d0 6c 65 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73  le unnecessary s
334e0 71 6c 69 74 65 33 4f 73 52 65 61 64 28 29 20 63  qlite3OsRead() c
334f0 61 6c 6c 20 61 74 20 74 68 65 20 73 74 61 72 74  all at the start
33500 2d 75 70 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  -up..      **.  
33510 20 20 20 20 2a 2a 20 44 61 74 61 62 61 73 65 20      ** Database 
33520 63 68 61 6e 67 65 73 20 61 72 65 20 64 65 74 65  changes are dete
33530 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20  cted by looking 
33540 61 74 20 31 35 20 62 79 74 65 73 20 62 65 67 69  at 15 bytes begi
33550 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61  nning.      ** a
33560 74 20 6f 66 66 73 65 74 20 32 34 20 69 6e 74 6f  t offset 24 into
33570 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 65 20   the file.  The 
33580 66 69 72 73 74 20 34 20 6f 66 20 74 68 65 73 65  first 4 of these
33590 20 31 36 20 62 79 74 65 73 20 61 72 65 0a 20 20   16 bytes are.  
335a0 20 20 20 20 2a 2a 20 61 20 33 32 2d 62 69 74 20      ** a 32-bit 
335b0 63 6f 75 6e 74 65 72 20 74 68 61 74 20 69 73 20  counter that is 
335c0 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 69 74 68  incremented with
335d0 20 65 61 63 68 20 63 68 61 6e 67 65 2e 20 20 54   each change.  T
335e0 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65  he.      ** othe
335f0 72 20 62 79 74 65 73 20 63 68 61 6e 67 65 20 72  r bytes change r
33600 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65 61 63  andomly with eac
33610 68 20 66 69 6c 65 20 63 68 61 6e 67 65 20 77 68  h file change wh
33620 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 6f  en.      ** a co
33630 64 65 63 20 69 73 20 69 6e 20 75 73 65 2e 0a 20  dec is in use.. 
33640 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a       ** .      *
33650 2a 20 54 68 65 72 65 20 69 73 20 61 20 76 61 6e  * There is a van
33660 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 63  ishingly small c
33670 68 61 6e 63 65 20 74 68 61 74 20 61 20 63 68 61  hance that a cha
33680 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  nge will not be 
33690 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65 63 74  .      ** detect
336a0 65 64 2e 20 20 54 68 65 20 63 68 61 6e 63 65 20  ed.  The chance 
336b0 6f 66 20 61 6e 20 75 6e 64 65 74 65 63 74 65 64  of an undetected
336c0 20 63 68 61 6e 67 65 20 69 73 20 73 6f 20 73 6d   change is so sm
336d0 61 6c 6c 20 74 68 61 74 0a 20 20 20 20 20 20 2a  all that.      *
336e0 2a 20 69 74 20 63 61 6e 20 62 65 20 6e 65 67 6c  * it can be negl
336f0 65 63 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  ected..      */.
33700 20 20 20 20 20 20 63 68 61 72 20 64 62 46 69 6c        char dbFil
33710 65 56 65 72 73 5b 73 69 7a 65 6f 66 28 70 50 61  eVers[sizeof(pPa
33720 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
33730 5d 3b 0a 0a 20 20 20 20 20 20 49 4f 54 52 41 43  ];..      IOTRAC
33740 45 28 28 22 43 4b 56 45 52 53 20 25 70 20 25 64  E(("CKVERS %p %d
33750 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69 7a  \n", pPager, siz
33760 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29  eof(dbFileVers))
33770 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
33780 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
33790 65 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65 56  er->fd, &dbFileV
337a0 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ers, sizeof(dbFi
337b0 6c 65 56 65 72 73 29 2c 20 32 34 29 3b 0a 20 20  leVers), 24);.  
337c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
337d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
337e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
337f0 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
33800 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
33810 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
33820 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d     }.        mem
33830 73 65 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20  set(dbFileVers, 
33840 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  0, sizeof(dbFile
33850 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a  Vers));.      }.
33860 0a 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d  .      if( memcm
33870 70 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  p(pPager->dbFile
33880 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73  Vers, dbFileVers
33890 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
338a0 65 72 73 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ers))!=0 ){.    
338b0 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
338c0 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 20 20  pPager);..      
338d0 20 20 2f 2a 20 55 6e 6d 61 70 20 74 68 65 20 64    /* Unmap the d
338e0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 74  atabase file. It
338f0 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61   is possible tha
33900 74 20 65 78 74 65 72 6e 61 6c 20 70 72 6f 63 65  t external proce
33910 73 73 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  sses.        ** 
33920 6d 61 79 20 68 61 76 65 20 74 72 75 6e 63 61 74  may have truncat
33930 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ed the database 
33940 66 69 6c 65 20 61 6e 64 20 74 68 65 6e 20 65 78  file and then ex
33950 74 65 6e 64 65 64 20 69 74 20 62 61 63 6b 0a 20  tended it back. 
33960 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 69 74 73         ** to its
33970 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 20 77   original size w
33980 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73  hile this proces
33990 73 20 77 61 73 20 6e 6f 74 20 68 6f 6c 64 69 6e  s was not holdin
339a0 67 20 61 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20  g a lock..      
339b0 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
339c0 65 20 74 68 65 72 65 20 6d 61 79 20 65 78 69 73  e there may exis
339d0 74 20 61 20 50 61 67 65 72 2e 70 4d 61 70 20 6d  t a Pager.pMap m
339e0 61 70 70 69 6e 67 20 74 68 61 74 20 61 70 70 65  apping that appe
339f0 61 72 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ars.        ** t
33a00 6f 20 62 65 20 74 68 65 20 72 69 67 68 74 20 73  o be the right s
33a10 69 7a 65 20 62 75 74 20 69 73 20 6e 6f 74 20 61  ize but is not a
33a20 63 74 75 61 6c 6c 79 20 76 61 6c 69 64 2e 20 41  ctually valid. A
33a30 76 6f 69 64 20 74 68 69 73 0a 20 20 20 20 20 20  void this.      
33a40 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 79    ** possibility
33a50 20 62 79 20 75 6e 6d 61 70 70 69 6e 67 20 74 68   by unmapping th
33a60 65 20 64 62 20 68 65 72 65 2e 20 2a 2f 0a 20 20  e db here. */.  
33a70 20 20 20 20 20 20 69 66 28 20 55 53 45 46 45 54        if( USEFET
33a80 43 48 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  CH(pPager) ){.  
33a90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
33aa0 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d  sUnfetch(pPager-
33ab0 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  >fd, 0, 0);.    
33ac0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
33ad0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
33ae0 68 65 72 65 20 69 73 20 61 20 57 41 4c 20 66 69  here is a WAL fi
33af0 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  le in the file-s
33b00 79 73 74 65 6d 2c 20 6f 70 65 6e 20 74 68 69 73  ystem, open this
33b10 20 64 61 74 61 62 61 73 65 20 69 6e 20 57 41 4c   database in WAL
33b20 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 4f 74  .    ** mode. Ot
33b30 68 65 72 77 69 73 65 2c 20 74 68 65 20 66 6f 6c  herwise, the fol
33b40 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  lowing function 
33b50 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  call is a no-op.
33b60 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
33b70 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50   pagerOpenWalIfP
33b80 72 65 73 65 6e 74 28 70 50 61 67 65 72 29 3b 0a  resent(pPager);.
33b90 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
33ba0 4d 49 54 5f 57 41 4c 0a 20 20 20 20 61 73 73 65  MIT_WAL.    asse
33bb0 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c  rt( pPager->pWal
33bc0 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  ==0 || rc==SQLIT
33bd0 45 5f 4f 4b 20 29 3b 0a 23 65 6e 64 69 66 0a 20  E_OK );.#endif. 
33be0 20 7d 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55   }..  if( pagerU
33bf0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
33c00 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
33c10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
33c20 20 20 72 63 20 3d 20 70 61 67 65 72 42 65 67 69    rc = pagerBegi
33c30 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  nReadTransaction
33c40 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
33c50 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d   if( pPager->tem
33c60 70 46 69 6c 65 3d 3d 30 20 26 26 20 70 50 61 67  pFile==0 && pPag
33c70 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
33c80 52 5f 4f 50 45 4e 20 26 26 20 72 63 3d 3d 53 51  R_OPEN && rc==SQ
33c90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
33ca0 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75  c = pagerPagecou
33cb0 6e 74 28 70 50 61 67 65 72 2c 20 26 70 50 61 67  nt(pPager, &pPag
33cc0 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d  er->dbSize);.  }
33cd0 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69 66 28  .. failed:.  if(
33ce0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
33cf0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d  {.    assert( !M
33d00 45 4d 44 42 20 29 3b 0a 20 20 20 20 70 61 67 65  EMDB );.    page
33d10 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29  r_unlock(pPager)
33d20 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
33d30 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
33d40 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 7d 65  GER_OPEN );.  }e
33d50 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
33d60 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
33d70 52 45 41 44 45 52 3b 0a 20 20 20 20 70 50 61 67  READER;.    pPag
33d80 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65  er->hasHeldShare
33d90 64 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a 20  dLock = 1;.  }. 
33da0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
33db0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 66 65  *.** If the refe
33dc0 72 65 6e 63 65 20 63 6f 75 6e 74 20 68 61 73 20  rence count has 
33dd0 72 65 61 63 68 65 64 20 7a 65 72 6f 2c 20 72 6f  reached zero, ro
33de0 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76  llback any activ
33df0 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
33e00 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
33e10 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63  pager..**.** Exc
33e20 65 70 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f  ept, in locking_
33e30 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 20 77  mode=EXCLUSIVE w
33e40 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 74  hen there is not
33e50 68 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20 74 68  hing to in.** th
33e60 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
33e70 61 6c 2c 20 74 68 65 20 75 6e 6c 6f 63 6b 20 69  al, the unlock i
33e80 73 20 6e 6f 74 20 70 65 72 66 6f 72 6d 65 64 20  s not performed 
33e90 61 6e 64 20 74 68 65 72 65 20 69 73 0a 2a 2a 20  and there is.** 
33ea0 6e 6f 74 68 69 6e 67 20 74 6f 20 72 6f 6c 6c 62  nothing to rollb
33eb0 61 63 6b 2c 20 73 6f 20 74 68 69 73 20 72 6f 75  ack, so this rou
33ec0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
33ed0 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64  .*/ .static void
33ee0 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e   pagerUnlockIfUn
33ef0 75 73 65 64 28 50 61 67 65 72 20 2a 70 50 61 67  used(Pager *pPag
33f00 65 72 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74  er){.  if( sqlit
33f10 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
33f20 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
33f30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  )==0 ){.    asse
33f40 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61  rt( pPager->nMma
33f50 70 4f 75 74 3d 3d 30 20 29 3b 20 2f 2a 20 62 65  pOut==0 ); /* be
33f60 63 61 75 73 65 20 70 61 67 65 31 20 69 73 20 6e  cause page1 is n
33f70 65 76 65 72 20 6d 65 6d 6f 72 79 20 6d 61 70 70  ever memory mapp
33f80 65 64 20 2a 2f 0a 20 20 20 20 70 61 67 65 72 55  ed */.    pagerU
33f90 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
33fa0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a  (pPager);.  }.}.
33fb0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  ./*.** The page 
33fc0 67 65 74 74 65 72 20 6d 65 74 68 6f 64 73 20 65  getter methods e
33fd0 61 63 68 20 74 72 79 20 74 6f 20 61 63 71 75 69  ach try to acqui
33fe0 72 65 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  re a reference t
33ff0 6f 20 61 0a 2a 2a 20 70 61 67 65 20 77 69 74 68  o a.** page with
34000 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 67 6e   page number pgn
34010 6f 2e 20 49 66 20 74 68 65 20 72 65 71 75 65 73  o. If the reques
34020 74 65 64 20 72 65 66 65 72 65 6e 63 65 20 69 73  ted reference is
34030 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c   .** successfull
34040 79 20 6f 62 74 61 69 6e 65 64 2c 20 69 74 20 69  y obtained, it i
34050 73 20 63 6f 70 69 65 64 20 74 6f 20 2a 70 70 50  s copied to *ppP
34060 61 67 65 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  age and SQLITE_O
34070 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  K returned..**.*
34080 2a 20 54 68 65 72 65 20 61 72 65 20 64 69 66 66  * There are diff
34090 65 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61  erent implementa
340a0 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 67 65 74  tions of the get
340b0 74 65 72 20 6d 65 74 68 6f 64 20 64 65 70 65 6e  ter method depen
340c0 64 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63  ding.** on the c
340d0 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20  urrent state of 
340e0 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a  the pager..**.**
340f0 20 20 20 20 20 67 65 74 50 61 67 65 4e 6f 72 6d       getPageNorm
34100 61 6c 28 29 20 20 20 20 20 20 20 20 20 2d 2d 20  al()         -- 
34110 20 54 68 65 20 6e 6f 72 6d 61 6c 20 67 65 74 74   The normal gett
34120 65 72 0a 2a 2a 20 20 20 20 20 67 65 74 50 61 67  er.**     getPag
34130 65 45 72 72 6f 72 28 29 20 20 20 20 20 20 20 20  eError()        
34140 20 20 2d 2d 20 20 55 73 65 64 20 69 66 20 74 68    --  Used if th
34150 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 61 6e  e pager is in an
34160 20 65 72 72 6f 72 20 73 74 61 74 65 0a 2a 2a 20   error state.** 
34170 20 20 20 20 67 65 74 50 61 67 65 4d 6d 61 70 28      getPageMmap(
34180 29 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 20  )           --  
34190 55 73 65 64 20 69 66 20 6d 65 6d 6f 72 79 2d 6d  Used if memory-m
341a0 61 70 70 65 64 20 49 2f 4f 20 69 73 20 65 6e 61  apped I/O is ena
341b0 62 6c 65 64 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  bled.**.** If th
341c0 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
341d0 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
341e0 68 65 20 63 61 63 68 65 2c 20 69 74 20 69 73 20  he cache, it is 
341f0 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74  returned. .** Ot
34200 68 65 72 77 69 73 65 2c 20 61 20 6e 65 77 20 70  herwise, a new p
34210 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20 61 6c  age object is al
34220 6c 6f 63 61 74 65 64 20 61 6e 64 20 70 6f 70 75  located and popu
34230 6c 61 74 65 64 20 77 69 74 68 20 64 61 74 61 0a  lated with data.
34240 2a 2a 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ** read from the
34250 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
34260 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 2c 20 74  In some cases, t
34270 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65  he pcache module
34280 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e   may.** choose n
34290 6f 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61  ot to allocate a
342a0 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74   new page object
342b0 20 61 6e 64 20 6d 61 79 20 72 65 75 73 65 20 61   and may reuse a
342c0 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20 6f 62  n existing.** ob
342d0 6a 65 63 74 20 77 69 74 68 20 6e 6f 20 6f 75 74  ject with no out
342e0 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
342f0 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65  ces..**.** The e
34300 78 74 72 61 20 64 61 74 61 20 61 70 70 65 6e 64  xtra data append
34310 65 64 20 74 6f 20 61 20 70 61 67 65 20 69 73 20  ed to a page is 
34320 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a  always initializ
34330 65 64 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20  ed to zeros the 
34340 0a 2a 2a 20 66 69 72 73 74 20 74 69 6d 65 20 61  .** first time a
34350 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20   page is loaded 
34360 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 49 66 20  into memory. If 
34370 74 68 65 20 70 61 67 65 20 72 65 71 75 65 73 74  the page request
34380 65 64 20 69 73 20 0a 2a 2a 20 61 6c 72 65 61 64  ed is .** alread
34390 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 77  y in the cache w
343a0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
343b0 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  n is called, the
343c0 6e 20 74 68 65 20 65 78 74 72 61 0a 2a 2a 20 64  n the extra.** d
343d0 61 74 61 20 69 73 20 6c 65 66 74 20 61 73 20 69  ata is left as i
343e0 74 20 77 61 73 20 77 68 65 6e 20 74 68 65 20 70  t was when the p
343f0 61 67 65 20 6f 62 6a 65 63 74 20 77 61 73 20 6c  age object was l
34400 61 73 74 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  ast used..**.** 
34410 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
34420 69 6d 61 67 65 20 69 73 20 73 6d 61 6c 6c 65 72  image is smaller
34430 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73   than the reques
34440 74 65 64 20 70 61 67 65 20 6f 72 20 69 66 20 0a  ted page or if .
34450 2a 2a 20 74 68 65 20 66 6c 61 67 73 20 70 61 72  ** the flags par
34460 61 6d 65 74 65 72 20 63 6f 6e 74 61 69 6e 73 20  ameter contains 
34470 74 68 65 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f  the PAGER_GET_NO
34480 43 4f 4e 54 45 4e 54 20 62 69 74 20 61 6e 64 20  CONTENT bit and 
34490 74 68 65 20 0a 2a 2a 20 72 65 71 75 65 73 74 65  the .** requeste
344a0 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  d page is not al
344b0 72 65 61 64 79 20 73 74 6f 72 65 64 20 69 6e 20  ready stored in 
344c0 74 68 65 20 63 61 63 68 65 2c 20 74 68 65 6e 20  the cache, then 
344d0 6e 6f 20 0a 2a 2a 20 61 63 74 75 61 6c 20 64 69  no .** actual di
344e0 73 6b 20 72 65 61 64 20 6f 63 63 75 72 73 2e 20  sk read occurs. 
344f0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
34500 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66   memory image of
34510 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 69 73   the .** page is
34520 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
34530 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a 2a 0a 2a  all zeros. .**.*
34540 2a 20 49 66 20 50 41 47 45 52 5f 47 45 54 5f 4e  * If PAGER_GET_N
34550 4f 43 4f 4e 54 45 4e 54 20 69 73 20 74 72 75 65  OCONTENT is true
34560 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
34570 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61  we do not care a
34580 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  bout.** the cont
34590 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
345a0 2e 20 54 68 69 73 20 6f 63 63 75 72 73 20 69 6e  . This occurs in
345b0 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a   two scenarios:.
345c0 2a 2a 0a 2a 2a 20 20 20 61 29 20 57 68 65 6e 20  **.**   a) When 
345d0 72 65 61 64 69 6e 67 20 61 20 66 72 65 65 2d 6c  reading a free-l
345e0 69 73 74 20 6c 65 61 66 20 70 61 67 65 20 66 72  ist leaf page fr
345f0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  om the database,
34600 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20   and.**.**   b) 
34610 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74  When a savepoint
34620 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64   is being rolled
34630 20 62 61 63 6b 20 61 6e 64 20 77 65 20 6e 65 65   back and we nee
34640 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 20 20 20  d to load.**    
34650 20 20 61 20 6e 65 77 20 70 61 67 65 20 69 6e 74    a new page int
34660 6f 20 74 68 65 20 63 61 63 68 65 20 74 6f 20 62  o the cache to b
34670 65 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68  e filled with th
34680 65 20 64 61 74 61 20 72 65 61 64 0a 2a 2a 20 20  e data read.**  
34690 20 20 20 20 66 72 6f 6d 20 74 68 65 20 73 61 76      from the sav
346a0 65 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a  epoint journal..
346b0 2a 2a 0a 2a 2a 20 49 66 20 50 41 47 45 52 5f 47  **.** If PAGER_G
346c0 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 69 73 20  ET_NOCONTENT is 
346d0 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64  true, then the d
346e0 61 74 61 20 72 65 74 75 72 6e 65 64 20 69 73 20  ata returned is 
346f0 7a 65 72 6f 65 64 20 69 6e 73 74 65 61 64 0a 2a  zeroed instead.*
34700 2a 20 6f 66 20 62 65 69 6e 67 20 72 65 61 64 20  * of being read 
34710 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
34720 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c  e. Additionally,
34730 20 74 68 65 20 62 69 74 73 20 63 6f 72 72 65 73   the bits corres
34740 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 67  ponding.** to pg
34750 6e 6f 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a  no in Pager.pInJ
34760 6f 75 72 6e 61 6c 20 28 62 69 74 76 65 63 20 6f  ournal (bitvec o
34770 66 20 70 61 67 65 73 20 61 6c 72 65 61 64 79 20  f pages already 
34780 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a  written to the.*
34790 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20  * journal file) 
347a0 61 6e 64 20 74 68 65 20 50 61 67 65 72 53 61 76  and the PagerSav
347b0 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
347c0 69 6e 74 20 62 69 74 76 65 63 73 20 6f 66 20 61  int bitvecs of a
347d0 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73 61 76 65 70  ny open.** savep
347e0 6f 69 6e 74 73 20 61 72 65 20 73 65 74 2e 20 54  oints are set. T
347f0 68 69 73 20 6d 65 61 6e 73 20 69 66 20 74 68 65  his means if the
34800 20 70 61 67 65 20 69 73 20 6d 61 64 65 20 77 72   page is made wr
34810 69 74 61 62 6c 65 20 61 74 20 61 6e 79 0a 2a 2a  itable at any.**
34820 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75   point in the fu
34830 74 75 72 65 2c 20 75 73 69 6e 67 20 61 20 63 61  ture, using a ca
34840 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ll to sqlite3Pag
34850 65 72 57 72 69 74 65 28 29 2c 20 69 74 73 20 63  erWrite(), its c
34860 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20  ontents.** will 
34870 6e 6f 74 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64  not be journaled
34880 2e 20 54 68 69 73 20 73 61 76 65 73 20 49 4f 2e  . This saves IO.
34890 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69  .**.** The acqui
348a0 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69  sition might fai
348b0 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65  l for several re
348c0 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63  asons.  In all c
348d0 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72  ases,.** an appr
348e0 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
348f0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
34900 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  nd *ppPage is se
34910 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  t to NULL..**.**
34920 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
34930 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20  3PagerLookup(). 
34940 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69   Both this routi
34950 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20  ne and Lookup() 
34960 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69  attempt.** to fi
34970 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  nd a page in the
34980 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
34990 20 66 69 72 73 74 2e 20 20 49 66 20 74 68 65 20   first.  If the 
349a0 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
349b0 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79  ady.** in memory
349c0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67  , this routine g
349d0 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72  oes to disk to r
349e0 65 61 64 20 69 74 20 69 6e 20 77 68 65 72 65 61  ead it in wherea
349f0 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75  s Lookup().** ju
34a00 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54  st returns 0.  T
34a10 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75  his routine acqu
34a20 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b  ires a read-lock
34a30 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
34a40 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20  it.** has to go 
34a50 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75  to disk, and cou
34a60 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b  ld also playback
34a70 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20   an old journal 
34a80 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  if necessary..**
34a90 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20   Since Lookup() 
34aa0 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69  never goes to di
34ab0 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73  sk, it never has
34ac0 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f   to deal with lo
34ad0 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61  cks.** or journa
34ae0 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74  l files..*/.stat
34af0 69 63 20 69 6e 74 20 67 65 74 50 61 67 65 4e 6f  ic int getPageNo
34b00 72 6d 61 6c 28 0a 20 20 50 61 67 65 72 20 2a 70  rmal(.  Pager *p
34b10 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54  Pager,      /* T
34b20 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e  he pager open on
34b30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
34b40 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  le */.  Pgno pgn
34b50 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  o,          /* P
34b60 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65  age number to fe
34b70 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20  tch */.  DbPage 
34b80 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20  **ppPage,    /* 
34b90 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20  Write a pointer 
34ba0 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65  to the page here
34bb0 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
34bc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47            /* PAG
34bd0 45 52 5f 47 45 54 5f 58 58 58 20 66 6c 61 67 73  ER_GET_XXX flags
34be0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
34bf0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
34c00 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 75 38 20  gHdr *pPg;.  u8 
34c10 6e 6f 43 6f 6e 74 65 6e 74 3b 20 20 20 20 20 20  noContent;      
34c20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
34c30 54 72 75 65 20 69 66 20 50 41 47 45 52 5f 47 45  True if PAGER_GE
34c40 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 69 73 20 73  T_NOCONTENT is s
34c50 65 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  et */.  sqlite3_
34c60 70 63 61 63 68 65 5f 70 61 67 65 20 2a 70 42 61  pcache_page *pBa
34c70 73 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  se;..  assert( p
34c80 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
34c90 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61  SQLITE_OK );.  a
34ca0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
34cb0 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41  State>=PAGER_REA
34cc0 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28  DER );.  assert(
34cd0 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
34ce0 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
34cf0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
34d00 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f  >hasHeldSharedLo
34d10 63 6b 3d 3d 31 20 29 3b 0a 0a 20 20 69 66 28 20  ck==1 );..  if( 
34d20 70 67 6e 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e  pgno==0 ) return
34d30 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
34d40 42 4b 50 54 3b 0a 20 20 70 42 61 73 65 20 3d 20  BKPT;.  pBase = 
34d50 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
34d60 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ch(pPager->pPCac
34d70 68 65 2c 20 70 67 6e 6f 2c 20 33 29 3b 0a 20 20  he, pgno, 3);.  
34d80 69 66 28 20 70 42 61 73 65 3d 3d 30 20 29 7b 0a  if( pBase==0 ){.
34d90 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 20      pPg = 0;.   
34da0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61   rc = sqlite3Pca
34db0 63 68 65 46 65 74 63 68 53 74 72 65 73 73 28 70  cheFetchStress(p
34dc0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
34dd0 70 67 6e 6f 2c 20 26 70 42 61 73 65 29 3b 0a 20  pgno, &pBase);. 
34de0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
34df0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67 65  E_OK ) goto page
34e00 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
34e10 20 20 20 69 66 28 20 70 42 61 73 65 3d 3d 30 20     if( pBase==0 
34e20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
34e30 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
34e40 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
34e50 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
34e60 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50 67 20 3d     }.  }.  pPg =
34e70 20 2a 70 70 50 61 67 65 20 3d 20 73 71 6c 69 74   *ppPage = sqlit
34e80 65 33 50 63 61 63 68 65 46 65 74 63 68 46 69 6e  e3PcacheFetchFin
34e90 69 73 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ish(pPager->pPCa
34ea0 63 68 65 2c 20 70 67 6e 6f 2c 20 70 42 61 73 65  che, pgno, pBase
34eb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  );.  assert( pPg
34ec0 3d 3d 28 2a 70 70 50 61 67 65 29 20 29 3b 0a 20  ==(*ppPage) );. 
34ed0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67   assert( pPg->pg
34ee0 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73  no==pgno );.  as
34ef0 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65  sert( pPg->pPage
34f00 72 3d 3d 70 50 61 67 65 72 20 7c 7c 20 70 50 67  r==pPager || pPg
34f10 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29 3b 0a 0a  ->pPager==0 );..
34f20 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28 66    noContent = (f
34f30 6c 61 67 73 20 26 20 50 41 47 45 52 5f 47 45 54  lags & PAGER_GET
34f40 5f 4e 4f 43 4f 4e 54 45 4e 54 29 21 3d 30 3b 0a  _NOCONTENT)!=0;.
34f50 20 20 69 66 28 20 70 50 67 2d 3e 70 50 61 67 65    if( pPg->pPage
34f60 72 20 26 26 20 21 6e 6f 43 6f 6e 74 65 6e 74 20  r && !noContent 
34f70 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69  ){.    /* In thi
34f80 73 20 63 61 73 65 20 74 68 65 20 70 63 61 63 68  s case the pcach
34f90 65 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61 69  e already contai
34fa0 6e 73 20 61 6e 20 69 6e 69 74 69 61 6c 69 7a 65  ns an initialize
34fb0 64 20 63 6f 70 79 20 6f 66 0a 20 20 20 20 2a 2a  d copy of.    **
34fc0 20 74 68 65 20 70 61 67 65 2e 20 52 65 74 75 72   the page. Retur
34fd0 6e 20 77 69 74 68 6f 75 74 20 66 75 72 74 68 65  n without furthe
34fe0 72 20 61 64 6f 2e 20 20 2a 2f 0a 20 20 20 20 61  r ado.  */.    a
34ff0 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d 50 41 47  ssert( pgno<=PAG
35000 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 26 26 20 70  ER_MAX_PGNO && p
35010 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno!=PAGER_MJ_PG
35020 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  NO(pPager) );.  
35030 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b    pPager->aStat[
35040 50 41 47 45 52 5f 53 54 41 54 5f 48 49 54 5d 2b  PAGER_STAT_HIT]+
35050 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  +;.    return SQ
35060 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c 73  LITE_OK;..  }els
35070 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61  e{.    /* The pa
35080 67 65 72 20 63 61 63 68 65 20 68 61 73 20 63 72  ger cache has cr
35090 65 61 74 65 64 20 61 20 6e 65 77 20 70 61 67 65  eated a new page
350a0 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 20 6e 65  . Its content ne
350b0 65 64 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 62  eds to .    ** b
350c0 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 42  e initialized. B
350d0 75 74 20 66 69 72 73 74 20 73 6f 6d 65 20 65 72  ut first some er
350e0 72 6f 72 20 63 68 65 63 6b 73 3a 0a 20 20 20 20  ror checks:.    
350f0 2a 2a 0a 20 20 20 20 2a 2a 20 28 31 29 20 54 68  **.    ** (1) Th
35100 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 6e  e maximum page n
35110 75 6d 62 65 72 20 69 73 20 32 5e 33 31 0a 20 20  umber is 2^31.  
35120 20 20 2a 2a 20 28 32 29 20 4e 65 76 65 72 20 74    ** (2) Never t
35130 72 79 20 74 6f 20 66 65 74 63 68 20 74 68 65 20  ry to fetch the 
35140 6c 6f 63 6b 69 6e 67 20 70 61 67 65 0a 20 20 20  locking page.   
35150 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f   */.    if( pgno
35160 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20  >PAGER_MAX_PGNO 
35170 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d  || pgno==PAGER_M
35180 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
35190 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
351a0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
351b0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  ;.      goto pag
351c0 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
351d0 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 67 2d 3e      }..    pPg->
351e0 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b  pPager = pPager;
351f0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69  ..    assert( !i
35200 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
35210 29 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ) || !MEMDB );. 
35220 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70     if( !isOpen(p
35230 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50  Pager->fd) || pP
35240 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 67 6e  ager->dbSize<pgn
35250 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20 29  o || noContent )
35260 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f  {.      if( pgno
35270 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20  >pPager->mxPgno 
35280 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
35290 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
352a0 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f       goto pager_
352b0 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
352c0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e     }.      if( n
352d0 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  oContent ){.    
352e0 20 20 20 20 2f 2a 20 46 61 69 6c 75 72 65 20 74      /* Failure t
352f0 6f 20 73 65 74 20 74 68 65 20 62 69 74 73 20 69  o set the bits i
35300 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e 61 6c 20  n the InJournal 
35310 62 69 74 2d 76 65 63 74 6f 72 73 20 69 73 20 62  bit-vectors is b
35320 65 6e 69 67 6e 2e 0a 20 20 20 20 20 20 20 20 2a  enign..        *
35330 2a 20 49 74 20 6d 65 72 65 6c 79 20 6d 65 61 6e  * It merely mean
35340 73 20 74 68 61 74 20 77 65 20 6d 69 67 68 74 20  s that we might 
35350 64 6f 20 73 6f 6d 65 20 65 78 74 72 61 20 77 6f  do some extra wo
35360 72 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 61 20  rk to journal a 
35370 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
35380 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e   that does not n
35390 65 65 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e 61  eed to be journa
353a0 6c 65 64 2e 20 20 4e 65 76 65 72 74 68 65 6c 65  led.  Neverthele
353b0 73 73 2c 20 62 65 20 73 75 72 65 20 0a 20 20 20  ss, be sure .   
353c0 20 20 20 20 20 2a 2a 20 74 6f 20 74 65 73 74 20       ** to test 
353d0 74 68 65 20 63 61 73 65 20 77 68 65 72 65 20 61  the case where a
353e0 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63   malloc error oc
353f0 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e  curs while tryin
35400 67 20 74 6f 20 73 65 74 20 0a 20 20 20 20 20 20  g to set .      
35410 20 20 2a 2a 20 61 20 62 69 74 20 69 6e 20 61 20    ** a bit in a 
35420 62 69 74 20 76 65 63 74 6f 72 2e 0a 20 20 20 20  bit vector..    
35430 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73      */.        s
35440 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
35450 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
35460 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61     if( pgno<=pPa
35470 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
35480 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 45 53  ){.          TES
35490 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 73 71  TONLY( rc = ) sq
354a0 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
354b0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
354c0 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  l, pgno);.      
354d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
354e0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
354f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
35500 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63      TESTONLY( rc
35510 20 3d 20 29 20 61 64 64 54 6f 53 61 76 65 70 6f   = ) addToSavepo
35520 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65  intBitvecs(pPage
35530 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  r, pgno);.      
35540 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d    testcase( rc==
35550 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
35560 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
35570 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
35580 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
35590 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74  memset(pPg->pDat
355a0 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61  a, 0, pPager->pa
355b0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 49  geSize);.      I
355c0 4f 54 52 41 43 45 28 28 22 5a 45 52 4f 20 25 70  OTRACE(("ZERO %p
355d0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
355e0 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73  pgno));.    }els
355f0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
35600 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50   pPg->pPager==pP
35610 61 67 65 72 20 29 3b 0a 20 20 20 20 20 20 70 50  ager );.      pP
35620 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45  ager->aStat[PAGE
35630 52 5f 53 54 41 54 5f 4d 49 53 53 5d 2b 2b 3b 0a  R_STAT_MISS]++;.
35640 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44        rc = readD
35650 62 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  bPage(pPg);.    
35660 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
35670 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
35680 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
35690 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20  e_err;.      }. 
356a0 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73     }.    pager_s
356b0 65 74 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  et_pagehash(pPg)
356c0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
356d0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72  QLITE_OK;..pager
356e0 5f 61 63 71 75 69 72 65 5f 65 72 72 3a 0a 20 20  _acquire_err:.  
356f0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
35700 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70  TE_OK );.  if( p
35710 50 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  Pg ){.    sqlite
35720 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29  3PcacheDrop(pPg)
35730 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c  ;.  }.  pagerUnl
35740 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67  ockIfUnused(pPag
35750 65 72 29 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d  er);.  *ppPage =
35760 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
35770 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  .}..#if SQLITE_M
35780 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f  AX_MMAP_SIZE>0./
35790 2a 20 54 68 65 20 70 61 67 65 20 67 65 74 74 65  * The page gette
357a0 72 20 66 6f 72 20 77 68 65 6e 20 6d 65 6d 6f 72  r for when memor
357b0 79 2d 6d 61 70 70 65 64 20 49 2f 4f 20 69 73 20  y-mapped I/O is 
357c0 65 6e 61 62 6c 65 64 20 2a 2f 0a 73 74 61 74 69  enabled */.stati
357d0 63 20 69 6e 74 20 67 65 74 50 61 67 65 4d 4d 61  c int getPageMMa
357e0 70 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  p(.  Pager *pPag
357f0 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  er,      /* The 
35800 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68  pager open on th
35810 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
35820 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
35830 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
35840 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68   number to fetch
35850 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70   */.  DbPage **p
35860 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69  pPage,    /* Wri
35870 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  te a pointer to 
35880 74 68 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f  the page here */
35890 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
358a0 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f         /* PAGER_
358b0 47 45 54 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f  GET_XXX flags */
358c0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
358d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67 48 64  QLITE_OK;.  PgHd
358e0 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 75 33  r *pPg = 0;.  u3
358f0 32 20 69 46 72 61 6d 65 20 3d 20 30 3b 20 20 20  2 iFrame = 0;   
35900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35910 20 46 72 61 6d 65 20 74 6f 20 72 65 61 64 20 66   Frame to read f
35920 72 6f 6d 20 57 41 4c 20 66 69 6c 65 20 2a 2f 0a  rom WAL file */.
35930 0a 20 20 2f 2a 20 49 74 20 69 73 20 61 63 63 65  .  /* It is acce
35940 70 74 61 62 6c 65 20 74 6f 20 75 73 65 20 61 20  ptable to use a 
35950 72 65 61 64 2d 6f 6e 6c 79 20 28 6d 6d 61 70 29  read-only (mmap)
35960 20 70 61 67 65 20 66 6f 72 20 61 6e 79 20 70 61   page for any pa
35970 67 65 20 65 78 63 65 70 74 0a 20 20 2a 2a 20 70  ge except.  ** p
35980 61 67 65 20 31 20 69 66 20 74 68 65 72 65 20 69  age 1 if there i
35990 73 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73  s no write-trans
359a0 61 63 74 69 6f 6e 20 6f 70 65 6e 20 6f 72 20 74  action open or t
359b0 68 65 20 41 43 51 55 49 52 45 5f 52 45 41 44 4f  he ACQUIRE_READO
359c0 4e 4c 59 0a 20 20 2a 2a 20 66 6c 61 67 20 77 61  NLY.  ** flag wa
359d0 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74  s specified by t
359e0 68 65 20 63 61 6c 6c 65 72 2e 20 41 6e 64 20 73  he caller. And s
359f0 6f 20 6c 6f 6e 67 20 61 73 20 74 68 65 20 64 62  o long as the db
35a00 20 69 73 20 6e 6f 74 20 61 20 0a 20 20 2a 2a 20   is not a .  ** 
35a10 74 65 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d  temporary or in-
35a20 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
35a30 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74    */.  const int
35a40 20 62 4d 6d 61 70 4f 6b 20 3d 20 28 70 67 6e 6f   bMmapOk = (pgno
35a50 3e 31 0a 20 20 20 26 26 20 28 70 50 61 67 65 72  >1.   && (pPager
35a60 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
35a70 52 45 41 44 45 52 20 7c 7c 20 28 66 6c 61 67 73  READER || (flags
35a80 20 26 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41   & PAGER_GET_REA
35a90 44 4f 4e 4c 59 29 29 0a 20 20 29 3b 0a 0a 20 20  DONLY)).  );..  
35aa0 61 73 73 65 72 74 28 20 55 53 45 46 45 54 43 48  assert( USEFETCH
35ab0 28 70 50 61 67 65 72 29 20 29 3b 0a 23 69 66 64  (pPager) );.#ifd
35ac0 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
35ad0 44 45 43 0a 20 20 61 73 73 65 72 74 28 20 70 50  DEC.  assert( pP
35ae0 61 67 65 72 2d 3e 78 43 6f 64 65 63 3d 3d 30 20  ager->xCodec==0 
35af0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
35b00 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6e 6f 74  Optimization not
35b10 65 3a 20 20 41 64 64 69 6e 67 20 74 68 65 20 22  e:  Adding the "
35b20 70 67 6e 6f 3c 3d 31 22 20 74 65 72 6d 20 62 65  pgno<=1" term be
35b30 66 6f 72 65 20 22 70 67 6e 6f 3d 3d 30 22 20 68  fore "pgno==0" h
35b40 65 72 65 0a 20 20 2a 2a 20 61 6c 6c 6f 77 73 20  ere.  ** allows 
35b50 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74  the compiler opt
35b60 69 6d 69 7a 65 72 20 74 6f 20 72 65 75 73 65 20  imizer to reuse 
35b70 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
35b80 68 65 20 22 70 67 6e 6f 3e 31 22 0a 20 20 2a 2a  he "pgno>1".  **
35b90 20 74 65 73 74 20 69 6e 20 74 68 65 20 70 72 65   test in the pre
35ba0 76 69 6f 75 73 20 73 74 61 74 65 6d 65 6e 74 2c  vious statement,
35bb0 20 61 6e 64 20 61 76 6f 69 64 20 74 65 73 74 69   and avoid testi
35bc0 6e 67 20 70 67 6e 6f 3d 3d 30 20 69 6e 20 74 68  ng pgno==0 in th
35bd0 65 0a 20 20 2a 2a 20 63 6f 6d 6d 6f 6e 20 63 61  e.  ** common ca
35be0 73 65 20 77 68 65 72 65 20 70 67 6e 6f 20 69 73  se where pgno is
35bf0 20 6c 61 72 67 65 2e 20 2a 2f 0a 20 20 69 66 28   large. */.  if(
35c00 20 70 67 6e 6f 3c 3d 31 20 26 26 20 70 67 6e 6f   pgno<=1 && pgno
35c10 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
35c20 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
35c30 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73  _BKPT;.  }.  ass
35c40 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
35c50 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45  ate>=PAGER_READE
35c60 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  R );.  assert( a
35c70 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
35c80 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  e(pPager) );.  a
35c90 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 68  ssert( pPager->h
35ca0 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b  asHeldSharedLock
35cb0 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
35cc0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
35cd0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a  ==SQLITE_OK );..
35ce0 20 20 69 66 28 20 62 4d 6d 61 70 4f 6b 20 26 26    if( bMmapOk &&
35cf0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
35d00 67 65 72 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  ger) ){.    rc =
35d10 20 73 71 6c 69 74 65 33 57 61 6c 46 69 6e 64 46   sqlite3WalFindF
35d20 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61  rame(pPager->pWa
35d30 6c 2c 20 70 67 6e 6f 2c 20 26 69 46 72 61 6d 65  l, pgno, &iFrame
35d40 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
35d50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
35d60 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
35d70 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
35d80 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
35d90 62 4d 6d 61 70 4f 6b 20 26 26 20 69 46 72 61 6d  bMmapOk && iFram
35da0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 76 6f 69 64  e==0 ){.    void
35db0 20 2a 70 44 61 74 61 20 3d 20 30 3b 0a 20 20 20   *pData = 0;.   
35dc0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
35dd0 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c  etch(pPager->fd,
35de0 20 0a 20 20 20 20 20 20 20 20 28 69 36 34 29 28   .        (i64)(
35df0 70 67 6e 6f 2d 31 29 20 2a 20 70 50 61 67 65 72  pgno-1) * pPager
35e00 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 50 61 67  ->pageSize, pPag
35e10 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 26 70  er->pageSize, &p
35e20 44 61 74 61 0a 20 20 20 20 29 3b 0a 20 20 20 20  Data.    );.    
35e30 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
35e40 4b 20 26 26 20 70 44 61 74 61 20 29 7b 0a 20 20  K && pData ){.  
35e50 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
35e60 65 53 74 61 74 65 3e 50 41 47 45 52 5f 52 45 41  eState>PAGER_REA
35e70 44 45 52 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  DER || pPager->t
35e80 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  empFile ){.     
35e90 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33     pPg = sqlite3
35ea0 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67  PagerLookup(pPag
35eb0 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  er, pgno);.     
35ec0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50 67   }.      if( pPg
35ed0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
35ee0 63 20 3d 20 70 61 67 65 72 41 63 71 75 69 72 65  c = pagerAcquire
35ef0 4d 61 70 50 61 67 65 28 70 50 61 67 65 72 2c 20  MapPage(pPager, 
35f00 70 67 6e 6f 2c 20 70 44 61 74 61 2c 20 26 70 50  pgno, pData, &pP
35f10 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  g);.      }else{
35f20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
35f30 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72  OsUnfetch(pPager
35f40 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 67 6e 6f  ->fd, (i64)(pgno
35f50 2d 31 29 2a 70 50 61 67 65 72 2d 3e 70 61 67 65  -1)*pPager->page
35f60 53 69 7a 65 2c 20 70 44 61 74 61 29 3b 0a 20 20  Size, pData);.  
35f70 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
35f80 70 50 67 20 29 7b 0a 20 20 20 20 20 20 20 20 61  pPg ){.        a
35f90 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
35fa0 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20  E_OK );.        
35fb0 2a 70 70 50 61 67 65 20 3d 20 70 50 67 3b 0a 20  *ppPage = pPg;. 
35fc0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
35fd0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
35fe0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
35ff0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
36000 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
36010 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
36020 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rc;.    }.  }.  
36030 72 65 74 75 72 6e 20 67 65 74 50 61 67 65 4e 6f  return getPageNo
36040 72 6d 61 6c 28 70 50 61 67 65 72 2c 20 70 67 6e  rmal(pPager, pgn
36050 6f 2c 20 70 70 50 61 67 65 2c 20 66 6c 61 67 73  o, ppPage, flags
36060 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
36070 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
36080 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 20 54 68 65  IZE>0 */../* The
36090 20 70 61 67 65 20 67 65 74 74 65 72 20 6d 65 74   page getter met
360a0 68 6f 64 20 66 6f 72 20 77 68 65 6e 20 74 68 65  hod for when the
360b0 20 70 61 67 65 72 20 69 73 20 61 6e 20 65 72 72   pager is an err
360c0 6f 72 20 73 74 61 74 65 20 2a 2f 0a 73 74 61 74  or state */.stat
360d0 69 63 20 69 6e 74 20 67 65 74 50 61 67 65 45 72  ic int getPageEr
360e0 72 6f 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50  ror(.  Pager *pP
360f0 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68  ager,      /* Th
36100 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20  e pager open on 
36110 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
36120 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
36130 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
36140 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74  ge number to fet
36150 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a  ch */.  DbPage *
36160 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57  *ppPage,    /* W
36170 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74  rite a pointer t
36180 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20  o the page here 
36190 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
361a0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45           /* PAGE
361b0 52 5f 47 45 54 5f 58 58 58 20 66 6c 61 67 73 20  R_GET_XXX flags 
361c0 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  */.){.  UNUSED_P
361d0 41 52 41 4d 45 54 45 52 28 70 67 6e 6f 29 3b 0a  ARAMETER(pgno);.
361e0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
361f0 45 52 28 66 6c 61 67 73 29 3b 0a 20 20 61 73 73  ER(flags);.  ass
36200 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
36210 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code!=SQLITE_OK 
36220 29 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30  );.  *ppPage = 0
36230 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  ;.  return pPage
36240 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 7d 0a 0a 0a  r->errCode;.}...
36250 2f 2a 20 44 69 73 70 61 74 63 68 20 61 6c 6c 20  /* Dispatch all 
36260 70 61 67 65 20 66 65 74 63 68 20 72 65 71 75 65  page fetch reque
36270 73 74 73 20 74 6f 20 74 68 65 20 61 70 70 72 6f  sts to the appro
36280 70 72 69 61 74 65 20 67 65 74 74 65 72 20 6d 65  priate getter me
36290 74 68 6f 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  thod..*/.int sql
362a0 69 74 65 33 50 61 67 65 72 47 65 74 28 0a 20 20  ite3PagerGet(.  
362b0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
362c0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
362d0 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74   open on the dat
362e0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
362f0 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
36300 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
36310 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20  er to fetch */. 
36320 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65   DbPage **ppPage
36330 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20  ,    /* Write a 
36340 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
36350 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  age here */.  in
36360 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  t flags         
36370 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 58    /* PAGER_GET_X
36380 58 58 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20  XX flags */.){. 
36390 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
363a0 78 47 65 74 28 70 50 61 67 65 72 2c 20 70 67 6e  xGet(pPager, pgn
363b0 6f 2c 20 70 70 50 61 67 65 2c 20 66 6c 61 67 73  o, ppPage, flags
363c0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75  );.}../*.** Acqu
363d0 69 72 65 20 61 20 70 61 67 65 20 69 66 20 69 74  ire a page if it
363e0 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
363f0 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  he in-memory cac
36400 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72  he.  Do.** not r
36410 65 61 64 20 74 68 65 20 70 61 67 65 20 66 72 6f  ead the page fro
36420 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20  m disk.  Return 
36430 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
36440 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69   page,.** or 0 i
36450 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
36460 74 20 69 6e 20 63 61 63 68 65 2e 20 0a 2a 2a 0a  t in cache. .**.
36470 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
36480 74 65 33 50 61 67 65 72 47 65 74 28 29 2e 20 20  te3PagerGet().  
36490 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
364a0 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74  etween this rout
364b0 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74  ine.** and sqlit
364c0 65 33 50 61 67 65 72 47 65 74 28 29 20 69 73 20  e3PagerGet() is 
364d0 74 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c  that _get() will
364e0 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20   go to the disk 
364f0 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74  and read.** in t
36500 68 65 20 70 61 67 65 20 69 66 20 74 68 65 20 70  he page if the p
36510 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
36520 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68  dy in cache.  Th
36530 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  is routine.** re
36540 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68  turns NULL if th
36550 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
36560 20 63 61 63 68 65 20 6f 72 20 69 66 20 61 20 64   cache or if a d
36570 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a  isk I/O error .*
36580 2a 20 68 61 73 20 65 76 65 72 20 68 61 70 70 65  * has ever happe
36590 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a  ned..*/.DbPage *
365a0 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
365b0 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  up(Pager *pPager
365c0 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
365d0 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 70  sqlite3_pcache_p
365e0 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 61 73  age *pPage;.  as
365f0 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
36600 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e  );.  assert( pgn
36610 6f 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  o!=0 );.  assert
36620 28 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  ( pPager->pPCach
36630 65 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 20  e!=0 );.  pPage 
36640 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46  = sqlite3PcacheF
36650 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43  etch(pPager->pPC
36660 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 29 3b 0a  ache, pgno, 0);.
36670 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 3d    assert( pPage=
36680 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 68 61  =0 || pPager->ha
36690 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b 20  sHeldSharedLock 
366a0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 3d 3d  );.  if( pPage==
366b0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
366c0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 63  return sqlite3Pc
366d0 61 63 68 65 46 65 74 63 68 46 69 6e 69 73 68 28  acheFetchFinish(
366e0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
366f0 20 70 67 6e 6f 2c 20 70 50 61 67 65 29 3b 0a 7d   pgno, pPage);.}
36700 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
36710 61 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  a page reference
36720 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69  ..**.** The sqli
36730 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20  te3PagerUnref() 
36740 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  and sqlite3Pager
36750 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 29 20 6d  UnrefNotNull() m
36760 61 79 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20 75 73  ay only be.** us
36770 65 64 20 69 66 20 77 65 20 6b 6e 6f 77 20 74 68  ed if we know th
36780 61 74 20 74 68 65 20 70 61 67 65 20 62 65 69 6e  at the page bein
36790 67 20 72 65 6c 65 61 73 65 64 20 69 73 20 6e 6f  g released is no
367a0 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 2e  t the last page.
367b0 0a 2a 2a 20 54 68 65 20 62 74 72 65 65 20 6c 61  .** The btree la
367c0 79 65 72 20 61 6c 77 61 79 73 20 68 6f 6c 64 73  yer always holds
367d0 20 70 61 67 65 31 20 6f 70 65 6e 20 75 6e 74 69   page1 open unti
367e0 6c 20 74 68 65 20 65 6e 64 2c 20 73 6f 20 74 68  l the end, so th
367f0 65 73 65 20 66 69 72 73 74 0a 2a 2a 20 74 6f 20  ese first.** to 
36800 72 6f 75 74 69 6e 65 73 20 63 61 6e 20 62 65 20  routines can be 
36810 75 73 65 64 20 74 6f 20 72 65 6c 65 61 73 65 20  used to release 
36820 61 6e 79 20 70 61 67 65 20 6f 74 68 65 72 20 74  any page other t
36830 68 61 6e 20 42 74 53 68 61 72 65 64 2e 70 50 61  han BtShared.pPa
36840 67 65 31 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 73  ge1..**.** Use s
36850 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
36860 50 61 67 65 4f 6e 65 28 29 20 74 6f 20 72 65 6c  PageOne() to rel
36870 65 61 73 65 20 70 61 67 65 31 2e 20 20 54 68 69  ease page1.  Thi
36880 73 20 6c 61 74 74 65 72 20 72 6f 75 74 69 6e 65  s latter routine
36890 0a 2a 2a 20 63 68 65 63 6b 73 20 74 68 65 20 74  .** checks the t
368a0 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6f  otal number of o
368b0 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73  utstanding pages
368c0 20 61 6e 64 20 69 66 20 74 68 65 20 6e 75 6d 62   and if the numb
368d0 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 73 20 72  er of.** pages r
368e0 65 61 63 68 65 73 20 7a 65 72 6f 20 69 74 20 64  eaches zero it d
368f0 72 6f 70 73 20 74 68 65 20 64 61 74 61 62 61 73  rops the databas
36900 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20  e lock..*/.void 
36910 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
36920 66 4e 6f 74 4e 75 6c 6c 28 44 62 50 61 67 65 20  fNotNull(DbPage 
36930 2a 70 50 67 29 7b 0a 20 20 54 45 53 54 4f 4e 4c  *pPg){.  TESTONL
36940 59 28 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  Y( Pager *pPager
36950 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 20   = pPg->pPager; 
36960 29 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 21  ).  assert( pPg!
36970 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 67 2d  =0 );.  if( pPg-
36980 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4d  >flags & PGHDR_M
36990 4d 41 50 20 29 7b 0a 20 20 20 20 61 73 73 65 72  MAP ){.    asser
369a0 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 31 20  t( pPg->pgno!=1 
369b0 29 3b 20 20 2f 2a 20 50 61 67 65 31 20 69 73 20  );  /* Page1 is 
369c0 6e 65 76 65 72 20 6d 65 6d 6f 72 79 20 6d 61 70  never memory map
369d0 70 65 64 20 2a 2f 0a 20 20 20 20 70 61 67 65 72  ped */.    pager
369e0 52 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28 70  ReleaseMapPage(p
369f0 50 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Pg);.  }else{.  
36a00 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52    sqlite3PcacheR
36a10 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d  elease(pPg);.  }
36a20 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 75 73 65  .  /* Do not use
36a30 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f   this routine to
36a40 20 72 65 6c 65 61 73 65 20 74 68 65 20 6c 61 73   release the las
36a50 74 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70  t reference to p
36a60 61 67 65 31 20 2a 2f 0a 20 20 61 73 73 65 72 74  age1 */.  assert
36a70 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  ( sqlite3PcacheR
36a80 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
36a90 70 50 43 61 63 68 65 29 3e 30 20 29 3b 0a 7d 0a  pPCache)>0 );.}.
36aa0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
36ab0 72 55 6e 72 65 66 28 44 62 50 61 67 65 20 2a 70  rUnref(DbPage *p
36ac0 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 20 29  Pg){.  if( pPg )
36ad0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
36ae0 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 67 29 3b 0a  efNotNull(pPg);.
36af0 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  }.void sqlite3Pa
36b00 67 65 72 55 6e 72 65 66 50 61 67 65 4f 6e 65 28  gerUnrefPageOne(
36b10 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
36b20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20  Pager *pPager;. 
36b30 20 61 73 73 65 72 74 28 20 70 50 67 21 3d 30 20   assert( pPg!=0 
36b40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  );.  assert( pPg
36b50 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 0a 20 20 61  ->pgno==1 );.  a
36b60 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c 61  ssert( (pPg->fla
36b70 67 73 20 26 20 50 47 48 44 52 5f 4d 4d 41 50 29  gs & PGHDR_MMAP)
36b80 3d 3d 30 20 29 3b 20 2f 2a 20 50 61 67 65 31 20  ==0 ); /* Page1 
36b90 69 73 20 6e 65 76 65 72 20 6d 65 6d 6f 72 79 20  is never memory 
36ba0 6d 61 70 70 65 64 20 2a 2f 0a 20 20 70 50 61 67  mapped */.  pPag
36bb0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
36bc0 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
36bd0 52 65 73 65 74 4c 6f 63 6b 54 69 6d 65 6f 75 74  ResetLockTimeout
36be0 28 70 50 61 67 65 72 29 3b 0a 20 20 73 71 6c 69  (pPager);.  sqli
36bf0 74 65 33 50 63 61 63 68 65 52 65 6c 65 61 73 65  te3PcacheRelease
36c00 28 70 50 67 29 3b 0a 20 20 70 61 67 65 72 55 6e  (pPg);.  pagerUn
36c10 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61  lockIfUnused(pPa
36c20 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ger);.}../*.** T
36c30 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
36c40 63 61 6c 6c 65 64 20 61 74 20 74 68 65 20 73 74  called at the st
36c50 61 72 74 20 6f 66 20 65 76 65 72 79 20 77 72 69  art of every wri
36c60 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  te transaction..
36c70 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 61 6c  ** There must al
36c80 72 65 61 64 79 20 62 65 20 61 20 52 45 53 45 52  ready be a RESER
36c90 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45  VED or EXCLUSIVE
36ca0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
36cb0 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 77  abase .** file w
36cc0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
36cd0 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
36ce0 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  * Open the journ
36cf0 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65  al file for page
36d00 72 20 70 50 61 67 65 72 20 61 6e 64 20 77 72 69  r pPager and wri
36d10 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61  te a journal hea
36d20 64 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74  der.** to the st
36d30 61 72 74 20 6f 66 20 69 74 2e 20 49 66 20 74 68  art of it. If th
36d40 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20 73  ere are active s
36d50 61 76 65 70 6f 69 6e 74 73 2c 20 6f 70 65 6e 20  avepoints, open 
36d60 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a  the sub-journal.
36d70 2a 2a 20 61 73 20 77 65 6c 6c 2e 20 54 68 69 73  ** as well. This
36d80 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
36d90 79 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20  y used when the 
36da0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
36db0 62 65 69 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65 64  being .** opened
36dc0 20 74 6f 20 77 72 69 74 65 20 61 20 72 6f 6c 6c   to write a roll
36dd0 62 61 63 6b 20 6c 6f 67 20 66 6f 72 20 61 20 74  back log for a t
36de0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69  ransaction. It i
36df0 73 20 6e 6f 74 20 75 73 65 64 20 0a 2a 2a 20 77  s not used .** w
36e00 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 68 6f  hen opening a ho
36e10 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  t journal file t
36e20 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a  o roll it back..
36e30 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  **.** If the jou
36e40 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6c 72  rnal file is alr
36e50 65 61 64 79 20 6f 70 65 6e 20 28 61 73 20 69 74  eady open (as it
36e60 20 6d 61 79 20 62 65 20 69 6e 20 65 78 63 6c 75   may be in exclu
36e70 73 69 76 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74  sive mode),.** t
36e80 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
36e90 6e 20 6a 75 73 74 20 77 72 69 74 65 73 20 61 20  n just writes a 
36ea0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74  journal header t
36eb0 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
36ec0 68 65 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 70  he.** already op
36ed0 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  en file. .**.** 
36ee0 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  Whether or not t
36ef0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
36f00 69 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68 69  is opened by thi
36f10 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 0a  s function, the.
36f20 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72  ** Pager.pInJour
36f30 6e 61 6c 20 62 69 74 76 65 63 20 73 74 72 75 63  nal bitvec struc
36f40 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
36f50 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  d..**.** Return 
36f60 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
36f70 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65  rything is succe
36f80 73 73 66 75 6c 2e 20 4f 74 68 65 72 77 69 73 65  ssful. Otherwise
36f90 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c  , return .** SQL
36fa0 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 74 68 65  ITE_NOMEM if the
36fb0 20 61 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f   attempt to allo
36fc0 63 61 74 65 20 50 61 67 65 72 2e 70 49 6e 4a 6f  cate Pager.pInJo
36fd0 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20  urnal fails, or 
36fe0 0a 2a 2a 20 61 6e 20 49 4f 20 65 72 72 6f 72 20  .** an IO error 
36ff0 63 6f 64 65 20 69 66 20 6f 70 65 6e 69 6e 67 20  code if opening 
37000 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 6a  or writing the j
37010 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c  ournal file fail
37020 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
37030 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
37040 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
37050 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
37060 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
37070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37080 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
37090 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  */.  sqlite3_vfs
370a0 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20   * const pVfs = 
370b0 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 20 20 20  pPager->pVfs;   
370c0 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
370d0 66 20 76 66 73 20 70 6f 69 6e 74 65 72 20 2a 2f  f vfs pointer */
370e0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
370f0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
37100 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
37110 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  );.  assert( ass
37120 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
37130 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
37140 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e  ert( pPager->pIn
37150 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
37160 0a 20 20 2f 2a 20 49 66 20 61 6c 72 65 61 64 79  .  /* If already
37170 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74   in the error st
37180 61 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ate, this functi
37190 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20  on is a no-op.  
371a0 42 75 74 20 6f 6e 0a 20 20 2a 2a 20 74 68 65 20  But on.  ** the 
371b0 6f 74 68 65 72 20 68 61 6e 64 2c 20 74 68 69 73  other hand, this
371c0 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65   routine is neve
371d0 72 20 63 61 6c 6c 65 64 20 69 66 20 77 65 20 61  r called if we a
371e0 72 65 20 61 6c 72 65 61 64 79 20 69 6e 0a 20 20  re already in.  
371f0 2a 2a 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74  ** an error stat
37200 65 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  e. */.  if( NEVE
37210 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  R(pPager->errCod
37220 65 29 20 29 20 72 65 74 75 72 6e 20 70 50 61 67  e) ) return pPag
37230 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20  er->errCode;..  
37240 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  if( !pagerUseWal
37250 28 70 50 61 67 65 72 29 20 26 26 20 70 50 61 67  (pPager) && pPag
37260 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21  er->journalMode!
37270 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
37280 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20 70 50  DE_OFF ){.    pP
37290 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
372a0 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
372b0 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 64  Create(pPager->d
372c0 62 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20  bSize);.    if( 
372d0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
372e0 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  al==0 ){.      r
372f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
37300 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EM_BKPT;.    }. 
37310 20 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68   .    /* Open th
37320 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
37330 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
37340 61 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20 20  ady open. */.   
37350 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61   if( !isOpen(pPa
37360 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
37370 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
37380 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
37390 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
373a0 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20  MORY ){.        
373b0 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61  sqlite3MemJourna
373c0 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  lOpen(pPager->jf
373d0 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  d);.      }else{
373e0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66 6c 61  .        int fla
373f0 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs = SQLITE_OPEN
37400 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
37410 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 3b 0a 20  E_OPEN_CREATE;. 
37420 20 20 20 20 20 20 20 69 6e 74 20 6e 53 70 69 6c         int nSpil
37430 6c 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  l;..        if( 
37440 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
37450 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c   ){.          fl
37460 61 67 73 20 7c 3d 20 28 53 51 4c 49 54 45 5f 4f  ags |= (SQLITE_O
37470 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
37480 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  E|SQLITE_OPEN_TE
37490 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20  MP_JOURNAL);.   
374a0 20 20 20 20 20 20 20 6e 53 70 69 6c 6c 20 3d 20         nSpill = 
374b0 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 6e 53  sqlite3Config.nS
374c0 74 6d 74 53 70 69 6c 6c 3b 0a 20 20 20 20 20 20  tmtSpill;.      
374d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
374e0 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49     flags |= SQLI
374f0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
37500 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20  RNAL;.          
37510 6e 53 70 69 6c 6c 20 3d 20 6a 72 6e 6c 42 75 66  nSpill = jrnlBuf
37520 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b  ferSize(pPager);
37530 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
37540 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 2f 2a       .        /*
37550 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
37560 20 64 61 74 61 62 61 73 65 20 73 74 69 6c 6c 20   database still 
37570 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  has the same nam
37580 65 20 61 73 20 69 74 20 64 69 64 20 77 68 65 6e  e as it did when
37590 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 77  .        ** it w
375a0 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 6f 70  as originally op
375b0 65 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ened. */.       
375c0 20 72 63 20 3d 20 64 61 74 61 62 61 73 65 49 73   rc = databaseIs
375d0 55 6e 6d 6f 76 65 64 28 70 50 61 67 65 72 29 3b  Unmoved(pPager);
375e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
375f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
37600 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
37610 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 20  ite3JournalOpen 
37620 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
37630 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
37640 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
37650 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6e 53 70 69  jfd, flags, nSpi
37660 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  ll.          );.
37670 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
37680 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
37690 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
376a0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
376b0 6a 66 64 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20  jfd) );.    }.  
376c0 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65  .  .    /* Write
376d0 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
376e0 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68 65  al header to the
376f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e   journal file an
37700 64 20 6f 70 65 6e 20 0a 20 20 20 20 2a 2a 20 74  d open .    ** t
37710 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  he sub-journal i
37720 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20  f necessary..   
37730 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
37740 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
37750 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63     /* TODO: Chec
37760 6b 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 73  k if all of thes
37770 65 20 61 72 65 20 72 65 61 6c 6c 79 20 72 65 71  e are really req
37780 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  uired. */.      
37790 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
377a0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
377b0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
377c0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65        pPager->se
377d0 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  tMaster = 0;.   
377e0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
377f0 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 20 20 20  alHdr = 0;.     
37800 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e   rc = writeJourn
37810 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
37820 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
37830 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
37840 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76  .    sqlite3Bitv
37850 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
37860 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->pInJournal);. 
37870 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f     pPager->pInJo
37880 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d 65 6c  urnal = 0;.  }el
37890 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
378a0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
378b0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
378c0 4b 45 44 20 29 3b 0a 20 20 20 20 70 50 61 67 65  KED );.    pPage
378d0 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
378e0 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
378f0 44 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  D;.  }..  return
37900 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65   rc;.}../*.** Be
37910 67 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e  gin a write-tran
37920 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73  saction on the s
37930 70 65 63 69 66 69 65 64 20 70 61 67 65 72 20 6f  pecified pager o
37940 62 6a 65 63 74 2e 20 49 66 20 61 20 0a 2a 2a 20  bject. If a .** 
37950 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
37960 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
37970 65 6e 20 6f 70 65 6e 65 64 2c 20 74 68 69 73 20  en opened, this 
37980 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
37990 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  -op..**.** If th
379a0 65 20 65 78 46 6c 61 67 20 61 72 67 75 6d 65 6e  e exFlag argumen
379b0 74 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e  t is false, then
379c0 20 61 63 71 75 69 72 65 20 61 74 20 6c 65 61 73   acquire at leas
379d0 74 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20  t a RESERVED.** 
379e0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
379f0 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 65 78  base file. If ex
37a00 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68  Flag is true, th
37a10 65 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c 65  en acquire at le
37a20 61 73 74 0a 2a 2a 20 61 6e 20 45 58 43 4c 55 53  ast.** an EXCLUS
37a30 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 73 75 63  IVE lock. If suc
37a40 68 20 61 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65  h a lock is alre
37a50 61 64 79 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f 63  ady held, no loc
37a60 6b 69 6e 67 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  king .** functio
37a70 6e 73 20 6e 65 65 64 20 62 65 20 63 61 6c 6c 65  ns need be calle
37a80 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
37a90 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67  subjInMemory arg
37aa0 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65 72  ument is non-zer
37ab0 6f 2c 20 74 68 65 6e 20 61 6e 79 20 73 75 62 2d  o, then any sub-
37ac0 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 65 64 0a 2a  journal opened.*
37ad0 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20 74 72  * within this tr
37ae0 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62  ansaction will b
37af0 65 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69  e opened as an i
37b00 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2e 20 54  n-memory file. T
37b10 68 69 73 0a 2a 2a 20 68 61 73 20 6e 6f 20 65 66  his.** has no ef
37b20 66 65 63 74 20 69 66 20 74 68 65 20 73 75 62 2d  fect if the sub-
37b30 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 72 65 61  journal is alrea
37b40 64 79 20 6f 70 65 6e 65 64 20 28 61 73 20 69 74  dy opened (as it
37b50 20 6d 61 79 20 62 65 20 77 68 65 6e 0a 2a 2a 20   may be when.** 
37b60 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
37b70 73 69 76 65 20 6d 6f 64 65 29 20 6f 72 20 69 66  sive mode) or if
37b80 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
37b90 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72   does not requir
37ba0 65 20 61 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e  e a.** sub-journ
37bb0 61 6c 2e 20 49 66 20 74 68 65 20 73 75 62 6a 49  al. If the subjI
37bc0 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74  nMemory argument
37bd0 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 61   is zero, then a
37be0 6e 79 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 73  ny required.** s
37bf0 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 69 6d  ub-journal is im
37c00 70 6c 65 6d 65 6e 74 65 64 20 69 6e 2d 6d 65 6d  plemented in-mem
37c10 6f 72 79 20 69 66 20 70 50 61 67 65 72 20 69 73  ory if pPager is
37c20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
37c30 74 61 62 61 73 65 2c 20 0a 2a 2a 20 6f 72 20 75  tabase, .** or u
37c40 73 69 6e 67 20 61 20 74 65 6d 70 6f 72 61 72 79  sing a temporary
37c50 20 66 69 6c 65 20 6f 74 68 65 72 77 69 73 65 2e   file otherwise.
37c60 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
37c70 61 67 65 72 42 65 67 69 6e 28 50 61 67 65 72 20  agerBegin(Pager 
37c80 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 78 46  *pPager, int exF
37c90 6c 61 67 2c 20 69 6e 74 20 73 75 62 6a 49 6e 4d  lag, int subjInM
37ca0 65 6d 6f 72 79 29 7b 0a 20 20 69 6e 74 20 72 63  emory){.  int rc
37cb0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
37cc0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
37cd0 43 6f 64 65 20 29 20 72 65 74 75 72 6e 20 70 50  Code ) return pP
37ce0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
37cf0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
37d00 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  >eState>=PAGER_R
37d10 45 41 44 45 52 20 26 26 20 70 50 61 67 65 72 2d  EADER && pPager-
37d20 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f 45 52  >eState<PAGER_ER
37d30 52 4f 52 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  ROR );.  pPager-
37d40 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 3d 20  >subjInMemory = 
37d50 28 75 38 29 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  (u8)subjInMemory
37d60 3b 0a 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  ;..  if( ALWAYS(
37d70 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
37d80 50 41 47 45 52 5f 52 45 41 44 45 52 29 20 29 7b  PAGER_READER) ){
37d90 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
37da0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
37db0 3d 30 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  =0 );..    if( p
37dc0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
37dd0 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  r) ){.      /* I
37de0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 63  f the pager is c
37df0 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73 65  onfigured to use
37e00 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78   locking_mode=ex
37e10 63 6c 75 73 69 76 65 2c 20 61 6e 64 20 61 6e 0a  clusive, and an.
37e20 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69        ** exclusi
37e30 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ve lock on the d
37e40 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61  atabase is not a
37e50 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6f 62 74  lready held, obt
37e60 61 69 6e 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20  ain it now..    
37e70 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
37e80 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
37e90 4d 6f 64 65 20 26 26 20 73 71 6c 69 74 65 33 57  Mode && sqlite3W
37ea0 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28  alExclusiveMode(
37eb0 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 2d 31  pPager->pWal, -1
37ec0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
37ed0 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50  = pagerLockDb(pP
37ee0 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
37ef0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69  LOCK);.        i
37f00 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
37f10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
37f20 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
37f30 20 7d 0a 20 20 20 20 20 20 20 20 28 76 6f 69 64   }.        (void
37f40 29 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75  )sqlite3WalExclu
37f50 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d  siveMode(pPager-
37f60 3e 70 57 61 6c 2c 20 31 29 3b 0a 20 20 20 20 20  >pWal, 1);.     
37f70 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 72 61   }..      /* Gra
37f80 62 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  b the write lock
37f90 20 6f 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65   on the log file
37fa0 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
37fb0 20 75 70 67 72 61 64 65 20 74 6f 0a 20 20 20 20   upgrade to.    
37fc0 20 20 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52    ** PAGER_RESER
37fd0 56 45 44 20 73 74 61 74 65 2e 20 4f 74 68 65 72  VED state. Other
37fe0 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20  wise, return an 
37ff0 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68  error code to th
38000 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20  e caller..      
38010 2a 2a 20 54 68 65 20 62 75 73 79 2d 68 61 6e 64  ** The busy-hand
38020 6c 65 72 20 69 73 20 6e 6f 74 20 69 6e 76 6f 6b  ler is not invok
38030 65 64 20 69 66 20 61 6e 6f 74 68 65 72 20 63 6f  ed if another co
38040 6e 6e 65 63 74 69 6f 6e 20 61 6c 72 65 61 64 79  nnection already
38050 0a 20 20 20 20 20 20 2a 2a 20 68 6f 6c 64 73 20  .      ** holds 
38060 74 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 20  the write-lock. 
38070 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65  If possible, the
38080 20 75 70 70 65 72 20 6c 61 79 65 72 20 77 69 6c   upper layer wil
38090 6c 20 63 61 6c 6c 20 69 74 2e 0a 20 20 20 20 20  l call it..     
380a0 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
380b0 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 57 72  qlite3WalBeginWr
380c0 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  iteTransaction(p
380d0 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20  Pager->pWal);.  
380e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
380f0 2a 20 4f 62 74 61 69 6e 20 61 20 52 45 53 45 52  * Obtain a RESER
38100 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  VED lock on the 
38110 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
38120 66 20 74 68 65 20 65 78 46 6c 61 67 20 70 61 72  f the exFlag par
38130 61 6d 65 74 65 72 0a 20 20 20 20 20 20 2a 2a 20  ameter.      ** 
38140 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 69 6d  is true, then im
38150 6d 65 64 69 61 74 65 6c 79 20 75 70 67 72 61 64  mediately upgrad
38160 65 20 74 68 69 73 20 74 6f 20 61 6e 20 45 58 43  e this to an EXC
38170 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65  LUSIVE lock. The
38180 0a 20 20 20 20 20 20 2a 2a 20 62 75 73 79 2d 68  .      ** busy-h
38190 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20  andler callback 
381a0 63 61 6e 20 62 65 20 75 73 65 64 20 77 68 65 6e  can be used when
381b0 20 75 70 67 72 61 64 69 6e 67 20 74 6f 20 74 68   upgrading to th
381c0 65 20 45 58 43 4c 55 53 49 56 45 0a 20 20 20 20  e EXCLUSIVE.    
381d0 20 20 2a 2a 20 6c 6f 63 6b 2c 20 62 75 74 20 6e    ** lock, but n
381e0 6f 74 20 77 68 65 6e 20 6f 62 74 61 69 6e 69 6e  ot when obtainin
381f0 67 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c  g the RESERVED l
38200 6f 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ock..      */.  
38210 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f      rc = pagerLo
38220 63 6b 44 62 28 70 50 61 67 65 72 2c 20 52 45 53  ckDb(pPager, RES
38230 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  ERVED_LOCK);.   
38240 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
38250 45 5f 4f 4b 20 26 26 20 65 78 46 6c 61 67 20 29  E_OK && exFlag )
38260 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
38270 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
38280 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  k(pPager, EXCLUS
38290 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
382a0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66   }.    }..    if
382b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
382c0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 68 61 6e  ){.      /* Chan
382d0 67 65 20 74 6f 20 57 52 49 54 45 52 5f 4c 4f 43  ge to WRITER_LOC
382e0 4b 45 44 20 73 74 61 74 65 2e 0a 20 20 20 20 20  KED state..     
382f0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 57 41 4c   **.      ** WAL
38300 20 6d 6f 64 65 20 73 65 74 73 20 50 61 67 65 72   mode sets Pager
38310 2e 65 53 74 61 74 65 20 74 6f 20 50 41 47 45 52  .eState to PAGER
38320 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 6f  _WRITER_LOCKED o
38330 72 20 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20  r CACHEMOD.     
38340 20 2a 2a 20 77 68 65 6e 20 69 74 20 68 61 73 20   ** when it has 
38350 61 6e 20 6f 70 65 6e 20 74 72 61 6e 73 61 63 74  an open transact
38360 69 6f 6e 2c 20 62 75 74 20 6e 65 76 65 72 20 74  ion, but never t
38370 6f 20 44 42 4d 4f 44 20 6f 72 20 46 49 4e 49 53  o DBMOD or FINIS
38380 48 45 44 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68  HED..      ** Th
38390 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69 6e  is is because in
383a0 20 74 68 6f 73 65 20 73 74 61 74 65 73 20 74 68   those states th
383b0 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 20 62  e code to roll b
383c0 61 63 6b 20 73 61 76 65 70 6f 69 6e 74 20 0a 20  ack savepoint . 
383d0 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
383e0 69 6f 6e 73 20 6d 61 79 20 63 6f 70 79 20 64 61  ions may copy da
383f0 74 61 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  ta from the sub-
38400 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65  journal into the
38410 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 20   database .     
38420 20 2a 2a 20 66 69 6c 65 20 61 73 20 77 65 6c 6c   ** file as well
38430 20 61 73 20 69 6e 74 6f 20 74 68 65 20 70 61 67   as into the pag
38440 65 20 63 61 63 68 65 2e 20 57 68 69 63 68 20 77  e cache. Which w
38450 6f 75 6c 64 20 62 65 20 69 6e 63 6f 72 72 65 63  ould be incorrec
38460 74 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 57  t in .      ** W
38470 41 4c 20 6d 6f 64 65 2e 0a 20 20 20 20 20 20 2a  AL mode..      *
38480 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  /.      pPager->
38490 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57  eState = PAGER_W
384a0 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3b 0a 20 20  RITER_LOCKED;.  
384b0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 48 69      pPager->dbHi
384c0 6e 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  ntSize = pPager-
384d0 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70  >dbSize;.      p
384e0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
384f0 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
38500 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  ze;.      pPager
38510 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d 20 70  ->dbOrigSize = p
38520 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
38530 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
38540 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
38550 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20   }..    assert( 
38560 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
38570 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
38580 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b  =PAGER_READER );
38590 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
385a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
385b0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
385c0 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
385d0 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  D );.    assert(
385e0 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
385f0 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
38600 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45   }..  PAGERTRACE
38610 28 28 22 54 52 41 4e 53 41 43 54 49 4f 4e 20 25  (("TRANSACTION %
38620 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
38630 61 67 65 72 29 29 29 3b 0a 20 20 72 65 74 75 72  ager)));.  retur
38640 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  n rc;.}../*.** W
38650 72 69 74 65 20 70 61 67 65 20 70 50 67 20 6f 6e  rite page pPg on
38660 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
38670 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
38680 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  al..*/.static SQ
38690 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e  LITE_NOINLINE in
386a0 74 20 70 61 67 65 72 41 64 64 50 61 67 65 54 6f  t pagerAddPageTo
386b0 52 6f 6c 6c 62 61 63 6b 4a 6f 75 72 6e 61 6c 28  RollbackJournal(
386c0 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
3