/ Hex Artifact Content
Login

Artifact b99ae56c331ea1129d06c0e6634daa4a7fa544dffe76a4f520febbc9b9afc0a8:


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 23 69 66 64 65   */.#endif.#ifde
89b0: 66 20 53 51 4c 49 54 45 5f 53 45 52 56 45 52 5f  f SQLITE_SERVER_
89c0: 45 44 49 54 49 4f 4e 0a 20 20 53 65 72 76 65 72  EDITION.  Server
89d0: 20 2a 70 53 65 72 76 65 72 3b 0a 20 20 53 65 72   *pServer;.  Ser
89e0: 76 65 72 50 61 67 65 20 2a 70 53 65 72 76 65 72  verPage *pServer
89f0: 50 61 67 65 3b 0a 23 65 6e 64 69 66 0a 7d 3b 0a  Page;.#endif.};.
8a00: 0a 2f 2a 0a 2a 2a 20 49 6e 64 65 78 65 73 20 66  ./*.** Indexes f
8a10: 6f 72 20 75 73 65 20 77 69 74 68 20 50 61 67 65  or use with Page
8a20: 72 2e 61 53 74 61 74 5b 5d 2e 20 54 68 65 20 50  r.aStat[]. The P
8a30: 61 67 65 72 2e 61 53 74 61 74 5b 5d 20 61 72 72  ager.aStat[] arr
8a40: 61 79 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74  ay contains.** t
8a50: 68 65 20 76 61 6c 75 65 73 20 61 63 63 65 73 73  he values access
8a60: 65 64 20 62 79 20 70 61 73 73 69 6e 67 20 53 51  ed by passing SQ
8a70: 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41  LITE_DBSTATUS_CA
8a80: 43 48 45 5f 48 49 54 2c 20 43 41 43 48 45 5f 4d  CHE_HIT, CACHE_M
8a90: 49 53 53 20 0a 2a 2a 20 6f 72 20 43 41 43 48 45  ISS .** or CACHE
8aa0: 5f 57 52 49 54 45 20 74 6f 20 73 71 6c 69 74 65  _WRITE to sqlite
8ab0: 33 5f 64 62 5f 73 74 61 74 75 73 28 29 2e 0a 2a  3_db_status()..*
8ac0: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
8ad0: 53 54 41 54 5f 48 49 54 20 20 20 30 0a 23 64 65  STAT_HIT   0.#de
8ae0: 66 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f  fine PAGER_STAT_
8af0: 4d 49 53 53 20 20 31 0a 23 64 65 66 69 6e 65 20  MISS  1.#define 
8b00: 50 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45  PAGER_STAT_WRITE
8b10: 20 32 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   2.#define PAGER
8b20: 5f 53 54 41 54 5f 53 50 49 4c 4c 20 33 0a 0a 2f  _STAT_SPILL 3../
8b30: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
8b40: 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  ng global variab
8b50: 6c 65 73 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72  les hold counter
8b60: 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65  s used for.** te
8b70: 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 20 6f  sting purposes o
8b80: 6e 6c 79 2e 20 20 54 68 65 73 65 20 76 61 72 69  nly.  These vari
8b90: 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 65 78 69  ables do not exi
8ba0: 73 74 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74  st in.** a non-t
8bb0: 65 73 74 69 6e 67 20 62 75 69 6c 64 2e 20 20 54  esting build.  T
8bc0: 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 61  hese variables a
8bd0: 72 65 20 6e 6f 74 20 74 68 72 65 61 64 2d 73 61  re not thread-sa
8be0: 66 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  fe..*/.#ifdef SQ
8bf0: 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71  LITE_TEST.int sq
8c00: 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64  lite3_pager_read
8c10: 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20  db_count = 0;   
8c20: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75   /* Number of fu
8c30: 6c 6c 20 70 61 67 65 73 20 72 65 61 64 20 66 72  ll pages read fr
8c40: 6f 6d 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c  om DB */.int sql
8c50: 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65  ite3_pager_write
8c60: 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20  db_count = 0;   
8c70: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c  /* Number of ful
8c80: 6c 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20  l pages written 
8c90: 74 6f 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c  to DB */.int sql
8ca0: 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65  ite3_pager_write
8cb0: 6a 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20  j_count = 0;    
8cc0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
8cd0: 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f  es written to jo
8ce0: 75 72 6e 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e  urnal */.# defin
8cf0: 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 20  e PAGER_INCR(v) 
8d00: 20 76 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66   v++.#else.# def
8d10: 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76  ine PAGER_INCR(v
8d20: 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a  ).#endif..../*.*
8d30: 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  * Journal files 
8d40: 62 65 67 69 6e 20 77 69 74 68 20 74 68 65 20 66  begin with the f
8d50: 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73  ollowing magic s
8d60: 74 72 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61  tring.  The data
8d70: 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64  .** was obtained
8d80: 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f   from /dev/rando
8d90: 6d 2e 20 20 49 74 20 69 73 20 75 73 65 64 20 6f  m.  It is used o
8da0: 6e 6c 79 20 61 73 20 61 20 73 61 6e 69 74 79 20  nly as a sanity 
8db0: 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e  check..**.** Sin
8dc0: 63 65 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30  ce version 2.8.0
8dd0: 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f  , the journal fo
8de0: 72 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64  rmat contains ad
8df0: 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a  ditional sanity.
8e00: 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f  ** checking info
8e10: 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65  rmation.  If the
8e20: 20 70 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69   power fails whi
8e30: 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  le the journal i
8e40: 73 20 62 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74  s being.** writt
8e50: 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20  en, semi-random 
8e60: 67 61 72 62 61 67 65 20 64 61 74 61 20 6d 69 67  garbage data mig
8e70: 68 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  ht appear in the
8e80: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
8e90: 20 61 66 74 65 72 20 70 6f 77 65 72 20 69 73 20   after power is 
8ea0: 72 65 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e  restored.  If an
8eb0: 20 61 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e   attempt is then
8ec0: 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c   made.** to roll
8ed0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63   the journal bac
8ee0: 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  k, the database 
8ef0: 63 6f 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74  could be corrupt
8f00: 65 64 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f  ed.  The additio
8f10: 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68  nal.** sanity ch
8f20: 65 63 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61  ecking data is a
8f30: 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73  n attempt to dis
8f40: 63 6f 76 65 72 20 74 68 65 20 67 61 72 62 61 67  cover the garbag
8f50: 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  e in the.** jour
8f60: 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69  nal and ignore i
8f70: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e  t..**.** The san
8f80: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66  ity checking inf
8f90: 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  ormation for the
8fa0: 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   new journal for
8fb0: 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20  mat consists.** 
8fc0: 6f 66 20 61 20 33 32 2d 62 69 74 20 63 68 65 63  of a 32-bit chec
8fd0: 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67  ksum on each pag
8fe0: 65 20 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20  e of data.  The 
8ff0: 63 68 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20  checksum covers 
9000: 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65  both.** the page
9010: 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20   number and the 
9020: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
9030: 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 66   bytes of data f
9040: 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20  or the page..** 
9050: 54 68 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e  This cksum is in
9060: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33  itialized to a 3
9070: 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c  2-bit random val
9080: 75 65 20 74 68 61 74 20 61 70 70 65 61 72 73 20  ue that appears 
9090: 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  in the.** journa
90a0: 6c 20 66 69 6c 65 20 72 69 67 68 74 20 61 66 74  l file right aft
90b0: 65 72 20 74 68 65 20 68 65 61 64 65 72 2e 20 20  er the header.  
90c0: 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69  The random initi
90d0: 61 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74  alizer is import
90e0: 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20  ant,.** because 
90f0: 67 61 72 62 61 67 65 20 64 61 74 61 20 74 68 61  garbage data tha
9100: 74 20 61 70 70 65 61 72 73 20 61 74 20 74 68 65  t appears at the
9110: 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61   end of a journa
9120: 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64  l is likely.** d
9130: 61 74 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63  ata that was onc
9140: 65 20 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73  e in other files
9150: 20 74 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62   that have now b
9160: 65 65 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66  een deleted.  If
9170: 20 74 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20   the.** garbage 
9180: 64 61 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61  data came from a
9190: 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e  n obsolete journ
91a0: 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65  al file, the che
91b0: 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20  cksums might.** 
91c0: 62 65 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74  be correct.  But
91d0: 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67   by initializing
91e0: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f   the checksum to
91f0: 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68   random value wh
9200: 69 63 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72  ich.** is differ
9210: 65 6e 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f  ent for every jo
9220: 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69  urnal, we minimi
9230: 7a 65 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f  ze that risk..*/
9240: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e  .static const un
9250: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75  signed char aJou
9260: 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a  rnalMagic[] = {.
9270: 20 20 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78    0xd9, 0xd5, 0x
9280: 30 35 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20  05, 0xf9, 0x20, 
9290: 30 78 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37  0xa1, 0x63, 0xd7
92a0: 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ,.};../*.** The 
92b0: 73 69 7a 65 20 6f 66 20 74 68 65 20 6f 66 20 65  size of the of e
92c0: 61 63 68 20 70 61 67 65 20 72 65 63 6f 72 64 20  ach page record 
92d0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  in the journal i
92e0: 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68  s given by.** th
92f0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72  e following macr
9300: 6f 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f  o..*/.#define JO
9310: 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
9320: 65 72 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70  er)  ((pPager->p
9330: 61 67 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f  ageSize) + 8)../
9340: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
9350: 20 68 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72   header size for
9360: 20 74 68 69 73 20 70 61 67 65 72 2e 20 54 68 69   this pager. Thi
9370: 73 20 69 73 20 75 73 75 61 6c 6c 79 20 74 68 65  s is usually the
9380: 20 73 61 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61   same .** size a
9390: 73 20 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20  s a single disk 
93a0: 73 65 63 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f  sector. See also
93b0: 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 29   setSectorSize()
93c0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55  ..*/.#define JOU
93d0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
93e0: 65 72 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63  er) (pPager->sec
93f0: 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20  torSize)../*.** 
9400: 54 68 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20  The macro MEMDB 
9410: 69 73 20 74 72 75 65 20 69 66 20 77 65 20 61 72  is true if we ar
9420: 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
9430: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
9440: 62 61 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74  base..** We do t
9450: 68 69 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73  his as a macro s
9460: 6f 20 74 68 61 74 20 69 66 20 74 68 65 20 53 51  o that if the SQ
9470: 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
9480: 44 42 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c  DB macro is set,
9490: 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
94a0: 20 4d 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61   MEMDB will be a
94b0: 20 63 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68   constant and th
94c0: 65 20 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20  e compiler will 
94d0: 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20  optimize.** out 
94e0: 63 6f 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20  code that would 
94f0: 6e 65 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a  never execute..*
9500: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
9510: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20  OMIT_MEMORYDB.# 
9520: 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23  define MEMDB 0.#
9530: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45  else.# define ME
9540: 4d 44 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  MDB pPager->memD
9550: 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  b.#endif../*.** 
9560: 54 68 65 20 6d 61 63 72 6f 20 55 53 45 46 45 54  The macro USEFET
9570: 43 48 20 69 73 20 74 72 75 65 20 69 66 20 77 65  CH is true if we
9580: 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20   are allowed to 
9590: 75 73 65 20 74 68 65 20 78 46 65 74 63 68 20 61  use the xFetch a
95a0: 6e 64 20 78 55 6e 66 65 74 63 68 0a 2a 2a 20 69  nd xUnfetch.** i
95b0: 6e 74 65 72 66 61 63 65 73 20 74 6f 20 61 63 63  nterfaces to acc
95c0: 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ess the database
95d0: 20 75 73 69 6e 67 20 6d 65 6d 6f 72 79 2d 6d 61   using memory-ma
95e0: 70 70 65 64 20 49 2f 4f 2e 0a 2a 2f 0a 23 69 66  pped I/O..*/.#if
95f0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
9600: 5f 53 49 5a 45 3e 30 0a 23 20 64 65 66 69 6e 65  _SIZE>0.# define
9610: 20 55 53 45 46 45 54 43 48 28 78 29 20 28 28 78   USEFETCH(x) ((x
9620: 29 2d 3e 62 55 73 65 46 65 74 63 68 29 0a 23 65  )->bUseFetch).#e
9630: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 55 53 45  lse.# define USE
9640: 46 45 54 43 48 28 78 29 20 30 0a 23 65 6e 64 69  FETCH(x) 0.#endi
9650: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78  f../*.** The max
9660: 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20  imum legal page 
9670: 6e 75 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20  number is (2^31 
9680: 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  - 1)..*/.#define
9690: 20 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20   PAGER_MAX_PGNO 
96a0: 32 31 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a  2147483647../*.*
96b0: 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 74  * The argument t
96c0: 6f 20 74 68 69 73 20 6d 61 63 72 6f 20 69 73 20  o this macro is 
96d0: 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
96e0: 72 20 28 74 79 70 65 20 73 71 6c 69 74 65 33 5f  r (type sqlite3_
96f0: 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52 65 74 75 72  file*)..** Retur
9700: 6e 20 30 20 69 66 20 69 74 20 69 73 20 6e 6f 74  n 0 if it is not
9710: 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65   open, or non-ze
9720: 72 6f 20 28 62 75 74 20 6e 6f 74 20 31 29 20 69  ro (but not 1) i
9730: 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54  f it is..**.** T
9740: 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 20 65  his is so that e
9750: 78 70 72 65 73 73 69 6f 6e 73 20 63 61 6e 20 62  xpressions can b
9760: 65 20 77 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a  e written as:.**
9770: 0a 2a 2a 20 20 20 69 66 28 20 69 73 4f 70 65 6e  .**   if( isOpen
9780: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
9790: 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65   ....**.** inste
97a0: 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66  ad of.**.**   if
97b0: 28 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70  ( pPager->jfd->p
97c0: 4d 65 74 68 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a  Methods ){ ....*
97d0: 2f 0a 23 64 65 66 69 6e 65 20 69 73 4f 70 65 6e  /.#define isOpen
97e0: 28 70 46 64 29 20 28 28 70 46 64 29 2d 3e 70 4d  (pFd) ((pFd)->pM
97f0: 65 74 68 6f 64 73 21 3d 30 29 0a 0a 2f 2a 0a 2a  ethods!=0)../*.*
9800: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
9810: 20 74 68 69 73 20 70 61 67 65 72 20 75 73 65 73   this pager uses
9820: 20 61 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c   a write-ahead l
9830: 6f 67 20 74 6f 20 72 65 61 64 20 70 61 67 65 20  og to read page 
9840: 70 67 6e 6f 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  pgno..** Return 
9850: 66 61 6c 73 65 20 69 66 20 74 68 65 20 70 61 67  false if the pag
9860: 65 72 20 72 65 61 64 73 20 70 67 6e 6f 20 64 69  er reads pgno di
9870: 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20  rectly from the 
9880: 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 23 69 66  database..*/.#if
9890: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
98a0: 5f 4f 4d 49 54 5f 57 41 4c 29 20 26 26 20 64 65  _OMIT_WAL) && de
98b0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 49 52  fined(SQLITE_DIR
98c0: 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41  ECT_OVERFLOW_REA
98d0: 44 29 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  D).int sqlite3Pa
98e0: 67 65 72 55 73 65 57 61 6c 28 50 61 67 65 72 20  gerUseWal(Pager 
98f0: 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
9900: 6e 6f 29 7b 0a 20 20 75 33 32 20 69 52 65 61 64  no){.  u32 iRead
9910: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
9920: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 57    if( pPager->pW
9930: 61 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  al==0 ) return 0
9940: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
9950: 57 61 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61  WalFindFrame(pPa
9960: 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c  ger->pWal, pgno,
9970: 20 26 69 52 65 61 64 29 3b 0a 20 20 72 65 74 75   &iRead);.  retu
9980: 72 6e 20 72 63 20 7c 7c 20 69 52 65 61 64 3b 0a  rn rc || iRead;.
9990: 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  }.#endif.#ifndef
99a0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
99b0: 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 55  .# define pagerU
99c0: 73 65 57 61 6c 28 78 29 20 28 28 78 29 2d 3e 70  seWal(x) ((x)->p
99d0: 57 61 6c 21 3d 30 29 0a 23 65 6c 73 65 0a 23 20  Wal!=0).#else.# 
99e0: 64 65 66 69 6e 65 20 70 61 67 65 72 55 73 65 57  define pagerUseW
99f0: 61 6c 28 78 29 20 30 0a 23 20 64 65 66 69 6e 65  al(x) 0.# define
9a00: 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61   pagerRollbackWa
9a10: 6c 28 78 29 20 30 0a 23 20 64 65 66 69 6e 65 20  l(x) 0.# define 
9a20: 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28 76  pagerWalFrames(v
9a30: 2c 77 2c 78 2c 79 29 20 30 0a 23 20 64 65 66 69  ,w,x,y) 0.# defi
9a40: 6e 65 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49  ne pagerOpenWalI
9a50: 66 50 72 65 73 65 6e 74 28 7a 29 20 53 51 4c 49  fPresent(z) SQLI
9a60: 54 45 5f 4f 4b 0a 23 20 64 65 66 69 6e 65 20 70  TE_OK.# define p
9a70: 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61  agerBeginReadTra
9a80: 6e 73 61 63 74 69 6f 6e 28 7a 29 20 53 51 4c 49  nsaction(z) SQLI
9a90: 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 23 69  TE_OK.#endif..#i
9aa0: 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45 52 56  fdef SQLITE_SERV
9ab0: 45 52 5f 45 44 49 54 49 4f 4e 0a 23 20 64 65 66  ER_EDITION.# def
9ac0: 69 6e 65 20 70 61 67 65 72 49 73 53 65 72 76 65  ine pagerIsServe
9ad0: 72 28 78 29 20 28 28 78 29 2d 3e 70 53 65 72 76  r(x) ((x)->pServ
9ae0: 65 72 21 3d 30 29 0a 23 20 64 65 66 69 6e 65 20  er!=0).# define 
9af0: 70 61 67 65 72 49 73 50 72 6f 63 65 73 73 53 65  pagerIsProcessSe
9b00: 72 76 65 72 28 78 29 20 73 71 6c 69 74 65 33 53  rver(x) sqlite3S
9b10: 65 72 76 65 72 49 73 53 69 6e 67 6c 65 50 72 6f  erverIsSinglePro
9b20: 63 65 73 73 28 28 78 29 2d 3e 70 53 65 72 76 65  cess((x)->pServe
9b30: 72 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  r).#else.# defin
9b40: 65 20 70 61 67 65 72 49 73 53 65 72 76 65 72 28  e pagerIsServer(
9b50: 78 29 20 30 0a 23 65 6e 64 69 66 0a 0a 23 69 66  x) 0.#endif..#if
9b60: 6e 64 65 66 20 4e 44 45 42 55 47 20 0a 2f 2a 0a  ndef NDEBUG ./*.
9b70: 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20  ** Usage:.**.** 
9b80: 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
9b90: 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
9ba0: 67 65 72 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 54 68  ger) );.**.** Th
9bb0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 75 6e 73  is function runs
9bc0: 20 6d 61 6e 79 20 61 73 73 65 72 74 73 20 74 6f   many asserts to
9bd0: 20 74 72 79 20 74 6f 20 66 69 6e 64 20 69 6e 63   try to find inc
9be0: 6f 6e 73 69 73 74 65 6e 63 69 65 73 20 69 6e 0a  onsistencies in.
9bf0: 2a 2a 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  ** the internal 
9c00: 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 61 67  state of the Pag
9c10: 65 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  er object..*/.st
9c20: 61 74 69 63 20 69 6e 74 20 61 73 73 65 72 74 5f  atic int assert_
9c30: 70 61 67 65 72 5f 73 74 61 74 65 28 50 61 67 65  pager_state(Page
9c40: 72 20 2a 70 29 7b 0a 20 20 50 61 67 65 72 20 2a  r *p){.  Pager *
9c50: 70 50 61 67 65 72 20 3d 20 70 3b 0a 0a 20 20 2f  pPager = p;..  /
9c60: 2a 20 53 74 61 74 65 20 6d 75 73 74 20 62 65 20  * State must be 
9c70: 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 61 73 73 65  valid. */.  asse
9c80: 72 74 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50  rt( p->eState==P
9c90: 41 47 45 52 5f 4f 50 45 4e 0a 20 20 20 20 20 20  AGER_OPEN.      
9ca0: 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50   || p->eState==P
9cb0: 41 47 45 52 5f 52 45 41 44 45 52 0a 20 20 20 20  AGER_READER.    
9cc0: 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d     || p->eState=
9cd0: 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
9ce0: 43 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70  CKED.       || p
9cf0: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
9d00: 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a  WRITER_CACHEMOD.
9d10: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74         || p->eSt
9d20: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
9d30: 52 5f 44 42 4d 4f 44 0a 20 20 20 20 20 20 20 7c  R_DBMOD.       |
9d40: 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  | p->eState==PAG
9d50: 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48  ER_WRITER_FINISH
9d60: 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e  ED.       || p->
9d70: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52  eState==PAGER_ER
9d80: 52 4f 52 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 52  ROR.  );..  /* R
9d90: 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65  egardless of the
9da0: 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 2c 20   current state, 
9db0: 61 20 74 65 6d 70 2d 66 69 6c 65 20 63 6f 6e 6e  a temp-file conn
9dc0: 65 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 62 65  ection always be
9dd0: 68 61 76 65 73 0a 20 20 2a 2a 20 61 73 20 69 66  haves.  ** as if
9de0: 20 69 74 20 68 61 73 20 61 6e 20 65 78 63 6c 75   it has an exclu
9df0: 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  sive lock on the
9e00: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
9e10: 49 74 20 6e 65 76 65 72 20 75 70 64 61 74 65 73  It never updates
9e20: 0a 20 20 2a 2a 20 74 68 65 20 63 68 61 6e 67 65  .  ** the change
9e30: 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 2c 20  -counter field, 
9e40: 73 6f 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75  so the changeCou
9e50: 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73 20 61  ntDone flag is a
9e60: 6c 77 61 79 73 20 73 65 74 2e 0a 20 20 2a 2f 0a  lways set..  */.
9e70: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74 65 6d    assert( p->tem
9e80: 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 2d 3e 65  pFile==0 || p->e
9e90: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
9ea0: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
9eb0: 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30  ( p->tempFile==0
9ec0: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 63 68 61 6e   || pPager->chan
9ed0: 67 65 43 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a  geCountDone );..
9ee0: 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65 4a    /* If the useJ
9ef0: 6f 75 72 6e 61 6c 20 66 6c 61 67 20 69 73 20 63  ournal flag is c
9f00: 6c 65 61 72 2c 20 74 68 65 20 6a 6f 75 72 6e 61  lear, the journa
9f10: 6c 2d 6d 6f 64 65 20 6d 75 73 74 20 62 65 20 22  l-mode must be "
9f20: 4f 46 46 22 2e 20 0a 20 20 2a 2a 20 41 6e 64 20  OFF". .  ** And 
9f30: 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d  if the journal-m
9f40: 6f 64 65 20 69 73 20 22 4f 46 46 22 2c 20 74 68  ode is "OFF", th
9f50: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
9f60: 75 73 74 20 6e 6f 74 20 62 65 20 6f 70 65 6e 2e  ust not be open.
9f70: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
9f80: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
9f90: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
9fa0: 45 5f 4f 46 46 20 7c 7c 20 70 2d 3e 75 73 65 4a  E_OFF || p->useJ
9fb0: 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65  ournal );.  asse
9fc0: 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  rt( p->journalMo
9fd0: 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
9fe0: 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 21 69 73  LMODE_OFF || !is
9ff0: 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 29 3b 0a  Open(p->jfd) );.
a000: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
a010: 20 4d 45 4d 44 42 20 69 6d 70 6c 69 65 73 20 6e   MEMDB implies n
a020: 6f 53 79 6e 63 2e 20 41 6e 64 20 61 6e 20 69 6e  oSync. And an in
a030: 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e  -memory journal.
a040: 20 53 69 6e 63 65 20 0a 20 20 2a 2a 20 74 68 69   Since .  ** thi
a050: 73 20 6d 65 61 6e 73 20 61 6e 20 69 6e 2d 6d 65  s means an in-me
a060: 6d 6f 72 79 20 70 61 67 65 72 20 70 65 72 66 6f  mory pager perfo
a070: 72 6d 73 20 6e 6f 20 49 4f 20 61 74 20 61 6c 6c  rms no IO at all
a080: 2c 20 69 74 20 63 61 6e 6e 6f 74 20 65 6e 63 6f  , it cannot enco
a090: 75 6e 74 65 72 20 0a 20 20 2a 2a 20 65 69 74 68  unter .  ** eith
a0a0: 65 72 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  er SQLITE_IOERR 
a0b0: 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64  or SQLITE_FULL d
a0c0: 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 6f  uring rollback o
a0d0: 72 20 77 68 69 6c 65 20 66 69 6e 61 6c 69 7a 69  r while finalizi
a0e0: 6e 67 20 0a 20 20 2a 2a 20 61 20 6a 6f 75 72 6e  ng .  ** a journ
a0f0: 61 6c 20 66 69 6c 65 2e 20 28 61 6c 74 68 6f 75  al file. (althou
a100: 67 68 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  gh the in-memory
a110: 20 6a 6f 75 72 6e 61 6c 20 69 6d 70 6c 65 6d 65   journal impleme
a120: 6e 74 61 74 69 6f 6e 20 6d 61 79 20 0a 20 20 2a  ntation may .  *
a130: 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * return SQLITE_
a140: 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 77 68 69 6c  IOERR_NOMEM whil
a150: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
a160: 6c 65 20 69 73 20 62 65 69 6e 67 20 77 72 69 74  le is being writ
a170: 74 65 6e 29 2e 20 49 74 20 0a 20 20 2a 2a 20 69  ten). It .  ** i
a180: 73 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 74 20  s therefore not 
a190: 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 6e 20  possible for an 
a1a0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20  in-memory pager 
a1b0: 74 6f 20 65 6e 74 65 72 20 74 68 65 20 45 52 52  to enter the ERR
a1c0: 4f 52 20 0a 20 20 2a 2a 20 73 74 61 74 65 2e 0a  OR .  ** state..
a1d0: 20 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42    */.  if( MEMDB
a1e0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
a1f0: 21 69 73 4f 70 65 6e 28 70 2d 3e 66 64 29 20 29  !isOpen(p->fd) )
a200: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
a210: 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 20 20 61  >noSync );.    a
a220: 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61  ssert( p->journa
a230: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a240: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
a250: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75         || p->jou
a260: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
a270: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
a280: 52 59 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 61  RY .    );.    a
a290: 73 73 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65  ssert( p->eState
a2a0: 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26  !=PAGER_ERROR &&
a2b0: 20 70 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45   p->eState!=PAGE
a2c0: 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20 61 73  R_OPEN );.    as
a2d0: 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
a2e0: 6c 28 70 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a  l(p)==0 );.  }..
a2f0: 20 20 2f 2a 20 49 66 20 63 68 61 6e 67 65 43 6f    /* If changeCo
a300: 75 6e 74 44 6f 6e 65 20 69 73 20 73 65 74 2c 20  untDone is set, 
a310: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
a320: 6f 72 20 67 72 65 61 74 65 72 20 6d 75 73 74 20  or greater must 
a330: 62 65 20 68 65 6c 64 0a 20 20 2a 2a 20 6f 6e 20  be held.  ** on 
a340: 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  the file..  */. 
a350: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a360: 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
a370: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ==0 || pPager->e
a380: 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c  Lock>=RESERVED_L
a390: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
a3a0: 20 70 2d 3e 65 4c 6f 63 6b 21 3d 50 45 4e 44 49   p->eLock!=PENDI
a3b0: 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 73 77  NG_LOCK );..  sw
a3c0: 69 74 63 68 28 20 70 2d 3e 65 53 74 61 74 65 20  itch( p->eState 
a3d0: 29 7b 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  ){.    case PAGE
a3e0: 52 5f 4f 50 45 4e 3a 0a 20 20 20 20 20 20 61 73  R_OPEN:.      as
a3f0: 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
a400: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a410: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
a420: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
a430: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
a440: 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
a450: 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
a460: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  ==0 || pPager->t
a470: 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20  empFile );.     
a480: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
a490: 65 20 50 41 47 45 52 5f 52 45 41 44 45 52 3a 0a  e PAGER_READER:.
a4a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a4b0: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
a4c0: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
a4d0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
a4e0: 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck!=UNKNOWN_LOCK
a4f0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a500: 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52  ( p->eLock>=SHAR
a510: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  ED_LOCK );.     
a520: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
a530: 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  e PAGER_WRITER_L
a540: 4f 43 4b 45 44 3a 0a 20 20 20 20 20 20 61 73 73  OCKED:.      ass
a550: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55  ert( p->eLock!=U
a560: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20  NKNOWN_LOCK );. 
a570: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a580: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a590: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a5a0: 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61   if( !pagerUseWa
a5b0: 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
a5c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
a5d0: 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f  eLock>=RESERVED_
a5e0: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a  LOCK );.      }.
a5f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a600: 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50  ager->dbSize==pP
a610: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
a620: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a630: 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  ( pPager->dbOrig
a640: 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62  Size==pPager->db
a650: 46 69 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  FileSize );.    
a660: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a670: 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50  ->dbOrigSize==pP
a680: 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
a690: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a6a0: 28 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73  ( pPager->setMas
a6b0: 74 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ter==0 );.      
a6c0: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
a6d0: 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41   PAGER_WRITER_CA
a6e0: 43 48 45 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73  CHEMOD:.      as
a6f0: 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d  sert( p->eLock!=
a700: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a  UNKNOWN_LOCK );.
a710: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a720: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
a730: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
a740: 20 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57    if( !pagerUseW
a750: 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
a760: 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 70        /* It is p
a770: 6f 73 73 69 62 6c 65 20 74 68 61 74 20 69 66 20  ossible that if 
a780: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c  journal_mode=wal
a790: 20 68 65 72 65 20 74 68 61 74 20 6e 65 69 74 68   here that neith
a7a0: 65 72 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  er the.        *
a7b0: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  * journal file n
a7c0: 6f 72 20 74 68 65 20 57 41 4c 20 66 69 6c 65 20  or the WAL file 
a7d0: 61 72 65 20 6f 70 65 6e 2e 20 54 68 69 73 20 68  are open. This h
a7e0: 61 70 70 65 6e 73 20 64 75 72 69 6e 67 0a 20 20  appens during.  
a7f0: 20 20 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62        ** a rollb
a800: 61 63 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ack transaction 
a810: 74 68 61 74 20 73 77 69 74 63 68 65 73 20 66 72  that switches fr
a820: 6f 6d 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  om journal_mode=
a830: 6f 66 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  off.        ** t
a840: 6f 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77  o journal_mode=w
a850: 61 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  al..        */. 
a860: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
a870: 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45  ->eLock>=RESERVE
a880: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  D_LOCK );.      
a890: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
a8a0: 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20  (p->jfd) .      
a8b0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75         || p->jou
a8c0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
a8d0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
a8e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
a8f0: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
a900: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
a910: 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 20 20  DE_WAL .        
a920: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
a930: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a940: 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61  >dbOrigSize==pPa
a950: 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
a960: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a970: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
a980: 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48  ize==pPager->dbH
a990: 69 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  intSize );.     
a9a0: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
a9b0: 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  e PAGER_WRITER_D
a9c0: 42 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65  BMOD:.      asse
a9d0: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58  rt( p->eLock==EX
a9e0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
a9f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
aa00: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
aa10: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
aa20: 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
aa30: 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
aa40: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
aa50: 70 2d 3e 65 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53  p->eLock>=EXCLUS
aa60: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  IVE_LOCK );.    
aa70: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
aa80: 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20  (p->jfd) .      
aa90: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
aaa0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
aab0: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20  URNALMODE_OFF . 
aac0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e            || p->
aad0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
aae0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
aaf0: 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  AL .           |
ab00: 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69  | (sqlite3OsDevi
ab10: 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
ab20: 73 28 70 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f  s(p->fd)&SQLITE_
ab30: 49 4f 43 41 50 5f 42 41 54 43 48 5f 41 54 4f 4d  IOCAP_BATCH_ATOM
ab40: 49 43 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  IC).      );.   
ab50: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
ab60: 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3c 3d 70  r->dbOrigSize<=p
ab70: 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a  Pager->dbHintSiz
ab80: 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  e );.      break
ab90: 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  ;..    case PAGE
aba0: 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45  R_WRITER_FINISHE
abb0: 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  D:.      assert(
abc0: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55   p->eLock==EXCLU
abd0: 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  SIVE_LOCK );.   
abe0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
abf0: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
ac00: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61  TE_OK );.      a
ac10: 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
ac20: 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20  Wal(pPager) );. 
ac30: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f       assert( isO
ac40: 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20  pen(p->jfd) .   
ac50: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f          || p->jo
ac60: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
ac70: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
ac80: 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
ac90: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
aca0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
acb0: 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 20 20 20  E_WAL .         
acc0: 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44    || (sqlite3OsD
acd0: 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
ace0: 74 69 63 73 28 70 2d 3e 66 64 29 26 53 51 4c 49  tics(p->fd)&SQLI
acf0: 54 45 5f 49 4f 43 41 50 5f 42 41 54 43 48 5f 41  TE_IOCAP_BATCH_A
ad00: 54 4f 4d 49 43 29 0a 20 20 20 20 20 20 29 3b 0a  TOMIC).      );.
ad10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
ad20: 20 20 63 61 73 65 20 50 41 47 45 52 5f 45 52 52    case PAGER_ERR
ad30: 4f 52 3a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  OR:.      /* The
ad40: 72 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65  re must be at le
ad50: 61 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64  ast one outstand
ad60: 69 6e 67 20 72 65 66 65 72 65 6e 63 65 20 74 6f  ing reference to
ad70: 20 74 68 65 20 70 61 67 65 72 20 69 66 0a 20 20   the pager if.  
ad80: 20 20 20 20 2a 2a 20 69 6e 20 45 52 52 4f 52 20      ** in ERROR 
ad90: 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65  state. Otherwise
ada0: 20 74 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c   the pager shoul
adb0: 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64  d have already d
adc0: 72 6f 70 70 65 64 0a 20 20 20 20 20 20 2a 2a 20  ropped.      ** 
add0: 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61  back to OPEN sta
ade0: 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  te..      */.   
adf0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
ae00: 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  r->errCode!=SQLI
ae10: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61  TE_OK );.      a
ae20: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63  ssert( sqlite3Pc
ae30: 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
ae40: 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20  ger->pPCache)>0 
ae50: 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
ae60: 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ile );.      bre
ae70: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ak;.  }..  retur
ae80: 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 1;.}.#endif /*
ae90: 20 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 2a   ifndef NDEBUG *
aea0: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
aeb0: 5f 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 52 65  _DEBUG ./*.** Re
aec0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
aed0: 6f 20 61 20 68 75 6d 61 6e 20 72 65 61 64 61 62  o a human readab
aee0: 6c 65 20 73 74 72 69 6e 67 20 69 6e 20 61 20 73  le string in a s
aef0: 74 61 74 69 63 20 62 75 66 66 65 72 0a 2a 2a 20  tatic buffer.** 
af00: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73  containing the s
af10: 74 61 74 65 20 6f 66 20 74 68 65 20 50 61 67 65  tate of the Page
af20: 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  r object passed 
af30: 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20  as an argument. 
af40: 54 68 69 73 0a 2a 2a 20 69 73 20 69 6e 74 65 6e  This.** is inten
af50: 64 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 77  ded to be used w
af60: 69 74 68 69 6e 20 64 65 62 75 67 67 65 72 73 2e  ithin debuggers.
af70: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73   For example, as
af80: 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 0a   an alternative.
af90: 2a 2a 20 74 6f 20 22 70 72 69 6e 74 20 2a 70 50  ** to "print *pP
afa0: 61 67 65 72 22 20 69 6e 20 67 64 62 3a 0a 2a 2a  ager" in gdb:.**
afb0: 0a 2a 2a 20 28 67 64 62 29 20 70 72 69 6e 74 66  .** (gdb) printf
afc0: 20 22 25 73 22 2c 20 70 72 69 6e 74 5f 70 61 67   "%s", print_pag
afd0: 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
afe0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
aff0: 2a 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74 61  *print_pager_sta
b000: 74 65 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20  te(Pager *p){.  
b010: 73 74 61 74 69 63 20 63 68 61 72 20 7a 52 65 74  static char zRet
b020: 5b 31 30 32 34 5d 3b 0a 0a 20 20 73 71 6c 69 74  [1024];..  sqlit
b030: 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 32 34  e3_snprintf(1024
b040: 2c 20 7a 52 65 74 2c 0a 20 20 20 20 20 20 22 46  , zRet,.      "F
b050: 69 6c 65 6e 61 6d 65 3a 20 20 20 20 20 20 25 73  ilename:      %s
b060: 5c 6e 22 0a 20 20 20 20 20 20 22 53 74 61 74 65  \n".      "State
b070: 3a 20 20 20 20 20 20 20 20 20 25 73 20 65 72 72  :         %s err
b080: 43 6f 64 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20  Code=%d\n".     
b090: 20 22 4c 6f 63 6b 3a 20 20 20 20 20 20 20 20 20   "Lock:         
b0a0: 20 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f   %s\n".      "Lo
b0b0: 63 6b 69 6e 67 20 6d 6f 64 65 3a 20 20 6c 6f 63  cking mode:  loc
b0c0: 6b 69 6e 67 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a  king_mode=%s\n".
b0d0: 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 20 6d        "Journal m
b0e0: 6f 64 65 3a 20 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  ode:  journal_mo
b0f0: 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22  de=%s\n".      "
b100: 42 61 63 6b 69 6e 67 20 73 74 6f 72 65 3a 20 74  Backing store: t
b110: 65 6d 70 46 69 6c 65 3d 25 64 20 6d 65 6d 44 62  empFile=%d memDb
b120: 3d 25 64 20 75 73 65 4a 6f 75 72 6e 61 6c 3d 25  =%d useJournal=%
b130: 64 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f 75 72  d\n".      "Jour
b140: 6e 61 6c 3a 20 20 20 20 20 20 20 6a 6f 75 72 6e  nal:       journ
b150: 61 6c 4f 66 66 3d 25 6c 6c 64 20 6a 6f 75 72 6e  alOff=%lld journ
b160: 61 6c 48 64 72 3d 25 6c 6c 64 5c 6e 22 0a 20 20  alHdr=%lld\n".  
b170: 20 20 20 20 22 53 69 7a 65 3a 20 20 20 20 20 20      "Size:      
b180: 20 20 20 20 64 62 73 69 7a 65 3d 25 64 20 64 62      dbsize=%d db
b190: 4f 72 69 67 53 69 7a 65 3d 25 64 20 64 62 46 69  OrigSize=%d dbFi
b1a0: 6c 65 53 69 7a 65 3d 25 64 5c 6e 22 0a 20 20 20  leSize=%d\n".   
b1b0: 20 20 20 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d     , p->zFilenam
b1c0: 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 53 74  e.      , p->eSt
b1d0: 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
b1e0: 20 20 20 20 20 20 20 20 20 20 20 3f 20 22 4f 50             ? "OP
b1f0: 45 4e 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  EN" :.        p-
b200: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
b210: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 3f  EADER          ?
b220: 20 22 52 45 41 44 45 52 22 20 3a 0a 20 20 20 20   "READER" :.    
b230: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50      p->eState==P
b240: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
b250: 45 44 20 20 20 3f 20 22 57 52 49 54 45 52 5f 4c  ED   ? "WRITER_L
b260: 4f 43 4b 45 44 22 20 3a 0a 20 20 20 20 20 20 20  OCKED" :.       
b270: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
b280: 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
b290: 44 20 3f 20 22 57 52 49 54 45 52 5f 43 41 43 48  D ? "WRITER_CACH
b2a0: 45 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20 20 20  EMOD" :.        
b2b0: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
b2c0: 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20  _WRITER_DBMOD   
b2d0: 20 3f 20 22 57 52 49 54 45 52 5f 44 42 4d 4f 44   ? "WRITER_DBMOD
b2e0: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
b2f0: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
b300: 54 45 52 5f 46 49 4e 49 53 48 45 44 20 3f 20 22  TER_FINISHED ? "
b310: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 22  WRITER_FINISHED"
b320: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
b330: 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f  tate==PAGER_ERRO
b340: 52 20 20 20 20 20 20 20 20 20 20 20 3f 20 22 45  R           ? "E
b350: 52 52 4f 52 22 20 3a 20 22 3f 65 72 72 6f 72 3f  RROR" : "?error?
b360: 22 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70  ".      , (int)p
b370: 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20  ->errCode.      
b380: 2c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c  , p->eLock==NO_L
b390: 4f 43 4b 20 20 20 20 20 20 20 20 20 3f 20 22 4e  OCK         ? "N
b3a0: 4f 5f 4c 4f 43 4b 22 20 3a 0a 20 20 20 20 20 20  O_LOCK" :.      
b3b0: 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45    p->eLock==RESE
b3c0: 52 56 45 44 5f 4c 4f 43 4b 20 20 20 3f 20 22 52  RVED_LOCK   ? "R
b3d0: 45 53 45 52 56 45 44 22 20 3a 0a 20 20 20 20 20  ESERVED" :.     
b3e0: 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43     p->eLock==EXC
b3f0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 3f 20 22  LUSIVE_LOCK  ? "
b400: 45 58 43 4c 55 53 49 56 45 22 20 3a 0a 20 20 20  EXCLUSIVE" :.   
b410: 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 53       p->eLock==S
b420: 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 3f  HARED_LOCK     ?
b430: 20 22 53 48 41 52 45 44 22 20 3a 0a 20 20 20 20   "SHARED" :.    
b440: 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e      p->eLock==UN
b450: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 3f 20  KNOWN_LOCK    ? 
b460: 22 55 4e 4b 4e 4f 57 4e 22 20 3a 20 22 3f 65 72  "UNKNOWN" : "?er
b470: 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 70 2d  ror?".      , p-
b480: 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3f  >exclusiveMode ?
b490: 20 22 65 78 63 6c 75 73 69 76 65 22 20 3a 20 22   "exclusive" : "
b4a0: 6e 6f 72 6d 61 6c 22 0a 20 20 20 20 20 20 2c 20  normal".      , 
b4b0: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
b4c0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
b4d0: 45 5f 4d 45 4d 4f 52 59 20 20 20 3f 20 22 6d 65  E_MEMORY   ? "me
b4e0: 6d 6f 72 79 22 20 3a 0a 20 20 20 20 20 20 20 20  mory" :.        
b4f0: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
b500: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
b510: 45 5f 4f 46 46 20 20 20 20 20 20 3f 20 22 6f 66  E_OFF      ? "of
b520: 66 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  f" :.        p->
b530: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
b540: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
b550: 45 4c 45 54 45 20 20 20 3f 20 22 64 65 6c 65 74  ELETE   ? "delet
b560: 65 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  e" :.        p->
b570: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
b580: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
b590: 45 52 53 49 53 54 20 20 3f 20 22 70 65 72 73 69  ERSIST  ? "persi
b5a0: 73 74 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  st" :.        p-
b5b0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
b5c0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
b5d0: 54 52 55 4e 43 41 54 45 20 3f 20 22 74 72 75 6e  TRUNCATE ? "trun
b5e0: 63 61 74 65 22 20 3a 0a 20 20 20 20 20 20 20 20  cate" :.        
b5f0: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
b600: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
b610: 45 5f 57 41 4c 20 20 20 20 20 20 3f 20 22 77 61  E_WAL      ? "wa
b620: 6c 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20  l" : "?error?". 
b630: 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 74       , (int)p->t
b640: 65 6d 70 46 69 6c 65 2c 20 28 69 6e 74 29 70 2d  empFile, (int)p-
b650: 3e 6d 65 6d 44 62 2c 20 28 69 6e 74 29 70 2d 3e  >memDb, (int)p->
b660: 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  useJournal.     
b670: 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66   , p->journalOff
b680: 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a  , p->journalHdr.
b690: 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e        , (int)p->
b6a0: 64 62 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e  dbSize, (int)p->
b6b0: 64 62 4f 72 69 67 53 69 7a 65 2c 20 28 69 6e 74  dbOrigSize, (int
b6c0: 29 70 2d 3e 64 62 46 69 6c 65 53 69 7a 65 0a 20  )p->dbFileSize. 
b6d0: 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 7a 52   );..  return zR
b6e0: 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  et;.}.#endif../*
b6f0: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
b700: 63 65 73 20 74 6f 20 74 68 65 20 76 61 72 69 6f  ces to the vario
b710: 75 73 20 70 61 67 65 20 67 65 74 74 65 72 73 20  us page getters 
b720: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
b730: 74 50 61 67 65 4e 6f 72 6d 61 6c 28 50 61 67 65  tPageNormal(Page
b740: 72 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65 2a 2a  r*,Pgno,DbPage**
b750: 2c 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e  ,int);.static in
b760: 74 20 67 65 74 50 61 67 65 45 72 72 6f 72 28 50  t getPageError(P
b770: 61 67 65 72 2a 2c 50 67 6e 6f 2c 44 62 50 61 67  ager*,Pgno,DbPag
b780: 65 2a 2a 2c 69 6e 74 29 3b 0a 23 69 66 20 53 51  e**,int);.#if SQ
b790: 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
b7a0: 5a 45 3e 30 0a 73 74 61 74 69 63 20 69 6e 74 20  ZE>0.static int 
b7b0: 67 65 74 50 61 67 65 4d 4d 61 70 28 50 61 67 65  getPageMMap(Page
b7c0: 72 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65 2a 2a  r*,Pgno,DbPage**
b7d0: 2c 69 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f  ,int);.#endif../
b7e0: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 50 61 67  *.** Set the Pag
b7f0: 65 72 2e 78 47 65 74 20 6d 65 74 68 6f 64 20 66  er.xGet method f
b800: 6f 72 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  or the appropria
b810: 74 65 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20  te routine used 
b820: 74 6f 20 66 65 74 63 68 0a 2a 2a 20 63 6f 6e 74  to fetch.** cont
b830: 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ent from the pag
b840: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
b850: 69 64 20 73 65 74 47 65 74 74 65 72 4d 65 74 68  id setGetterMeth
b860: 6f 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  od(Pager *pPager
b870: 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
b880: 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
b890: 70 50 61 67 65 72 2d 3e 78 47 65 74 20 3d 20 67  pPager->xGet = g
b8a0: 65 74 50 61 67 65 45 72 72 6f 72 3b 0a 23 69 66  etPageError;.#if
b8b0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
b8c0: 5f 53 49 5a 45 3e 30 0a 20 20 7d 65 6c 73 65 20  _SIZE>0.  }else 
b8d0: 69 66 28 20 55 53 45 46 45 54 43 48 28 70 50 61  if( USEFETCH(pPa
b8e0: 67 65 72 29 0a 23 69 66 64 65 66 20 53 51 4c 49  ger).#ifdef SQLI
b8f0: 54 45 5f 53 45 52 56 45 52 5f 45 44 49 54 49 4f  TE_SERVER_EDITIO
b900: 4e 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 53  N.   && sqlite3S
b910: 65 72 76 65 72 49 73 52 65 61 64 6f 6e 6c 79 28  erverIsReadonly(
b920: 70 50 61 67 65 72 2d 3e 70 53 65 72 76 65 72 29  pPager->pServer)
b930: 3d 3d 30 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  ==0.#endif.#ifde
b940: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
b950: 45 43 0a 20 20 20 26 26 20 70 50 61 67 65 72 2d  EC.   && pPager-
b960: 3e 78 43 6f 64 65 63 3d 3d 30 0a 23 65 6e 64 69  >xCodec==0.#endi
b970: 66 0a 20 20 29 7b 0a 20 20 20 20 70 50 61 67 65  f.  ){.    pPage
b980: 72 2d 3e 78 47 65 74 20 3d 20 67 65 74 50 61 67  r->xGet = getPag
b990: 65 4d 4d 61 70 3b 0a 23 65 6e 64 69 66 20 2f 2a  eMMap;.#endif /*
b9a0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
b9b0: 5f 53 49 5a 45 3e 30 20 2a 2f 0a 20 20 7d 65 6c  _SIZE>0 */.  }el
b9c0: 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
b9d0: 78 47 65 74 20 3d 20 67 65 74 50 61 67 65 4e 6f  xGet = getPageNo
b9e0: 72 6d 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  rmal;.  }.}../*.
b9f0: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
ba00: 66 20 69 74 20 69 73 20 6e 65 63 65 73 73 61 72  f it is necessar
ba10: 79 20 74 6f 20 77 72 69 74 65 20 70 61 67 65 20  y to write page 
ba20: 2a 70 50 67 20 69 6e 74 6f 20 74 68 65 20 73 75  *pPg into the su
ba30: 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20  b-journal..** A 
ba40: 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65  page needs to be
ba50: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
ba60: 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66  e sub-journal if
ba70: 20 74 68 65 72 65 20 65 78 69 73 74 73 20 6f 6e   there exists on
ba80: 65 0a 2a 2a 20 6f 72 20 6d 6f 72 65 20 6f 70 65  e.** or more ope
ba90: 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 66 6f 72  n savepoints for
baa0: 20 77 68 69 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20   which:.**.**   
bab0: 2a 20 54 68 65 20 70 61 67 65 2d 6e 75 6d 62 65  * The page-numbe
bac0: 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f  r is less than o
bad0: 72 20 65 71 75 61 6c 20 74 6f 20 50 61 67 65 72  r equal to Pager
bae0: 53 61 76 65 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c  Savepoint.nOrig,
baf0: 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20   and.**   * The 
bb00: 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  bit correspondin
bb10: 67 20 74 6f 20 74 68 65 20 70 61 67 65 2d 6e 75  g to the page-nu
bb20: 6d 62 65 72 20 69 73 20 6e 6f 74 20 73 65 74 20  mber is not set 
bb30: 69 6e 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53  in.**     PagerS
bb40: 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65  avepoint.pInSave
bb50: 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  point..*/.static
bb60: 20 69 6e 74 20 73 75 62 6a 52 65 71 75 69 72 65   int subjRequire
bb70: 73 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  sPage(PgHdr *pPg
bb80: 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
bb90: 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
bba0: 3b 0a 20 20 50 61 67 65 72 53 61 76 65 70 6f 69  ;.  PagerSavepoi
bbb0: 6e 74 20 2a 70 3b 0a 20 20 50 67 6e 6f 20 70 67  nt *p;.  Pgno pg
bbc0: 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  no = pPg->pgno;.
bbd0: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
bbe0: 3d 30 3b 20 69 3c 70 50 61 67 65 72 2d 3e 6e 53  =0; i<pPager->nS
bbf0: 61 76 65 70 6f 69 6e 74 3b 20 69 2b 2b 29 7b 0a  avepoint; i++){.
bc00: 20 20 20 20 70 20 3d 20 26 70 50 61 67 65 72 2d      p = &pPager-
bc10: 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 5d 3b 0a  >aSavepoint[i];.
bc20: 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f 72 69 67      if( p->nOrig
bc30: 3e 3d 70 67 6e 6f 20 26 26 20 30 3d 3d 73 71 6c  >=pgno && 0==sql
bc40: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 4e 6f  ite3BitvecTestNo
bc50: 74 4e 75 6c 6c 28 70 2d 3e 70 49 6e 53 61 76 65  tNull(p->pInSave
bc60: 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 20 29 7b 0a  point, pgno) ){.
bc70: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
bc80: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
bc90: 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  rn 0;.}..#ifdef 
bca0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
bcb0: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
bcc0: 66 20 74 68 65 20 70 61 67 65 20 69 73 20 61 6c  f the page is al
bcd0: 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75  ready in the jou
bce0: 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  rnal file..*/.st
bcf0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 49 6e 4a  atic int pageInJ
bd00: 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
bd10: 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70 50 67  ager, PgHdr *pPg
bd20: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
bd30: 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50  te3BitvecTest(pP
bd40: 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
bd50: 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a  , pPg->pgno);.}.
bd60: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
bd70: 61 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  ad a 32-bit inte
bd80: 67 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69 76  ger from the giv
bd90: 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  en file descript
bda0: 6f 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20 69  or.  Store the i
bdb0: 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61 74 20 69  nteger.** that i
bdc0: 73 20 72 65 61 64 20 69 6e 20 2a 70 52 65 73 2e  s read in *pRes.
bdd0: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
bde0: 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
bdf0: 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a   worked, or an.*
be00: 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  * error code is 
be10: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
be20: 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  rong..**.** All 
be30: 76 61 6c 75 65 73 20 61 72 65 20 73 74 6f 72 65  values are store
be40: 64 20 6f 6e 20 64 69 73 6b 20 61 73 20 62 69 67  d on disk as big
be50: 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74  -endian..*/.stat
be60: 69 63 20 69 6e 74 20 72 65 61 64 33 32 62 69 74  ic int read32bit
be70: 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  s(sqlite3_file *
be80: 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20  fd, i64 offset, 
be90: 75 33 32 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e  u32 *pRes){.  un
bea0: 73 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b 34  signed char ac[4
beb0: 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71  ];.  int rc = sq
bec0: 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20  lite3OsRead(fd, 
bed0: 61 63 2c 20 73 69 7a 65 6f 66 28 61 63 29 2c 20  ac, sizeof(ac), 
bee0: 6f 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72  offset);.  if( r
bef0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
bf00: 20 20 20 20 2a 70 52 65 73 20 3d 20 73 71 6c 69      *pRes = sqli
bf10: 74 65 33 47 65 74 34 62 79 74 65 28 61 63 29 3b  te3Get4byte(ac);
bf20: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
bf30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
bf40: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
bf50: 72 20 69 6e 74 6f 20 61 20 73 74 72 69 6e 67 20  r into a string 
bf60: 62 75 66 66 65 72 20 69 6e 20 62 69 67 2d 65 6e  buffer in big-en
bf70: 64 69 61 6e 20 62 79 74 65 20 6f 72 64 65 72 2e  dian byte order.
bf80: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70 75 74 33  .*/.#define put3
bf90: 32 62 69 74 73 28 41 2c 42 29 20 20 73 71 6c 69  2bits(A,B)  sqli
bfa0: 74 65 33 50 75 74 34 62 79 74 65 28 28 75 38 2a  te3Put4byte((u8*
bfb0: 29 41 2c 42 29 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72  )A,B).../*.** Wr
bfc0: 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ite a 32-bit int
bfd0: 65 67 65 72 20 69 6e 74 6f 20 74 68 65 20 67 69  eger into the gi
bfe0: 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  ven file descrip
bff0: 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  tor.  Return SQL
c000: 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63  ITE_OK.** on suc
c010: 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72  cess or an error
c020: 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69   code is somethi
c030: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a  ng goes wrong..*
c040: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69  /.static int wri
c050: 74 65 33 32 62 69 74 73 28 73 71 6c 69 74 65 33  te32bits(sqlite3
c060: 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f  _file *fd, i64 o
c070: 66 66 73 65 74 2c 20 75 33 32 20 76 61 6c 29 7b  ffset, u32 val){
c080: 0a 20 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20  .  char ac[4];. 
c090: 20 70 75 74 33 32 62 69 74 73 28 61 63 2c 20 76   put32bits(ac, v
c0a0: 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  al);.  return sq
c0b0: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 66 64 2c  lite3OsWrite(fd,
c0c0: 20 61 63 2c 20 34 2c 20 6f 66 66 73 65 74 29 3b   ac, 4, offset);
c0d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b  .}../*.** Unlock
c0e0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
c0f0: 6c 65 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63  le to level eLoc
c100: 6b 2c 20 77 68 69 63 68 20 6d 75 73 74 20 62 65  k, which must be
c110: 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 0a   either NO_LOCK.
c120: 2a 2a 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  ** or SHARED_LOC
c130: 4b 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  K. Regardless of
c140: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
c150: 74 68 65 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c  the call to xUnl
c160: 6f 63 6b 28 29 0a 2a 2a 20 73 75 63 63 65 65 64  ock().** succeed
c170: 73 2c 20 73 65 74 20 74 68 65 20 50 61 67 65 72  s, set the Pager
c180: 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20  .eLock variable 
c190: 74 6f 20 6d 61 74 63 68 20 74 68 65 20 28 61 74  to match the (at
c1a0: 74 65 6d 70 74 65 64 29 20 6e 65 77 20 6c 6f 63  tempted) new loc
c1b0: 6b 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c  k..**.** Except,
c1c0: 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20   if Pager.eLock 
c1d0: 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  is set to UNKNOW
c1e0: 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 69 73  N_LOCK when this
c1f0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20   function is.** 
c200: 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d  called, do not m
c210: 6f 64 69 66 79 20 69 74 2e 20 53 65 65 20 74 68  odify it. See th
c220: 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20  e comment above 
c230: 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20 0a  the #define of .
c240: 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  ** UNKNOWN_LOCK 
c250: 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69  for an explanati
c260: 6f 6e 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73  on of this..*/.s
c270: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55  tatic int pagerU
c280: 6e 6c 6f 63 6b 44 62 28 50 61 67 65 72 20 2a 70  nlockDb(Pager *p
c290: 50 61 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b  Pager, int eLock
c2a0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
c2b0: 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
c2c0: 72 74 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  rt( !pPager->exc
c2d0: 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50  lusiveMode || pP
c2e0: 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 65 4c 6f  ager->eLock==eLo
c2f0: 63 6b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ck );.  assert( 
c300: 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c  eLock==NO_LOCK |
c310: 7c 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  | eLock==SHARED_
c320: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
c330: 28 20 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b  ( eLock!=NO_LOCK
c340: 20 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c 28   || pagerUseWal(
c350: 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20  pPager)==0 );.  
c360: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 21 3d 4e  assert( eLock!=N
c370: 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 61 67 65 72 49  O_LOCK || pagerI
c380: 73 53 65 72 76 65 72 28 70 50 61 67 65 72 29 3d  sServer(pPager)=
c390: 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70  =0 );.  if( isOp
c3a0: 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
c3b0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
c3c0: 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f  ager->eLock>=eLo
c3d0: 63 6b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  ck );.    rc = p
c3e0: 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20  Pager->noLock ? 
c3f0: 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69  SQLITE_OK : sqli
c400: 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67  te3OsUnlock(pPag
c410: 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a  er->fd, eLock);.
c420: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
c430: 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c  eLock!=UNKNOWN_L
c440: 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61  OCK ){.      pPa
c450: 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75 38  ger->eLock = (u8
c460: 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  )eLock;.    }.  
c470: 20 20 49 4f 54 52 41 43 45 28 28 22 55 4e 4c 4f    IOTRACE(("UNLO
c480: 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  CK %p %d\n", pPa
c490: 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20 7d  ger, eLock)).  }
c4a0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
c4b0: 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
c4c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
c4d0: 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68   level eLock, wh
c4e0: 69 63 68 20 6d 75 73 74 20 62 65 20 65 69 74 68  ich must be eith
c4f0: 65 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 0a  er SHARED_LOCK,.
c500: 2a 2a 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  ** RESERVED_LOCK
c510: 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   or EXCLUSIVE_LO
c520: 43 4b 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 65  CK. If the calle
c530: 72 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  r is successful,
c540: 20 73 65 74 20 74 68 65 0a 2a 2a 20 50 61 67 65   set the.** Page
c550: 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65  r.eLock variable
c560: 20 74 6f 20 74 68 65 20 6e 65 77 20 6c 6f 63 6b   to the new lock
c570: 69 6e 67 20 73 74 61 74 65 2e 20 0a 2a 2a 0a 2a  ing state. .**.*
c580: 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50 61 67  * Except, if Pag
c590: 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20  er.eLock is set 
c5a0: 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  to UNKNOWN_LOCK 
c5b0: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
c5c0: 6f 6e 20 69 73 20 0a 2a 2a 20 63 61 6c 6c 65 64  on is .** called
c5d0: 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20  , do not modify 
c5e0: 69 74 20 75 6e 6c 65 73 73 20 74 68 65 20 6e 65  it unless the ne
c5f0: 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 20  w locking state 
c600: 69 73 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  is EXCLUSIVE_LOC
c610: 4b 2e 20 0a 2a 2a 20 53 65 65 20 74 68 65 20 63  K. .** See the c
c620: 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65  omment above the
c630: 20 23 64 65 66 69 6e 65 20 6f 66 20 55 4e 4b 4e   #define of UNKN
c640: 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20  OWN_LOCK for an 
c650: 65 78 70 6c 61 6e 61 74 69 6f 6e 20 0a 2a 2a 20  explanation .** 
c660: 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74  of this..*/.stat
c670: 69 63 20 69 6e 74 20 70 61 67 65 72 4c 6f 63 6b  ic int pagerLock
c680: 44 62 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  Db(Pager *pPager
c690: 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20  , int eLock){.  
c6a0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
c6b0: 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65  OK;..  assert( e
c6c0: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
c6d0: 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 52 45 53 45  K || eLock==RESE
c6e0: 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f  RVED_LOCK || eLo
c6f0: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
c700: 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  CK );.  if( pPag
c710: 65 72 2d 3e 65 4c 6f 63 6b 3c 65 4c 6f 63 6b 20  er->eLock<eLock 
c720: 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  || pPager->eLock
c730: 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29  ==UNKNOWN_LOCK )
c740: 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65  {.    rc = pPage
c750: 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20 53 51 4c 49  r->noLock ? SQLI
c760: 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74 65 33 4f  TE_OK : sqlite3O
c770: 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  sLock(pPager->fd
c780: 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66  , eLock);.    if
c790: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
c7a0: 26 26 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63  && (pPager->eLoc
c7b0: 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 7c  k!=UNKNOWN_LOCK|
c7c0: 7c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  |eLock==EXCLUSIV
c7d0: 45 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20  E_LOCK) ){.     
c7e0: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d   pPager->eLock =
c7f0: 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20   (u8)eLock;.    
c800: 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b    IOTRACE(("LOCK
c810: 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
c820: 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20 20 20 7d  r, eLock)).    }
c830: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
c840: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
c850: 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69  function determi
c860: 6e 65 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e  nes whether or n
c870: 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  ot the atomic-wr
c880: 69 74 65 20 6f 72 0a 2a 2a 20 61 74 6f 6d 69 63  ite or.** atomic
c890: 2d 62 61 74 63 68 2d 77 72 69 74 65 20 6f 70 74  -batch-write opt
c8a0: 69 6d 69 7a 61 74 69 6f 6e 73 20 63 61 6e 20 62  imizations can b
c8b0: 65 20 75 73 65 64 20 77 69 74 68 20 74 68 69 73  e used with this
c8c0: 20 70 61 67 65 72 2e 20 54 68 65 0a 2a 2a 20 61   pager. The.** a
c8d0: 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69  tomic-write opti
c8e0: 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20  mization can be 
c8f0: 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20  used if:.**.**  
c900: 28 61 29 20 74 68 65 20 76 61 6c 75 65 20 72 65  (a) the value re
c910: 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65 76 69  turned by OsDevi
c920: 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
c930: 73 28 29 20 69 6e 64 69 63 61 74 65 73 20 74 68  s() indicates th
c940: 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64 61 74  at.**      a dat
c950: 61 62 61 73 65 20 70 61 67 65 20 6d 61 79 20 62  abase page may b
c960: 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63  e written atomic
c970: 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20 28 62  ally, and.**  (b
c980: 29 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  ) the value retu
c990: 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74 6f 72  rned by OsSector
c9a0: 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73 20 74  Size() is less t
c9b0: 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20  han or equal.** 
c9c0: 20 20 20 20 20 74 6f 20 74 68 65 20 70 61 67 65       to the page
c9d0: 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   size..**.** If 
c9e0: 69 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c 20  it can be used, 
c9f0: 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72  then the value r
ca00: 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 73  eturned is the s
ca10: 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
ca20: 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e  al .** file when
ca30: 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 72 6f 6c   it contains rol
ca40: 6c 62 61 63 6b 20 64 61 74 61 20 66 6f 72 20 65  lback data for e
ca50: 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 2e  xactly one page.
ca60: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 74 6f 6d 69  .**.** The atomi
ca70: 63 2d 62 61 74 63 68 2d 77 72 69 74 65 20 6f 70  c-batch-write op
ca80: 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62  timization can b
ca90: 65 20 75 73 65 64 20 69 66 20 4f 73 44 65 76 69  e used if OsDevi
caa0: 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
cab0: 73 28 29 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61  s().** returns a
cac0: 20 76 61 6c 75 65 20 77 69 74 68 20 74 68 65 20   value with the 
cad0: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 42 41 54  SQLITE_IOCAP_BAT
cae0: 43 48 5f 41 54 4f 4d 49 43 20 62 69 74 20 73 65  CH_ATOMIC bit se
caf0: 74 2e 20 2d 31 20 69 73 0a 2a 2a 20 72 65 74 75  t. -1 is.** retu
cb00: 72 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61 73  rned in this cas
cb10: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65 69 74  e..**.** If neit
cb20: 68 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  her optimization
cb30: 20 63 61 6e 20 62 65 20 75 73 65 64 2c 20 30 20   can be used, 0 
cb40: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
cb50: 73 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42  static int jrnlB
cb60: 75 66 66 65 72 53 69 7a 65 28 50 61 67 65 72 20  ufferSize(Pager 
cb70: 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65  *pPager){.  asse
cb80: 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 0a 23  rt( !MEMDB );..#
cb90: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
cba0: 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f  E_ENABLE_ATOMIC_
cbb0: 57 52 49 54 45 29 20 5c 0a 20 7c 7c 20 64 65 66  WRITE) \. || def
cbc0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
cbd0: 4c 45 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43 5f  LE_BATCH_ATOMIC_
cbe0: 57 52 49 54 45 29 0a 20 20 69 6e 74 20 64 63 3b  WRITE).  int dc;
cbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
cc10: 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73  vice characteris
cc20: 74 69 63 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72  tics */..  asser
cc30: 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
cc40: 2d 3e 66 64 29 20 29 3b 0a 20 20 64 63 20 3d 20  ->fd) );.  dc = 
cc50: 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
cc60: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
cc70: 50 61 67 65 72 2d 3e 66 64 29 3b 0a 23 65 6c 73  Pager->fd);.#els
cc80: 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  e.  UNUSED_PARAM
cc90: 45 54 45 52 28 70 50 61 67 65 72 29 3b 0a 23 65  ETER(pPager);.#e
cca0: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
ccb0: 49 54 45 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48  ITE_ENABLE_BATCH
ccc0: 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20  _ATOMIC_WRITE.  
ccd0: 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
cce0: 7a 65 3e 30 20 26 26 20 28 64 63 26 53 51 4c 49  ze>0 && (dc&SQLI
ccf0: 54 45 5f 49 4f 43 41 50 5f 42 41 54 43 48 5f 41  TE_IOCAP_BATCH_A
cd00: 54 4f 4d 49 43 29 20 29 7b 0a 20 20 20 20 72 65  TOMIC) ){.    re
cd10: 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e  turn -1;.  }.#en
cd20: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
cd30: 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
cd40: 5f 57 52 49 54 45 0a 20 20 7b 0a 20 20 20 20 69  _WRITE.  {.    i
cd50: 6e 74 20 6e 53 65 63 74 6f 72 20 3d 20 70 50 61  nt nSector = pPa
cd60: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b  ger->sectorSize;
cd70: 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67 65 20  .    int szPage 
cd80: 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
cd90: 7a 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  ze;..    assert(
cda0: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
cdb0: 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29  MIC512==(512>>8)
cdc0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 53 51  );.    assert(SQ
cdd0: 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
cde0: 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29  C64K==(65536>>8)
cdf0: 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 64  );.    if( 0==(d
ce00: 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  c&(SQLITE_IOCAP_
ce10: 41 54 4f 4d 49 43 7c 28 73 7a 50 61 67 65 3e 3e  ATOMIC|(szPage>>
ce20: 38 29 29 20 7c 7c 20 6e 53 65 63 74 6f 72 3e 73  8)) || nSector>s
ce30: 7a 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20  zPage) ){.      
ce40: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
ce50: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 4a 4f    }..  return JO
ce60: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
ce70: 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50  ger) + JOURNAL_P
ce80: 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 23 65  G_SZ(pPager);.#e
ce90: 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 30  ndif..  return 0
cea0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51  ;.}../*.** If SQ
ceb0: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
cec0: 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e   is defined then
ced0: 20 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e 69   we do some sani
cee0: 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f  ty checking.** o
cef0: 6e 20 74 68 65 20 63 61 63 68 65 20 75 73 69 6e  n the cache usin
cf00: 67 20 61 20 68 61 73 68 20 66 75 6e 63 74 69 6f  g a hash functio
cf10: 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  n.  This is used
cf20: 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20   for testing.** 
cf30: 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  and debugging on
cf40: 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ly..*/.#ifdef SQ
cf50: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
cf60: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
cf70: 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20 74  32-bit hash of t
cf80: 68 65 20 70 61 67 65 20 64 61 74 61 20 66 6f 72  he page data for
cf90: 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69   pPage..*/.stati
cfa0: 63 20 75 33 32 20 70 61 67 65 72 5f 64 61 74 61  c u32 pager_data
cfb0: 68 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c 20  hash(int nByte, 
cfc0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
cfd0: 44 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61 73  Data){.  u32 has
cfe0: 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  h = 0;.  int i;.
cff0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 79    for(i=0; i<nBy
d000: 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61  te; i++){.    ha
d010: 73 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39 29  sh = (hash*1039)
d020: 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d   + pData[i];.  }
d030: 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b 0a  .  return hash;.
d040: 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67  }.static u32 pag
d050: 65 72 5f 70 61 67 65 68 61 73 68 28 50 67 48 64  er_pagehash(PgHd
d060: 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74  r *pPage){.  ret
d070: 75 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68 61  urn pager_dataha
d080: 73 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65 72  sh(pPage->pPager
d090: 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 6e 73  ->pageSize, (uns
d0a0: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 50 61  igned char *)pPa
d0b0: 67 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 73 74  ge->pData);.}.st
d0c0: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
d0d0: 73 65 74 5f 70 61 67 65 68 61 73 68 28 50 67 48  set_pagehash(PgH
d0e0: 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 70 50  dr *pPage){.  pP
d0f0: 61 67 65 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  age->pageHash = 
d100: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
d110: 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
d120: 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20 6d  The CHECK_PAGE m
d130: 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67 48  acro takes a PgH
d140: 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65  dr* as an argume
d150: 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43 48  nt. If SQLITE_CH
d160: 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20  ECK_PAGES.** is 
d170: 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45  defined, and NDE
d180: 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  BUG is not defin
d190: 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20  ed, an assert() 
d1a0: 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b 73  statement checks
d1b0: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67  .** that the pag
d1c0: 65 20 69 73 20 65 69 74 68 65 72 20 64 69 72 74  e is either dirt
d1d0: 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63 68  y or still match
d1e0: 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74 65  es the calculate
d1f0: 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a  d page-hash..*/.
d200: 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41  #define CHECK_PA
d210: 47 45 28 78 29 20 63 68 65 63 6b 50 61 67 65 28  GE(x) checkPage(
d220: 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  x).static void c
d230: 68 65 63 6b 50 61 67 65 28 50 67 48 64 72 20 2a  heckPage(PgHdr *
d240: 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
d250: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
d260: 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ger;.  assert( p
d270: 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
d280: 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20  AGER_ERROR );.  
d290: 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c  assert( (pPg->fl
d2a0: 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 29  ags&PGHDR_DIRTY)
d2b0: 20 7c 7c 20 70 50 67 2d 3e 70 61 67 65 48 61 73   || pPg->pageHas
d2c0: 68 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61 73  h==pager_pagehas
d2d0: 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c  h(pPg) );.}..#el
d2e0: 73 65 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72  se.#define pager
d2f0: 5f 64 61 74 61 68 61 73 68 28 58 2c 59 29 20 20  _datahash(X,Y)  
d300: 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f  0.#define pager_
d310: 70 61 67 65 68 61 73 68 28 58 29 20 20 30 0a 23  pagehash(X)  0.#
d320: 64 65 66 69 6e 65 20 70 61 67 65 72 5f 73 65 74  define pager_set
d330: 5f 70 61 67 65 68 61 73 68 28 58 29 0a 23 64 65  _pagehash(X).#de
d340: 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28  fine CHECK_PAGE(
d350: 78 29 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53 51  x).#endif  /* SQ
d360: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
d370: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20   */../*.** When 
d380: 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74  this is called t
d390: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
d3a0: 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72  for pager pPager
d3b0: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a   must be open..*
d3c0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
d3d0: 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 61 64  attempts to read
d3e0: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
d3f0: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 66 72 6f 6d  l file name from
d400: 20 74 68 65 20 0a 2a 2a 20 65 6e 64 20 6f 66 20   the .** end of 
d410: 74 68 65 20 66 69 6c 65 20 61 6e 64 2c 20 69 66  the file and, if
d420: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 63 6f 70   successful, cop
d430: 69 65 73 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f  ies it into memo
d440: 72 79 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20  ry supplied .** 
d450: 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 53  by the caller. S
d460: 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76  ee comments abov
d470: 65 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  e writeMasterJou
d480: 72 6e 61 6c 28 29 20 66 6f 72 20 74 68 65 20 66  rnal() for the f
d490: 6f 72 6d 61 74 0a 2a 2a 20 75 73 65 64 20 74 6f  ormat.** used to
d4a0: 20 73 74 6f 72 65 20 61 20 6d 61 73 74 65 72 20   store a master 
d4b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
d4c0: 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  e at the end of 
d4d0: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  a journal file..
d4e0: 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d 75  **.** zMaster mu
d4f0: 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  st point to a bu
d500: 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74  ffer of at least
d510: 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 61   nMaster bytes a
d520: 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74  llocated by.** t
d530: 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 69 73 20  he caller. This 
d540: 73 68 6f 75 6c 64 20 62 65 20 73 71 6c 69 74 65  should be sqlite
d550: 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65  3_vfs.mxPathname
d560: 2b 31 20 28 74 6f 20 65 6e 73 75 72 65 20 74 68  +1 (to ensure th
d570: 65 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67 68  ere is.** enough
d580: 20 73 70 61 63 65 20 74 6f 20 77 72 69 74 65 20   space to write 
d590: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
d5a0: 61 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74 68 65  al name). If the
d5b0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
d5c0: 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 6a  ** name in the j
d5d0: 6f 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65 72  ournal is longer
d5e0: 20 74 68 61 6e 20 6e 4d 61 73 74 65 72 20 62 79   than nMaster by
d5f0: 74 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20 61  tes (including a
d600: 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  .** nul-terminat
d610: 6f 72 29 2c 20 74 68 65 6e 20 74 68 69 73 20 69  or), then this i
d620: 73 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66 20  s handled as if 
d630: 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
d640: 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20 70  l name.** were p
d650: 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 6a 6f  resent in the jo
d660: 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urnal..**.** If 
d670: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
d680: 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72   file name is pr
d690: 65 73 65 6e 74 20 61 74 20 74 68 65 20 65 6e 64  esent at the end
d6a0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   of the journal.
d6b0: 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  ** file, then it
d6c0: 20 69 73 20 63 6f 70 69 65 64 20 69 6e 74 6f 20   is copied into 
d6d0: 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74  the buffer point
d6e0: 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72  ed to by zMaster
d6f0: 2e 20 41 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69  . A.** nul-termi
d700: 6e 61 74 6f 72 20 62 79 74 65 20 69 73 20 61 70  nator byte is ap
d710: 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 62 75  pended to the bu
d720: 66 66 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ffer following t
d730: 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75  he master.** jou
d740: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 2e 0a  rnal file name..
d750: 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 64  **.** If it is d
d760: 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 6e  etermined that n
d770: 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
d780: 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72   file name is pr
d790: 65 73 65 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74 65  esent .** zMaste
d7a0: 72 5b 30 5d 20 69 73 20 73 65 74 20 74 6f 20 30  r[0] is set to 0
d7b0: 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
d7c0: 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
d7d0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
d7e0: 73 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20  s while reading 
d7f0: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
d800: 20 66 69 6c 65 2c 20 61 6e 20 53 51 4c 69 74 65   file, an SQLite
d810: 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69  .** error code i
d820: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
d830: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61  tatic int readMa
d840: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69  sterJournal(sqli
d850: 74 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c  te3_file *pJrnl,
d860: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20   char *zMaster, 
d870: 75 33 32 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20  u32 nMaster){.  
d880: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
d890: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
d8a0: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75  turn code */.  u
d8b0: 33 32 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20  32 len;         
d8c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
d8d0: 67 74 68 20 69 6e 20 62 79 74 65 73 20 6f 66 20  gth in bytes of 
d8e0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
d8f0: 61 6d 65 20 2a 2f 0a 20 20 69 36 34 20 73 7a 4a  ame */.  i64 szJ
d900: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d910: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a      /* Total siz
d920: 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6a 6f  e in bytes of jo
d930: 75 72 6e 61 6c 20 66 69 6c 65 20 70 4a 72 6e 6c  urnal file pJrnl
d940: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b   */.  u32 cksum;
d950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d960: 20 2f 2a 20 4d 4a 20 63 68 65 63 6b 73 75 6d 20   /* MJ checksum 
d970: 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  value read from 
d980: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
d990: 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   u;             
d9a0: 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67          /* Unsig
d9b0: 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72  ned loop counter
d9c0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
d9d0: 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20  har aMagic[8];  
d9e0: 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20   /* A buffer to 
d9f0: 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68  hold the magic h
da00: 65 61 64 65 72 20 2a 2f 0a 20 20 7a 4d 61 73 74  eader */.  zMast
da10: 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20  er[0] = '\0';.. 
da20: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
da30: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46  (rc = sqlite3OsF
da40: 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26  ileSize(pJrnl, &
da50: 73 7a 4a 29 29 0a 20 20 20 7c 7c 20 73 7a 4a 3c  szJ)).   || szJ<
da60: 31 36 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  16.   || SQLITE_
da70: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
da80: 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d  bits(pJrnl, szJ-
da90: 31 36 2c 20 26 6c 65 6e 29 29 0a 20 20 20 7c 7c  16, &len)).   ||
daa0: 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a 20   len>=nMaster . 
dab0: 20 20 7c 7c 20 6c 65 6e 3e 73 7a 4a 2d 31 36 0a    || len>szJ-16.
dac0: 20 20 20 7c 7c 20 6c 65 6e 3d 3d 30 20 0a 20 20     || len==0 .  
dad0: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
dae0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
daf0: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26  pJrnl, szJ-12, &
db00: 63 6b 73 75 6d 29 29 0a 20 20 20 7c 7c 20 53 51  cksum)).   || SQ
db10: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
db20: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72  qlite3OsRead(pJr
db30: 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 73  nl, aMagic, 8, s
db40: 7a 4a 2d 38 29 29 0a 20 20 20 7c 7c 20 6d 65 6d  zJ-8)).   || mem
db50: 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
db60: 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 0a 20 20  rnalMagic, 8).  
db70: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
db80: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
db90: 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65  ad(pJrnl, zMaste
dba0: 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c  r, len, szJ-16-l
dbb0: 65 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  en)).  ){.    re
dbc0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
dbd0: 2f 2a 20 53 65 65 20 69 66 20 74 68 65 20 63 68  /* See if the ch
dbe0: 65 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74  ecksum matches t
dbf0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
dc00: 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28  l name */.  for(
dc10: 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29  u=0; u<len; u++)
dc20: 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 7a  {.    cksum -= z
dc30: 4d 61 73 74 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20  Master[u];.  }. 
dc40: 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20   if( cksum ){.  
dc50: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63    /* If the chec
dc60: 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64  ksum doesn't add
dc70: 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72   up, then one or
dc80: 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73   more of the dis
dc90: 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a  k sectors.    **
dca0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
dcb0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
dcc0: 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75  ilename is corru
dcd0: 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73  pted. This means
dce0: 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65  .    ** definite
dcf0: 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f  ly roll back, so
dd00: 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c   just return SQL
dd10: 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72  ITE_OK and repor
dd20: 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a  t a (nul).    **
dd30: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
dd40: 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f  filename..    */
dd50: 0a 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20 20  .    len = 0;.  
dd60: 7d 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d  }.  zMaster[len]
dd70: 20 3d 20 27 5c 30 27 3b 0a 20 20 20 0a 20 20 72   = '\0';.   .  r
dd80: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
dd90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
dda0: 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74   the offset of t
ddb0: 68 65 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61  he sector bounda
ddc0: 72 79 20 61 74 20 6f 72 20 69 6d 6d 65 64 69 61  ry at or immedia
ddd0: 74 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  tely .** followi
dde0: 6e 67 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  ng the value in 
ddf0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
de00: 66 66 2c 20 61 73 73 75 6d 69 6e 67 20 61 20 73  ff, assuming a s
de10: 65 63 74 6f 72 20 0a 2a 2a 20 73 69 7a 65 20 6f  ector .** size o
de20: 66 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  f pPager->sector
de30: 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  Size bytes..**.*
de40: 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74  * i.e for a sect
de50: 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a  or size of 512:.
de60: 2a 2a 0a 2a 2a 20 20 20 50 61 67 65 72 2e 6a 6f  **.**   Pager.jo
de70: 75 72 6e 61 6c 4f 66 66 20 20 20 20 20 20 20 20  urnalOff        
de80: 20 20 52 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a    Return value.*
de90: 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
dea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
deb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
dec0: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
ded0: 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20             0.** 
dee0: 20 20 35 31 32 20 20 20 20 20 20 20 20 20 20 20    512           
def0: 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a              512.
df00: 2a 2a 20 20 20 31 30 30 20 20 20 20 20 20 20 20  **   100        
df10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35                 5
df20: 31 32 0a 2a 2a 20 20 20 32 30 30 30 20 20 20 20  12.**   2000    
df30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df40: 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74    2048.** .*/.st
df50: 61 74 69 63 20 69 36 34 20 6a 6f 75 72 6e 61 6c  atic i64 journal
df60: 48 64 72 4f 66 66 73 65 74 28 50 61 67 65 72 20  HdrOffset(Pager 
df70: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20  *pPager){.  i64 
df80: 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36  offset = 0;.  i6
df90: 34 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  4 c = pPager->jo
dfa0: 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20  urnalOff;.  if( 
dfb0: 63 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20  c ){.    offset 
dfc0: 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c  = ((c-1)/JOURNAL
dfd0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
dfe0: 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48  + 1) * JOURNAL_H
dff0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
e000: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66   }.  assert( off
e010: 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  set%JOURNAL_HDR_
e020: 53 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b  SZ(pPager)==0 );
e030: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
e040: 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74  t>=c );.  assert
e050: 28 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55  ( (offset-c)<JOU
e060: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
e070: 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  er) );.  return 
e080: 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  offset;.}../*.**
e090: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
e0a0: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77  e must be open w
e0b0: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
e0c0: 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  n is called..**.
e0d0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
e0e0: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74   is a no-op if t
e0f0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
e100: 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 77 72 69  has not been wri
e110: 74 74 65 6e 20 74 6f 0a 2a 2a 20 77 69 74 68 69  tten to.** withi
e120: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  n the current tr
e130: 61 6e 73 61 63 74 69 6f 6e 20 28 69 2e 65 2e 20  ansaction (i.e. 
e140: 69 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  if Pager.journal
e150: 4f 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49  Off==0)..**.** I
e160: 66 20 64 6f 54 72 75 6e 63 61 74 65 20 69 73 20  f doTruncate is 
e170: 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74 68 65 20  non-zero or the 
e180: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a  Pager.journalSiz
e190: 65 4c 69 6d 69 74 20 76 61 72 69 61 62 6c 65 20  eLimit variable 
e1a0: 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2c 20  is.** set to 0, 
e1b0: 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68  then truncate th
e1c0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
e1d0: 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20  o zero bytes in 
e1e0: 73 69 7a 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  size. Otherwise,
e1f0: 0a 2a 2a 20 7a 65 72 6f 20 74 68 65 20 32 38 2d  .** zero the 28-
e200: 62 79 74 65 20 68 65 61 64 65 72 20 61 74 20 74  byte header at t
e210: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
e220: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 6e  journal file. In
e230: 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 0a 2a   either case, .*
e240: 2a 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69  * if the pager i
e250: 73 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63  s not in no-sync
e260: 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20   mode, sync the 
e270: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d 6d  journal file imm
e280: 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 61 66 74  ediately .** aft
e290: 65 72 20 77 72 69 74 69 6e 67 20 6f 72 20 74 72  er writing or tr
e2a0: 75 6e 63 61 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a  uncating it..**.
e2b0: 2a 2a 20 49 66 20 50 61 67 65 72 2e 6a 6f 75 72  ** If Pager.jour
e2c0: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 69 73 20  nalSizeLimit is 
e2d0: 73 65 74 20 74 6f 20 61 20 70 6f 73 69 74 69 76  set to a positiv
e2e0: 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  e, non-zero valu
e2f0: 65 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77  e, and.** follow
e300: 69 6e 67 20 74 68 65 20 74 72 75 6e 63 61 74 69  ing the truncati
e310: 6f 6e 20 6f 72 20 7a 65 72 6f 69 6e 67 20 64 65  on or zeroing de
e320: 73 63 72 69 62 65 64 20 61 62 6f 76 65 20 74 68  scribed above th
e330: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a  e size of the .*
e340: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  * journal file i
e350: 6e 20 62 79 74 65 73 20 69 73 20 6c 61 72 67 65  n bytes is large
e360: 72 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75  r than this valu
e370: 65 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65  e, then truncate
e380: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
e390: 66 69 6c 65 20 74 6f 20 50 61 67 65 72 2e 6a 6f  file to Pager.jo
e3a0: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 62  urnalSizeLimit b
e3b0: 79 74 65 73 2e 20 54 68 65 20 6a 6f 75 72 6e 61  ytes. The journa
e3c0: 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e  l file does.** n
e3d0: 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 73 79  ot need to be sy
e3e0: 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  nced following t
e3f0: 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  his operation..*
e400: 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72  *.** If an IO er
e410: 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 62 61 6e  ror occurs, aban
e420: 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61  don processing a
e430: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 49 4f  nd return the IO
e440: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20   error code..** 
e450: 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
e460: 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  n SQLITE_OK..*/.
e470: 73 74 61 74 69 63 20 69 6e 74 20 7a 65 72 6f 4a  static int zeroJ
e480: 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20  ournalHdr(Pager 
e490: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 64 6f 54  *pPager, int doT
e4a0: 72 75 6e 63 61 74 65 29 7b 0a 20 20 69 6e 74 20  runcate){.  int 
e4b0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
e4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e4e0: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
e4f0: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
e500: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
e510: 0a 20 20 61 73 73 65 72 74 28 20 21 73 71 6c 69  .  assert( !sqli
e520: 74 65 33 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d 65  te3JournalIsInMe
e530: 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 6a 66 64  mory(pPager->jfd
e540: 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ) );.  if( pPage
e550: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b  r->journalOff ){
e560: 0a 20 20 20 20 63 6f 6e 73 74 20 69 36 34 20 69  .    const i64 i
e570: 4c 69 6d 69 74 20 3d 20 70 50 61 67 65 72 2d 3e  Limit = pPager->
e580: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
e590: 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61  ;    /* Local ca
e5a0: 63 68 65 20 6f 66 20 6a 73 6c 20 2a 2f 0a 0a 20  che of jsl */.. 
e5b0: 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 5a 45     IOTRACE(("JZE
e5c0: 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20 70 50 61  ROHDR %p\n", pPa
e5d0: 67 65 72 29 29 0a 20 20 20 20 69 66 28 20 64 6f  ger)).    if( do
e5e0: 54 72 75 6e 63 61 74 65 20 7c 7c 20 69 4c 69 6d  Truncate || iLim
e5f0: 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  it==0 ){.      r
e600: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
e610: 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  ncate(pPager->jf
e620: 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  d, 0);.    }else
e630: 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  {.      static c
e640: 6f 6e 73 74 20 63 68 61 72 20 7a 65 72 6f 48 64  onst char zeroHd
e650: 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a 20 20 20  r[28] = {0};.   
e660: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
e670: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
e680: 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20 73 69 7a  fd, zeroHdr, siz
e690: 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c 20 30 29  eof(zeroHdr), 0)
e6a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
e6b0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
e6c0: 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
e6d0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
e6e0: 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
e6f0: 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45  ger->jfd, SQLITE
e700: 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 7c 70  _SYNC_DATAONLY|p
e710: 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
e720: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
e730: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
e740: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
e750: 73 20 63 6f 6d 6d 69 74 74 65 64 20 62 75 74 20  s committed but 
e760: 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 0a  the write lock .
e770: 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20      ** is still 
e780: 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c 65  held on the file
e790: 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  . If there is a 
e7a0: 73 69 7a 65 20 6c 69 6d 69 74 20 63 6f 6e 66 69  size limit confi
e7b0: 67 75 72 65 64 20 66 6f 72 20 0a 20 20 20 20 2a  gured for .    *
e7c0: 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  * the persistent
e7d0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65   journal and the
e7e0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 75   journal file cu
e7f0: 72 72 65 6e 74 6c 79 20 63 6f 6e 73 75 6d 65 73  rrently consumes
e800: 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20 73 70 61   more.    ** spa
e810: 63 65 20 74 68 61 6e 20 74 68 61 74 20 6c 69 6d  ce than that lim
e820: 69 74 20 61 6c 6c 6f 77 73 20 66 6f 72 2c 20 74  it allows for, t
e830: 72 75 6e 63 61 74 65 20 69 74 20 6e 6f 77 2e 20  runcate it now. 
e840: 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  There is no need
e850: 0a 20 20 20 20 2a 2a 20 74 6f 20 73 79 6e 63 20  .    ** to sync 
e860: 74 68 65 20 66 69 6c 65 20 66 6f 6c 6c 6f 77 69  the file followi
e870: 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  ng this operatio
e880: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
e890: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
e8a0: 26 26 20 69 4c 69 6d 69 74 3e 30 20 29 7b 0a 20  && iLimit>0 ){. 
e8b0: 20 20 20 20 20 69 36 34 20 73 7a 3b 0a 20 20 20       i64 sz;.   
e8c0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
e8d0: 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
e8e0: 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a 20 20 20  ->jfd, &sz);.   
e8f0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
e900: 45 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c 69 6d 69  E_OK && sz>iLimi
e910: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
e920: 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
e930: 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ate(pPager->jfd,
e940: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20   iLimit);.      
e950: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
e960: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
e970: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
e980: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
e990: 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
e9a0: 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a  e is called. A j
e9b0: 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72  ournal.** header
e9c0: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
e9d0: 20 62 79 74 65 73 29 20 69 73 20 77 72 69 74 74   bytes) is writt
e9e0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
e9f0: 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65 0a  nal file at the.
ea00: 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  ** current locat
ea10: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ion..**.** The f
ea20: 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a 6f  ormat for the jo
ea30: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
ea40: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d  as follows:.** -
ea50: 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63 20   8 bytes: Magic 
ea60: 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72  identifying jour
ea70: 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d  nal format..** -
ea80: 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72   4 bytes: Number
ea90: 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 6a   of records in j
eaa0: 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f  ournal, or -1 no
eab0: 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e  -sync mode is on
eac0: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
ead0: 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73  Random number us
eae0: 65 64 20 66 6f 72 20 70 61 67 65 20 68 61 73 68  ed for page hash
eaf0: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
eb00: 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65  Initial database
eb10: 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20   page count..** 
eb20: 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63 74 6f  - 4 bytes: Secto
eb30: 72 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74  r size used by t
eb40: 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
eb50: 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72 6e  wrote this journ
eb60: 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  al..** - 4 bytes
eb70: 3a 20 44 61 74 61 62 61 73 65 20 70 61 67 65 20  : Database page 
eb80: 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c  size..** .** Fol
eb90: 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41  lowed by (JOURNA
eba0: 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62  L_HDR_SZ - 28) b
ebb0: 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73  ytes of unused s
ebc0: 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pace..*/.static 
ebd0: 69 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  int writeJournal
ebe0: 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Hdr(Pager *pPage
ebf0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
ec00: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
ec10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
ec20: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68  urn code */.  ch
ec30: 61 72 20 2a 7a 48 65 61 64 65 72 20 3d 20 70 50  ar *zHeader = pP
ec40: 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
ec50: 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73    /* Temporary s
ec60: 70 61 63 65 20 75 73 65 64 20 74 6f 20 62 75 69  pace used to bui
ec70: 6c 64 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75  ld header */.  u
ec80: 33 32 20 6e 48 65 61 64 65 72 20 3d 20 28 75 33  32 nHeader = (u3
ec90: 32 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  2)pPager->pageSi
eca0: 7a 65 3b 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75  ze;/* Size of bu
ecb0: 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20  ffer pointed to 
ecc0: 62 79 20 7a 48 65 61 64 65 72 20 2a 2f 0a 20 20  by zHeader */.  
ecd0: 75 33 32 20 6e 57 72 69 74 65 3b 20 20 20 20 20  u32 nWrite;     
ece0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ecf0: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
ed00: 68 65 61 64 65 72 20 73 65 63 74 6f 72 20 77 72  header sector wr
ed10: 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  itten */.  int i
ed20: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
ed30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ed40: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
ed50: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  /..  assert( isO
ed60: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
ed70: 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72   );      /* Jour
ed80: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
ed90: 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28   open. */..  if(
eda0: 20 6e 48 65 61 64 65 72 3e 4a 4f 55 52 4e 41 4c   nHeader>JOURNAL
edb0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
edc0: 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 3d  ){.    nHeader =
edd0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
ede0: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
edf0: 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
ee00: 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
ee10: 73 20 61 6e 64 20 61 6e 79 20 6f 66 20 74 68 65  s and any of the
ee20: 6d 20 77 65 72 65 20 63 72 65 61 74 65 64 20 0a  m were created .
ee30: 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 20 6d    ** since the m
ee40: 6f 73 74 20 72 65 63 65 6e 74 20 6a 6f 75 72 6e  ost recent journ
ee50: 61 6c 20 68 65 61 64 65 72 20 77 61 73 20 77 72  al header was wr
ee60: 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20 74 68  itten, update th
ee70: 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76  e .  ** PagerSav
ee80: 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65  epoint.iHdrOffse
ee90: 74 20 66 69 65 6c 64 73 20 6e 6f 77 2e 0a 20 20  t fields now..  
eea0: 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  */.  for(ii=0; i
eeb0: 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
eec0: 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  oint; ii++){.   
eed0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 53 61   if( pPager->aSa
eee0: 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72  vepoint[ii].iHdr
eef0: 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20  Offset==0 ){.   
ef00: 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65     pPager->aSave
ef10: 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66  point[ii].iHdrOf
ef20: 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a  fset = pPager->j
ef30: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d  ournalOff;.    }
ef40: 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e  .  }..  pPager->
ef50: 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61  journalHdr = pPa
ef60: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
ef70: 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  = journalHdrOffs
ef80: 65 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f  et(pPager);..  /
ef90: 2a 20 0a 20 20 2a 2a 20 57 72 69 74 65 20 74 68  * .  ** Write th
efa0: 65 20 6e 52 65 63 20 46 69 65 6c 64 20 2d 20 74  e nRec Field - t
efb0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
efc0: 65 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 66  e records that f
efd0: 6f 6c 6c 6f 77 20 74 68 69 73 0a 20 20 2a 2a 20  ollow this.  ** 
efe0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20  journal header. 
eff0: 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72 6f 20 69  Normally, zero i
f000: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 69  s written to thi
f010: 73 20 76 61 6c 75 65 20 61 74 20 74 68 69 73 20  s value at this 
f020: 74 69 6d 65 2e 0a 20 20 2a 2a 20 41 66 74 65 72  time..  ** After
f030: 20 74 68 65 20 72 65 63 6f 72 64 73 20 61 72 65   the records are
f040: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6a 6f   added to the jo
f050: 75 72 6e 61 6c 20 28 61 6e 64 20 74 68 65 20 6a  urnal (and the j
f060: 6f 75 72 6e 61 6c 20 73 79 6e 63 65 64 2c 20 0a  ournal synced, .
f070: 20 20 2a 2a 20 69 66 20 69 6e 20 66 75 6c 6c 2d    ** if in full-
f080: 73 79 6e 63 20 6d 6f 64 65 29 2c 20 74 68 65 20  sync mode), the 
f090: 7a 65 72 6f 20 69 73 20 6f 76 65 72 77 72 69 74  zero is overwrit
f0a0: 74 65 6e 20 77 69 74 68 20 74 68 65 20 74 72 75  ten with the tru
f0b0: 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66  e number.  ** of
f0c0: 20 72 65 63 6f 72 64 73 20 28 73 65 65 20 73 79   records (see sy
f0d0: 6e 63 4a 6f 75 72 6e 61 6c 28 29 29 2e 0a 20 20  ncJournal())..  
f0e0: 2a 2a 0a 20 20 2a 2a 20 41 20 66 61 73 74 65 72  **.  ** A faster
f0f0: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 69 73 20   alternative is 
f100: 74 6f 20 77 72 69 74 65 20 30 78 46 46 46 46 46  to write 0xFFFFF
f110: 46 46 46 20 74 6f 20 74 68 65 20 6e 52 65 63 20  FFF to the nRec 
f120: 66 69 65 6c 64 2e 20 57 68 65 6e 0a 20 20 2a 2a  field. When.  **
f130: 20 72 65 61 64 69 6e 67 20 74 68 65 20 6a 6f 75   reading the jou
f140: 72 6e 61 6c 20 74 68 69 73 20 76 61 6c 75 65 20  rnal this value 
f150: 74 65 6c 6c 73 20 53 51 4c 69 74 65 20 74 6f 20  tells SQLite to 
f160: 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 0a  assume that the.
f170: 20 20 2a 2a 20 72 65 73 74 20 6f 66 20 74 68 65    ** rest of the
f180: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
f190: 6e 74 61 69 6e 73 20 76 61 6c 69 64 20 70 61 67  ntains valid pag
f1a0: 65 20 72 65 63 6f 72 64 73 2e 20 54 68 69 73 20  e records. This 
f1b0: 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20  assumption.  ** 
f1c0: 69 73 20 64 61 6e 67 65 72 6f 75 73 2c 20 61 73  is dangerous, as
f1d0: 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63   if a failure oc
f1e0: 63 75 72 72 65 64 20 77 68 69 6c 73 74 20 77 72  curred whilst wr
f1f0: 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75  iting to the jou
f200: 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69  rnal.  ** file i
f210: 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 73 6f  t may contain so
f220: 6d 65 20 67 61 72 62 61 67 65 20 64 61 74 61 2e  me garbage data.
f230: 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 20 73   There are two s
f240: 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a 20 77 68  cenarios.  ** wh
f250: 65 72 65 20 74 68 69 73 20 72 69 73 6b 20 63 61  ere this risk ca
f260: 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a 0a 20 20  n be ignored:.  
f270: 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e  **.  **   * When
f280: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
f290: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 43   no-sync mode. C
f2a0: 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e 20 66 6f  orruption can fo
f2b0: 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20 20 20 20  llow a.  **     
f2c0: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 69 6e  power failure in
f2d0: 20 74 68 69 73 20 63 61 73 65 20 61 6e 79 77 61   this case anywa
f2e0: 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a  y..  **.  **   *
f2f0: 20 57 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45   When the SQLITE
f300: 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
f310: 4e 44 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20  ND flag is set. 
f320: 54 68 69 73 20 67 75 61 72 61 6e 74 65 65 73 0a  This guarantees.
f330: 20 20 2a 2a 20 20 20 20 20 74 68 61 74 20 67 61    **     that ga
f340: 72 62 61 67 65 20 64 61 74 61 20 69 73 20 6e 65  rbage data is ne
f350: 76 65 72 20 61 70 70 65 6e 64 65 64 20 74 6f 20  ver appended to 
f360: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
f370: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
f380: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
f390: 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e  fd) || pPager->n
f3a0: 6f 53 79 6e 63 20 29 3b 0a 20 20 69 66 28 20 70  oSync );.  if( p
f3b0: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c  Pager->noSync ||
f3c0: 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   (pPager->journa
f3d0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
f3e0: 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29  RNALMODE_MEMORY)
f3f0: 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f  .   || (sqlite3O
f400: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
f410: 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
f420: 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  d)&SQLITE_IOCAP_
f430: 53 41 46 45 5f 41 50 50 45 4e 44 29 20 0a 20 20  SAFE_APPEND) .  
f440: 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 48  ){.    memcpy(zH
f450: 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d  eader, aJournalM
f460: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  agic, sizeof(aJo
f470: 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20  urnalMagic));.  
f480: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
f490: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
f4a0: 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 78 66  rnalMagic)], 0xf
f4b0: 66 66 66 66 66 66 66 29 3b 0a 20 20 7d 65 6c 73  fffffff);.  }els
f4c0: 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 48  e{.    memset(zH
f4d0: 65 61 64 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  eader, 0, sizeof
f4e0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
f4f0: 34 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  4);.  }..  /* Th
f500: 65 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68  e random check-h
f510: 61 73 68 20 69 6e 69 74 69 61 6c 69 7a 65 72 20  ash initializer 
f520: 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f 72 61  */ .  sqlite3_ra
f530: 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
f540: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
f550: 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73  t), &pPager->cks
f560: 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32  umInit);.  put32
f570: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
f580: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
f590: 69 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e  ic)+4], pPager->
f5a0: 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a  cksumInit);.  /*
f5b0: 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74   The initial dat
f5c0: 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20  abase size */.  
f5d0: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
f5e0: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
f5f0: 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61  alMagic)+8], pPa
f600: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 29  ger->dbOrigSize)
f610: 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d  ;.  /* The assum
f620: 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66  ed sector size f
f630: 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  or this process 
f640: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
f650: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
f660: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32  JournalMagic)+12
f670: 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ], pPager->secto
f680: 72 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 54 68  rSize);..  /* Th
f690: 65 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20  e page size */. 
f6a0: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
f6b0: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
f6c0: 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20 70  nalMagic)+16], p
f6d0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
f6e0: 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  ;..  /* Initiali
f6f0: 7a 69 6e 67 20 74 68 65 20 74 61 69 6c 20 6f 66  zing the tail of
f700: 20 74 68 65 20 62 75 66 66 65 72 20 69 73 20 6e   the buffer is n
f710: 6f 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20 45  ot necessary.  E
f720: 76 65 72 79 74 68 69 6e 67 0a 20 20 2a 2a 20 77  verything.  ** w
f730: 6f 72 6b 73 20 66 69 6e 64 20 69 66 20 74 68 65  orks find if the
f740: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73 65   following memse
f750: 74 28 29 20 69 73 20 6f 6d 69 74 74 65 64 2e 20  t() is omitted. 
f760: 20 42 75 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e   But initializin
f770: 67 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f 72  g.  ** the memor
f780: 79 20 70 72 65 76 65 6e 74 73 20 76 61 6c 67 72  y prevents valgr
f790: 69 6e 64 20 66 72 6f 6d 20 63 6f 6d 70 6c 61 69  ind from complai
f7a0: 6e 69 6e 67 2c 20 73 6f 20 77 65 20 61 72 65 20  ning, so we are 
f7b0: 77 69 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a 20  willing to.  ** 
f7c0: 74 61 6b 65 20 74 68 65 20 70 65 72 66 6f 72 6d  take the perform
f7d0: 61 6e 63 65 20 68 69 74 2e 0a 20 20 2a 2f 0a 20  ance hit..  */. 
f7e0: 20 6d 65 6d 73 65 74 28 26 7a 48 65 61 64 65 72   memset(&zHeader
f7f0: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
f800: 4d 61 67 69 63 29 2b 32 30 5d 2c 20 30 2c 0a 20  Magic)+20], 0,. 
f810: 20 20 20 20 20 20 20 20 6e 48 65 61 64 65 72 2d          nHeader-
f820: 28 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  (sizeof(aJournal
f830: 4d 61 67 69 63 29 2b 32 30 29 29 3b 0a 0a 20 20  Magic)+20));..  
f840: 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 69 74  /* In theory, it
f850: 20 69 73 20 6f 6e 6c 79 20 6e 65 63 65 73 73 61   is only necessa
f860: 72 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  ry to write the 
f870: 32 38 20 62 79 74 65 73 20 74 68 61 74 20 74 68  28 bytes that th
f880: 65 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  e .  ** journal 
f890: 68 65 61 64 65 72 20 63 6f 6e 73 75 6d 65 73 20  header consumes 
f8a0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
f8b0: 69 6c 65 20 68 65 72 65 2e 20 54 68 65 6e 20 69  ile here. Then i
f8c0: 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20  ncrement the .  
f8d0: 2a 2a 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  ** Pager.journal
f8e0: 4f 66 66 20 76 61 72 69 61 62 6c 65 20 62 79 20  Off variable by 
f8f0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 73  JOURNAL_HDR_SZ s
f900: 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20  o that the next 
f910: 0a 20 20 2a 2a 20 72 65 63 6f 72 64 20 69 73 20  .  ** record is 
f920: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66  written to the f
f930: 6f 6c 6c 6f 77 69 6e 67 20 73 65 63 74 6f 72 20  ollowing sector 
f940: 28 6c 65 61 76 69 6e 67 20 61 20 67 61 70 20 69  (leaving a gap i
f950: 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20  n the file.  ** 
f960: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6d 70  that will be imp
f970: 6c 69 63 69 74 6c 79 20 66 69 6c 6c 65 64 20 69  licitly filled i
f980: 6e 20 62 79 20 74 68 65 20 4f 53 29 2e 0a 20 20  n by the OS)..  
f990: 2a 2a 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 20  **.  ** However 
f9a0: 69 74 20 68 61 73 20 62 65 65 6e 20 64 69 73 63  it has been disc
f9b0: 6f 76 65 72 65 64 20 74 68 61 74 20 6f 6e 20 73  overed that on s
f9c0: 6f 6d 65 20 73 79 73 74 65 6d 73 20 74 68 69 73  ome systems this
f9d0: 20 70 61 74 74 65 72 6e 20 63 61 6e 20 0a 20 20   pattern can .  
f9e0: 2a 2a 20 62 65 20 73 69 67 6e 69 66 69 63 61 6e  ** be significan
f9f0: 74 6c 79 20 73 6c 6f 77 65 72 20 74 68 61 6e 20  tly slower than 
fa00: 63 6f 6e 74 69 67 75 6f 75 73 6c 79 20 77 72 69  contiguously wri
fa10: 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65  ting data to the
fa20: 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 65 76 65 6e   file,.  ** even
fa30: 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 65   if that means e
fa40: 78 70 6c 69 63 69 74 6c 79 20 77 72 69 74 69 6e  xplicitly writin
fa50: 67 20 64 61 74 61 20 74 6f 20 74 68 65 20 62 6c  g data to the bl
fa60: 6f 63 6b 20 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f  ock of .  ** (JO
fa70: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32  URNAL_HDR_SZ - 2
fa80: 38 29 20 62 79 74 65 73 20 74 68 61 74 20 77 69  8) bytes that wi
fa90: 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20  ll not be used. 
faa0: 53 6f 20 74 68 61 74 20 69 73 20 77 68 61 74 0a  So that is what.
fab0: 20 20 2a 2a 20 69 73 20 64 6f 6e 65 2e 20 0a 20    ** is done. . 
fac0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 6f 6f   **.  ** The loo
fad0: 70 20 69 73 20 72 65 71 75 69 72 65 64 20 68 65  p is required he
fae0: 72 65 20 69 6e 20 63 61 73 65 20 74 68 65 20 73  re in case the s
faf0: 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61  ector-size is la
fb00: 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20  rger than the . 
fb10: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 70 61 67   ** database pag
fb20: 65 20 73 69 7a 65 2e 20 53 69 6e 63 65 20 74 68  e size. Since th
fb30: 65 20 7a 48 65 61 64 65 72 20 62 75 66 66 65 72  e zHeader buffer
fb40: 20 69 73 20 6f 6e 6c 79 20 50 61 67 65 72 2e 70   is only Pager.p
fb50: 61 67 65 53 69 7a 65 0a 20 20 2a 2a 20 62 79 74  ageSize.  ** byt
fb60: 65 73 20 69 6e 20 73 69 7a 65 2c 20 6d 6f 72 65  es in size, more
fb70: 20 74 68 61 6e 20 6f 6e 65 20 63 61 6c 6c 20 74   than one call t
fb80: 6f 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  o sqlite3OsWrite
fb90: 28 29 20 6d 61 79 20 62 65 20 72 65 71 75 69 72  () may be requir
fba0: 65 64 0a 20 20 2a 2a 20 74 6f 20 70 6f 70 75 6c  ed.  ** to popul
fbb0: 61 74 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a  ate the entire j
fbc0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65  ournal header se
fbd0: 63 74 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f  ctor..  */ .  fo
fbe0: 72 28 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d 3d  r(nWrite=0; rc==
fbf0: 53 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69 74  SQLITE_OK&&nWrit
fc00: 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  e<JOURNAL_HDR_SZ
fc10: 28 70 50 61 67 65 72 29 3b 20 6e 57 72 69 74 65  (pPager); nWrite
fc20: 2b 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20 20 20  +=nHeader){.    
fc30: 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25  IOTRACE(("JHDR %
fc40: 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50  p %lld %d\n", pP
fc50: 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  ager, pPager->jo
fc60: 75 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64 65  urnalHdr, nHeade
fc70: 72 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  r)).    rc = sql
fc80: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
fc90: 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72  er->jfd, zHeader
fca0: 2c 20 6e 48 65 61 64 65 72 2c 20 70 50 61 67 65  , nHeader, pPage
fcb0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a  r->journalOff);.
fcc0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
fcd0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c  er->journalHdr <
fce0: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
fcf0: 6c 4f 66 66 20 29 3b 0a 20 20 20 20 70 50 61 67  lOff );.    pPag
fd00: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
fd10: 3d 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a 0a  = nHeader;.  }..
fd20: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
fd30: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
fd40: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
fd50: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73  pen when this is
fd60: 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e   called. A journ
fd70: 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a  al header file.*
fd80: 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  * (JOURNAL_HDR_S
fd90: 5a 20 62 79 74 65 73 29 20 69 73 20 72 65 61 64  Z bytes) is read
fda0: 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e   from the curren
fdb0: 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68  t location in th
fdc0: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
fdd0: 65 2e 20 54 68 65 20 63 75 72 72 65 6e 74 20 6c  e. The current l
fde0: 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a  ocation in the j
fdf0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 67  ournal file is g
fe00: 69 76 65 6e 20 62 79 0a 2a 2a 20 70 50 61 67 65  iven by.** pPage
fe10: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2e 20 53  r->journalOff. S
fe20: 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76  ee comments abov
fe30: 65 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65  e function write
fe40: 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72  JournalHdr() for
fe50: 0a 2a 2a 20 61 20 64 65 73 63 72 69 70 74 69 6f  .** a descriptio
fe60: 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n of the journal
fe70: 20 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a   header format..
fe80: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61  **.** If the hea
fe90: 64 65 72 20 69 73 20 72 65 61 64 20 73 75 63 63  der is read succ
fea0: 65 73 73 66 75 6c 6c 79 2c 20 2a 70 4e 52 65 63  essfully, *pNRec
feb0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
fec0: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65  umber of.** page
fed0: 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69   records followi
fee0: 6e 67 20 74 68 69 73 20 68 65 61 64 65 72 20 61  ng this header a
fef0: 6e 64 20 2a 70 44 62 53 69 7a 65 20 69 73 20 73  nd *pDbSize is s
ff00: 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f  et to the size o
ff10: 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
ff20: 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61  e before the tra
ff30: 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20  nsaction began, 
ff40: 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20  in pages. Also, 
ff50: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
ff60: 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74  t.** is set to t
ff70: 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
ff80: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  om the journal h
ff90: 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b  eader. SQLITE_OK
ffa0: 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
ffb0: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
ffc0: 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
ffd0: 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20 61  al header file a
ffe0: 70 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72  ppears to be cor
fff0: 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44  rupted, SQLITE_D
10000 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  ONE is.** return
10010 65 64 20 61 6e 64 20 2a 70 4e 52 65 63 20 61 6e  ed and *pNRec an
10020 64 20 2a 50 44 62 53 69 7a 65 20 61 72 65 20 75  d *PDbSize are u
10030 6e 64 65 66 69 6e 65 64 2e 20 20 49 66 20 4a 4f  ndefined.  If JO
10040 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
10050 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  es.** cannot be 
10060 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
10070 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72  urnal file an er
10080 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
10090 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
100a0 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  int readJournalH
100b0 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  dr(.  Pager *pPa
100c0 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
100d0 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
100e0 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 48 6f  ct */.  int isHo
100f0 74 2c 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  t,.  i64 journal
10100 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
10110 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
10120 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   open journal fi
10130 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  le in bytes */. 
10140 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 20 20 20   u32 *pNRec,    
10150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10160 20 4f 55 54 3a 20 56 61 6c 75 65 20 72 65 61 64   OUT: Value read
10170 20 66 72 6f 6d 20 74 68 65 20 6e 52 65 63 20 66   from the nRec f
10180 69 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20 2a 70  ield */.  u32 *p
10190 44 62 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  DbSize          
101a0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56         /* OUT: V
101b0 61 6c 75 65 20 6f 66 20 6f 72 69 67 69 6e 61 6c  alue of original
101c0 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66   database size f
101d0 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ield */.){.  int
101e0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
101f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
10200 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e  urn code */.  un
10210 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67  signed char aMag
10220 69 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20 41 20  ic[8];     /* A 
10230 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74  buffer to hold t
10240 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20  he magic header 
10250 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66  */.  i64 iHdrOff
10260 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10270 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 6a    /* Offset of j
10280 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 62 65  ournal header be
10290 69 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61  ing read */..  a
102a0 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
102b0 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20  ager->jfd) );   
102c0 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69     /* Journal fi
102d0 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e  le must be open.
102e0 20 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63   */..  /* Advanc
102f0 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  e Pager.journalO
10300 66 66 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  ff to the start 
10310 6f 66 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  of the next sect
10320 6f 72 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20  or. If the.  ** 
10330 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
10340 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74 68  too small for th
10350 65 72 65 20 74 6f 20 62 65 20 61 20 68 65 61 64  ere to be a head
10360 65 72 20 73 74 6f 72 65 64 20 61 74 20 74 68 69  er stored at thi
10370 73 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c 20 72 65  s.  ** point, re
10380 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
10390 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
103a0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f  >journalOff = jo
103b0 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
103c0 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50  Pager);.  if( pP
103d0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
103e0 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
103f0 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61  pPager) > journa
10400 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74  lSize ){.    ret
10410 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
10420 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d  .  }.  iHdrOff =
10430 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10440 4f 66 66 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20  Off;..  /* Read 
10450 69 6e 20 74 68 65 20 66 69 72 73 74 20 38 20 62  in the first 8 b
10460 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  ytes of the jour
10470 6e 61 6c 20 68 65 61 64 65 72 2e 20 49 66 20 74  nal header. If t
10480 68 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68  hey do not match
10490 0a 20 20 2a 2a 20 74 68 65 20 20 6d 61 67 69 63  .  ** the  magic
104a0 20 73 74 72 69 6e 67 20 66 6f 75 6e 64 20 61 74   string found at
104b0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61   the start of ea
104c0 63 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ch journal heade
104d0 72 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53  r, return.  ** S
104e0 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66 20 61  QLITE_DONE. If a
104f0 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
10500 73 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  s, return an err
10510 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69  or code. Otherwi
10520 73 65 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 65 64  se,.  ** proceed
10530 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 48  ..  */.  if( isH
10540 6f 74 20 7c 7c 20 69 48 64 72 4f 66 66 21 3d 70  ot || iHdrOff!=p
10550 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
10560 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  r ){.    rc = sq
10570 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
10580 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c  er->jfd, aMagic,
10590 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c   sizeof(aMagic),
105a0 20 69 48 64 72 4f 66 66 29 3b 0a 20 20 20 20 69   iHdrOff);.    i
105b0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
105c0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
105d0 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61      if( memcmp(a
105e0 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d  Magic, aJournalM
105f0 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
10600 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  gic))!=0 ){.    
10610 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10620 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  DONE;.    }.  }.
10630 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 66  .  /* Read the f
10640 69 72 73 74 20 74 68 72 65 65 20 33 32 2d 62 69  irst three 32-bi
10650 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  t fields of the 
10660 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 3a 20  journal header: 
10670 54 68 65 20 6e 52 65 63 0a 20 20 2a 2a 20 66 69  The nRec.  ** fi
10680 65 6c 64 2c 20 74 68 65 20 63 68 65 63 6b 73 75  eld, the checksu
10690 6d 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20 61 6e  m-initializer an
106a0 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
106b0 69 7a 65 20 61 74 20 74 68 65 20 73 74 61 72 74  ize at the start
106c0 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 72 61  .  ** of the tra
106d0 6e 73 61 63 74 69 6f 6e 2e 20 52 65 74 75 72 6e  nsaction. Return
106e0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
106f0 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20  f anything goes 
10700 77 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66  wrong..  */.  if
10710 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
10720 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
10730 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
10740 66 66 2b 38 2c 20 70 4e 52 65 63 29 29 0a 20 20  ff+8, pNRec)).  
10750 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
10760 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
10770 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
10780 72 4f 66 66 2b 31 32 2c 20 26 70 50 61 67 65 72  rOff+12, &pPager
10790 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 29 0a 20 20  ->cksumInit)).  
107a0 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
107b0 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
107c0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
107d0 72 4f 66 66 2b 31 36 2c 20 70 44 62 53 69 7a 65  rOff+16, pDbSize
107e0 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  )).  ){.    retu
107f0 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66  rn rc;.  }..  if
10800 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
10810 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 75  lOff==0 ){.    u
10820 33 32 20 69 50 61 67 65 53 69 7a 65 3b 20 20 20  32 iPageSize;   
10830 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
10840 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f  age-size field o
10850 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  f journal header
10860 20 2a 2f 0a 20 20 20 20 75 33 32 20 69 53 65 63   */.    u32 iSec
10870 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  torSize;        
10880 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 2d 73       /* Sector-s
10890 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75  ize field of jou
108a0 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 0a  rnal header */..
108b0 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
108c0 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65  page-size and se
108d0 63 74 6f 72 2d 73 69 7a 65 20 6a 6f 75 72 6e 61  ctor-size journa
108e0 6c 20 68 65 61 64 65 72 20 66 69 65 6c 64 73 2e  l header fields.
108f0 20 2a 2f 0a 20 20 20 20 69 66 28 20 53 51 4c 49   */.    if( SQLI
10900 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
10910 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
10920 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 30 2c  jfd, iHdrOff+20,
10930 20 26 69 53 65 63 74 6f 72 53 69 7a 65 29 29 0a   &iSectorSize)).
10940 20 20 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f       || SQLITE_O
10950 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
10960 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
10970 20 69 48 64 72 4f 66 66 2b 32 34 2c 20 26 69 50   iHdrOff+24, &iP
10980 61 67 65 53 69 7a 65 29 29 0a 20 20 20 20 29 7b  ageSize)).    ){
10990 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
109a0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
109b0 56 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  Versions of SQLi
109c0 74 65 20 70 72 69 6f 72 20 74 6f 20 33 2e 35 2e  te prior to 3.5.
109d0 38 20 73 65 74 20 74 68 65 20 70 61 67 65 2d 73  8 set the page-s
109e0 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ize field of the
109f0 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  .    ** journal 
10a00 68 65 61 64 65 72 20 74 6f 20 7a 65 72 6f 2e 20  header to zero. 
10a10 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 61 73  In this case, as
10a20 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 50 61  sume that the Pa
10a30 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20 20  ger.pageSize.   
10a40 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73 20   ** variable is 
10a50 61 6c 72 65 61 64 79 20 73 65 74 20 74 6f 20 74  already set to t
10a60 68 65 20 63 6f 72 72 65 63 74 20 70 61 67 65 20  he correct page 
10a70 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
10a80 20 69 66 28 20 69 50 61 67 65 53 69 7a 65 3d 3d   if( iPageSize==
10a90 30 20 29 7b 0a 20 20 20 20 20 20 69 50 61 67 65  0 ){.      iPage
10aa0 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Size = pPager->p
10ab0 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 0a  ageSize;.    }..
10ac0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
10ad0 74 20 74 68 65 20 76 61 6c 75 65 73 20 72 65 61  t the values rea
10ae0 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 2d  d from the page-
10af0 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d  size and sector-
10b00 73 69 7a 65 20 66 69 65 6c 64 73 0a 20 20 20 20  size fields.    
10b10 2a 2a 20 61 72 65 20 77 69 74 68 69 6e 20 72 61  ** are within ra
10b20 6e 67 65 2e 20 54 6f 20 62 65 20 27 69 6e 20 72  nge. To be 'in r
10b30 61 6e 67 65 27 2c 20 62 6f 74 68 20 76 61 6c 75  ange', both valu
10b40 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 61 20  es need to be a 
10b50 70 6f 77 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20  power.    ** of 
10b60 74 77 6f 20 67 72 65 61 74 65 72 20 74 68 61 6e  two greater than
10b70 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 35 31 32   or equal to 512
10b80 20 6f 72 20 33 32 2c 20 61 6e 64 20 6e 6f 74 20   or 32, and not 
10b90 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
10ba0 69 72 20 0a 20 20 20 20 2a 2a 20 72 65 73 70 65  ir .    ** respe
10bb0 63 74 69 76 65 20 63 6f 6d 70 69 6c 65 20 74 69  ctive compile ti
10bc0 6d 65 20 6d 61 78 69 6d 75 6d 20 6c 69 6d 69 74  me maximum limit
10bd0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
10be0 28 20 69 50 61 67 65 53 69 7a 65 3c 35 31 32 20  ( iPageSize<512 
10bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c00 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3c   || iSectorSize<
10c10 33 32 0a 20 20 20 20 20 7c 7c 20 69 50 61 67 65  32.     || iPage
10c20 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
10c30 50 41 47 45 5f 53 49 5a 45 20 7c 7c 20 69 53 65  PAGE_SIZE || iSe
10c40 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43  ctorSize>MAX_SEC
10c50 54 4f 52 5f 53 49 5a 45 0a 20 20 20 20 20 7c 7c  TOR_SIZE.     ||
10c60 20 28 28 69 50 61 67 65 53 69 7a 65 2d 31 29 26   ((iPageSize-1)&
10c70 69 50 61 67 65 53 69 7a 65 29 21 3d 30 20 20 20  iPageSize)!=0   
10c80 7c 7c 20 28 28 69 53 65 63 74 6f 72 53 69 7a 65  || ((iSectorSize
10c90 2d 31 29 26 69 53 65 63 74 6f 72 53 69 7a 65 29  -1)&iSectorSize)
10ca0 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  !=0 .    ){.    
10cb0 20 20 2f 2a 20 49 66 20 74 68 65 20 65 69 74 68    /* If the eith
10cc0 65 72 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  er the page-size
10cd0 20 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a 65 20   or sector-size 
10ce0 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68  in the journal-h
10cf0 65 61 64 65 72 20 69 73 20 0a 20 20 20 20 20 20  eader is .      
10d00 2a 2a 20 69 6e 76 61 6c 69 64 2c 20 74 68 65 6e  ** invalid, then
10d10 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
10d20 74 20 77 72 6f 74 65 20 74 68 65 20 6a 6f 75 72  t wrote the jour
10d30 6e 61 6c 2d 68 65 61 64 65 72 20 6d 75 73 74 20  nal-header must 
10d40 68 61 76 65 20 0a 20 20 20 20 20 20 2a 2a 20 63  have .      ** c
10d50 72 61 73 68 65 64 20 62 65 66 6f 72 65 20 74 68  rashed before th
10d60 65 20 68 65 61 64 65 72 20 77 61 73 20 73 79 6e  e header was syn
10d70 63 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ced. In this cas
10d80 65 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20 0a  e stop reading .
10d90 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75        ** the jou
10da0 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 0a  rnal file here..
10db0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
10dc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
10dd0 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  E;.    }..    /*
10de0 20 55 70 64 61 74 65 20 74 68 65 20 70 61 67 65   Update the page
10df0 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74  -size to match t
10e00 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
10e10 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  om the journal. 
10e20 0a 20 20 20 20 2a 2a 20 55 73 65 20 61 20 74 65  .    ** Use a te
10e30 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f 20 74  stcase() macro t
10e40 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
10e50 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
10e60 77 69 74 68 69 6e 20 0a 20 20 20 20 2a 2a 20 50  within .    ** P
10e70 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
10e80 29 20 69 73 20 74 65 73 74 65 64 2e 0a 20 20 20  ) is tested..   
10e90 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
10ea0 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
10eb0 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26 69 50  size(pPager, &iP
10ec0 61 67 65 53 69 7a 65 2c 20 2d 31 29 3b 0a 20 20  ageSize, -1);.  
10ed0 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
10ee0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
10ef0 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
10f00 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73  assumed sector-s
10f10 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65  ize to match the
10f20 20 76 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a   value used by .
10f30 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65      ** the proce
10f40 73 73 20 74 68 61 74 20 63 72 65 61 74 65 64 20  ss that created 
10f50 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  this journal. If
10f60 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61   this journal wa
10f70 73 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64  s.    ** created
10f80 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 6f 74   by a process ot
10f90 68 65 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e  her than this on
10fa0 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  e, then this rou
10fb0 74 69 6e 65 0a 20 20 20 20 2a 2a 20 69 73 20 62  tine.    ** is b
10fc0 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d  eing called from
10fd0 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70 6c   within pager_pl
10fe0 61 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f  ayback(). The lo
10ff0 63 61 6c 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a  cal value.    **
11000 20 6f 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72   of Pager.sector
11010 53 69 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64  Size is restored
11020 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
11030 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 20  hat routine..   
11040 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
11050 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 69 53 65  sectorSize = iSe
11060 63 74 6f 72 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20  ctorSize;.  }.. 
11070 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
11080 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48  Off += JOURNAL_H
11090 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
110a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
110b0 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  /*.** Write the 
110c0 73 75 70 70 6c 69 65 64 20 6d 61 73 74 65 72 20  supplied master 
110d0 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74  journal name int
110e0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
110f0 6c 65 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20  le for pager.** 
11100 70 50 61 67 65 72 20 61 74 20 74 68 65 20 63 75  pPager at the cu
11110 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20  rrent location. 
11120 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
11130 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20  al name must be 
11140 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e  the last.** thin
11150 67 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20 6a  g written to a j
11160 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
11170 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
11180 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  full-sync mode, 
11190 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
111a0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
111b0 73 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68  s advanced to th
111c0 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f  e next sector bo
111d0 75 6e 64 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a  undary before.**
111e0 20 61 6e 79 74 68 69 6e 67 20 69 73 20 77 72 69   anything is wri
111f0 74 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74  tten. The format
11200 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 34   is:.**.**   + 4
11210 20 62 79 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a   bytes: PAGER_MJ
11220 5f 50 47 4e 4f 2e 0a 2a 2a 20 20 20 2b 20 4e 20  _PGNO..**   + N 
11230 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f  bytes: Master jo
11240 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69  urnal filename i
11250 6e 20 75 74 66 2d 38 2e 0a 2a 2a 20 20 20 2b 20  n utf-8..**   + 
11260 34 20 62 79 74 65 73 3a 20 4e 20 28 6c 65 6e 67  4 bytes: N (leng
11270 74 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  th of master jou
11280 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 20 62 79 74  rnal name in byt
11290 65 73 2c 20 6e 6f 20 6e 75 6c 2d 74 65 72 6d 69  es, no nul-termi
112a0 6e 61 74 6f 72 29 2e 0a 2a 2a 20 20 20 2b 20 34  nator)..**   + 4
112b0 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a   bytes: Master j
112c0 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63  ournal name chec
112d0 6b 73 75 6d 2e 0a 2a 2a 20 20 20 2b 20 38 20 62  ksum..**   + 8 b
112e0 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61  ytes: aJournalMa
112f0 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  gic[]..**.** The
11300 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
11310 70 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69 73  page checksum is
11320 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
11330 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73  bytes in the mas
11340 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e  ter.** journal n
11350 61 6d 65 2c 20 77 68 65 72 65 20 65 61 63 68 20  ame, where each 
11360 62 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65  byte is interpre
11370 74 65 64 20 61 73 20 61 20 73 69 67 6e 65 64 20  ted as a signed 
11380 38 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 0a 2a  8-bit integer..*
11390 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72 20  *.** If zMaster 
113a0 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  is a NULL pointe
113b0 72 20 28 6f 63 63 75 72 73 20 66 6f 72 20 61 20  r (occurs for a 
113c0 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
113d0 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a  transaction), .*
113e0 2a 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61  * this call is a
113f0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
11400 63 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74 65  c int writeMaste
11410 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  rJournal(Pager *
11420 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68  pPager, const ch
11430 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
11440 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
11450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11460 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
11470 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65 72  */.  int nMaster
11480 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11490 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
114a0 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65  of string zMaste
114b0 72 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f  r */.  i64 iHdrO
114c0 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
114d0 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
114e0 74 20 6f 66 20 68 65 61 64 65 72 20 69 6e 20 6a  t of header in j
114f0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
11500 20 69 36 34 20 6a 72 6e 6c 53 69 7a 65 3b 20 20   i64 jrnlSize;  
11510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11520 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75    /* Size of jou
11530 72 6e 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73  rnal file on dis
11540 6b 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  k */.  u32 cksum
11550 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
11560 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
11570 73 75 6d 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d  sum of string zM
11580 61 73 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65  aster */..  asse
11590 72 74 28 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  rt( pPager->setM
115a0 61 73 74 65 72 3d 3d 30 20 29 3b 0a 20 20 61 73  aster==0 );.  as
115b0 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
115c0 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  al(pPager) );.. 
115d0 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 0a 20   if( !zMaster . 
115e0 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75    || pPager->jou
115f0 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
11600 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
11610 52 59 20 0a 20 20 20 7c 7c 20 21 69 73 4f 70 65  RY .   || !isOpe
11620 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 0a 20  n(pPager->jfd). 
11630 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
11640 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
11650 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
11660 72 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28  r = 1;.  assert(
11670 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
11680 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a  Hdr <= pPager->j
11690 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 0a 20 20  ournalOff );..  
116a0 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 74 68 65  /* Calculate the
116b0 20 6c 65 6e 67 74 68 20 69 6e 20 62 79 74 65 73   length in bytes
116c0 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73 75   and the checksu
116d0 6d 20 6f 66 20 7a 4d 61 73 74 65 72 20 2a 2f 0a  m of zMaster */.
116e0 20 20 66 6f 72 28 6e 4d 61 73 74 65 72 3d 30 3b    for(nMaster=0;
116f0 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72   zMaster[nMaster
11700 5d 3b 20 6e 4d 61 73 74 65 72 2b 2b 29 7b 0a 20  ]; nMaster++){. 
11710 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73     cksum += zMas
11720 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 0a 20 20  ter[nMaster];.  
11730 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75  }..  /* If in fu
11740 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64  ll-sync mode, ad
11750 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78  vance to the nex
11760 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65  t disk sector be
11770 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a  fore writing.  *
11780 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * the master jou
11790 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20  rnal name. This 
117a0 69 73 20 69 6e 20 63 61 73 65 20 74 68 65 20 70  is in case the p
117b0 72 65 76 69 6f 75 73 20 70 61 67 65 20 77 72 69  revious page wri
117c0 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65  tten to.  ** the
117d0 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72   journal has alr
117e0 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64  eady been synced
117f0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
11800 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b  ger->fullSync ){
11810 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
11820 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61  rnalOff = journa
11830 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
11840 72 29 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66  r);.  }.  iHdrOf
11850 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f = pPager->jour
11860 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57 72  nalOff;..  /* Wr
11870 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ite the master j
11880 6f 75 72 6e 61 6c 20 64 61 74 61 20 74 6f 20 74  ournal data to t
11890 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f  he end of the jo
118a0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 0a 20  urnal file. If. 
118b0 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   ** an error occ
118c0 75 72 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20  urs, return the 
118d0 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68  error code to th
118e0 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20  e caller..  */. 
118f0 20 69 66 28 20 28 30 20 21 3d 20 28 72 63 20 3d   if( (0 != (rc =
11900 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
11910 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
11920 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  f, PAGER_MJ_PGNO
11930 28 70 50 61 67 65 72 29 29 29 29 0a 20 20 20 7c  (pPager)))).   |
11940 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71  | (0 != (rc = sq
11950 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
11960 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
11970 72 2c 20 6e 4d 61 73 74 65 72 2c 20 69 48 64 72  r, nMaster, iHdr
11980 4f 66 66 2b 34 29 29 29 0a 20 20 20 7c 7c 20 28  Off+4))).   || (
11990 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65  0 != (rc = write
119a0 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
119b0 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d  fd, iHdrOff+4+nM
119c0 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 29 29  aster, nMaster))
119d0 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72  ).   || (0 != (r
119e0 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
119f0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
11a00 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 34  rOff+4+nMaster+4
11a10 2c 20 63 6b 73 75 6d 29 29 29 0a 20 20 20 7c 7c  , cksum))).   ||
11a20 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c   (0 != (rc = sql
11a30 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
11a40 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61  er->jfd, aJourna
11a50 6c 4d 61 67 69 63 2c 20 38 2c 0a 20 20 20 20 20  lMagic, 8,.     
11a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a70 20 20 20 20 20 20 20 20 20 20 20 20 69 48 64 72              iHdr
11a80 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 38 29  Off+4+nMaster+8)
11a90 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  )).  ){.    retu
11aa0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61  rn rc;.  }.  pPa
11ab0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
11ac0 2b 3d 20 28 6e 4d 61 73 74 65 72 2b 32 30 29 3b  += (nMaster+20);
11ad0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
11ae0 67 65 72 20 69 73 20 69 6e 20 70 65 72 69 73 74  ger is in perist
11af0 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65  ent-journal mode
11b00 2c 20 74 68 65 6e 20 74 68 65 20 70 68 79 73 69  , then the physi
11b10 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  cal .  ** journa
11b20 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78 74 65 6e  l-file may exten
11b30 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  d past the end o
11b40 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75  f the master-jou
11b50 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20 61  rnal name.  ** a
11b60 6e 64 20 38 20 62 79 74 65 73 20 6f 66 20 6d 61  nd 8 bytes of ma
11b70 67 69 63 20 64 61 74 61 20 6a 75 73 74 20 77 72  gic data just wr
11b80 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 69 6c  itten to the fil
11b90 65 2e 20 54 68 69 73 20 69 73 20 0a 20 20 2a 2a  e. This is .  **
11ba0 20 64 61 6e 67 65 72 6f 75 73 20 62 65 63 61 75   dangerous becau
11bb0 73 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72  se the code to r
11bc0 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f  ollback a hot-jo
11bd0 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20  urnal file.  ** 
11be0 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65  will not be able
11bf0 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 61 73   to find the mas
11c00 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter-journal name
11c10 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a 20   to determine . 
11c20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e   ** whether or n
11c30 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ot the journal i
11c40 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a  s hot. .  **.  *
11c50 2a 20 45 61 73 69 65 73 74 20 74 68 69 6e 67 20  * Easiest thing 
11c60 74 6f 20 64 6f 20 69 6e 20 74 68 69 73 20 73 63  to do in this sc
11c70 65 6e 61 72 69 6f 20 69 73 20 74 6f 20 74 72 75  enario is to tru
11c80 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  ncate the journa
11c90 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74 6f 20  l .  ** file to 
11ca0 74 68 65 20 72 65 71 75 69 72 65 64 20 73 69 7a  the required siz
11cb0 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 53  e..  */ .  if( S
11cc0 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20  QLITE_OK==(rc = 
11cd0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
11ce0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
11cf0 6a 72 6e 6c 53 69 7a 65 29 29 0a 20 20 20 26 26  jrnlSize)).   &&
11d00 20 6a 72 6e 6c 53 69 7a 65 3e 70 50 61 67 65 72   jrnlSize>pPager
11d10 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 29  ->journalOff.  )
11d20 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
11d30 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
11d40 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
11d50 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20  ->journalOff);. 
11d60 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
11d70 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72 64  }../*.** Discard
11d80 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
11d90 65 6e 74 73 20 6f 66 20 74 68 65 20 69 6e 2d 6d  ents of the in-m
11da0 65 6d 6f 72 79 20 70 61 67 65 2d 63 61 63 68 65  emory page-cache
11db0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11dc0 20 70 61 67 65 72 5f 72 65 73 65 74 28 50 61 67   pager_reset(Pag
11dd0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 70  er *pPager){.  p
11de0 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73  Pager->iDataVers
11df0 69 6f 6e 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33  ion++;.  sqlite3
11e00 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 70 50  BackupRestart(pP
11e10 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a  ager->pBackup);.
11e20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
11e30 6c 65 61 72 28 70 50 61 67 65 72 2d 3e 70 50 43  lear(pPager->pPC
11e40 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ache);.}../*.** 
11e50 52 65 74 75 72 6e 20 74 68 65 20 70 50 61 67 65  Return the pPage
11e60 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 20  r->iDataVersion 
11e70 76 61 6c 75 65 0a 2a 2f 0a 75 33 32 20 73 71 6c  value.*/.u32 sql
11e80 69 74 65 33 50 61 67 65 72 44 61 74 61 56 65 72  ite3PagerDataVer
11e90 73 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67  sion(Pager *pPag
11ea0 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  er){.  assert( p
11eb0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50 41  Pager->eState>PA
11ec0 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 72 65  GER_OPEN );.  re
11ed0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 69 44 61  turn pPager->iDa
11ee0 74 61 56 65 72 73 69 6f 6e 3b 0a 7d 0a 0a 2f 2a  taVersion;.}../*
11ef0 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 73 74 72  .** Free all str
11f00 75 63 74 75 72 65 73 20 69 6e 20 74 68 65 20 50  uctures in the P
11f10 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 5b  ager.aSavepoint[
11f20 5d 20 61 72 72 61 79 20 61 6e 64 20 73 65 74 20  ] array and set 
11f30 62 6f 74 68 0a 2a 2a 20 50 61 67 65 72 2e 61 53  both.** Pager.aS
11f40 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 50 61 67  avepoint and Pag
11f50 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 20 74 6f  er.nSavepoint to
11f60 20 7a 65 72 6f 2e 20 43 6c 6f 73 65 20 74 68 65   zero. Close the
11f70 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   sub-journal.** 
11f80 69 66 20 69 74 20 69 73 20 6f 70 65 6e 20 61 6e  if it is open an
11f90 64 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e  d the pager is n
11fa0 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ot in exclusive 
11fb0 6d 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mode..*/.static 
11fc0 76 6f 69 64 20 72 65 6c 65 61 73 65 41 6c 6c 53  void releaseAllS
11fd0 61 76 65 70 6f 69 6e 74 73 28 50 61 67 65 72 20  avepoints(Pager 
11fe0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
11ff0 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
12000 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f    /* Iterator fo
12010 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67  r looping throug
12020 68 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  h Pager.aSavepoi
12030 6e 74 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30  nt */.  for(ii=0
12040 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61  ; ii<pPager->nSa
12050 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a  vepoint; ii++){.
12060 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
12070 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
12080 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e  >aSavepoint[ii].
12090 70 49 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  pInSavepoint);. 
120a0 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 72   }.  if( !pPager
120b0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
120c0 7c 7c 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61  || sqlite3Journa
120d0 6c 49 73 49 6e 4d 65 6d 6f 72 79 28 70 50 61 67  lIsInMemory(pPag
120e0 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20  er->sjfd) ){.   
120f0 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
12100 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20  pPager->sjfd);. 
12110 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
12120 65 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70  e(pPager->aSavep
12130 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67 65 72 2d  oint);.  pPager-
12140 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b  >aSavepoint = 0;
12150 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  .  pPager->nSave
12160 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61  point = 0;.  pPa
12170 67 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30  ger->nSubRec = 0
12180 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
12190 68 65 20 62 69 74 20 6e 75 6d 62 65 72 20 70 67  he bit number pg
121a0 6e 6f 20 69 6e 20 74 68 65 20 50 61 67 65 72 53  no in the PagerS
121b0 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65  avepoint.pInSave
121c0 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65 63  point .** bitvec
121d0 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73 61  s of all open sa
121e0 76 65 70 6f 69 6e 74 73 2e 20 52 65 74 75 72 6e  vepoints. Return
121f0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75   SQLITE_OK if su
12200 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20 53  ccessful.** or S
12210 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61  QLITE_NOMEM if a
12220 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
12230 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  occurs..*/.stati
12240 63 20 69 6e 74 20 61 64 64 54 6f 53 61 76 65 70  c int addToSavep
12250 6f 69 6e 74 42 69 74 76 65 63 73 28 50 61 67 65  ointBitvecs(Page
12260 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
12270 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69 3b  pgno){.  int ii;
12280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12290 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
122a0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  er */.  int rc =
122b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
122c0 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
122d0 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b   */..  for(ii=0;
122e0 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76   ii<pPager->nSav
122f0 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20  epoint; ii++){. 
12300 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
12310 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d 3e  t *p = &pPager->
12320 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a  aSavepoint[ii];.
12330 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 2d      if( pgno<=p-
12340 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20  >nOrig ){.      
12350 72 63 20 7c 3d 20 73 71 6c 69 74 65 33 42 69 74  rc |= sqlite3Bit
12360 76 65 63 53 65 74 28 70 2d 3e 70 49 6e 53 61 76  vecSet(p->pInSav
12370 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20  epoint, pgno);. 
12380 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
12390 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
123a0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
123b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
123c0 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  | rc==SQLITE_NOM
123d0 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  EM );.    }.  }.
123e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
123f0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45  #ifdef SQLITE_SE
12400 52 56 45 52 5f 45 44 49 54 49 4f 4e 0a 2f 2a 0a  RVER_EDITION./*.
12410 2a 2a 20 46 72 65 65 20 74 68 65 20 6c 69 6e 6b  ** Free the link
12420 65 64 20 6c 69 73 74 20 6f 66 20 53 65 72 76 65  ed list of Serve
12430 72 50 61 67 65 20 6f 62 6a 65 63 74 73 20 68 65  rPage objects he
12440 61 64 65 64 20 61 74 20 50 61 67 65 72 2e 70 53  aded at Pager.pS
12450 65 72 76 65 72 50 61 67 65 2e 0a 2a 2f 0a 73 74  erverPage..*/.st
12460 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 46  atic void pagerF
12470 72 65 65 53 65 72 76 65 72 50 61 67 65 28 50 61  reeServerPage(Pa
12480 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
12490 53 65 72 76 65 72 50 61 67 65 20 2a 70 50 67 3b  ServerPage *pPg;
124a0 0a 20 20 53 65 72 76 65 72 50 61 67 65 20 2a 70  .  ServerPage *p
124b0 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 50 67 3d  Next;.  for(pPg=
124c0 70 50 61 67 65 72 2d 3e 70 53 65 72 76 65 72 50  pPager->pServerP
124d0 61 67 65 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e  age; pPg; pPg=pN
124e0 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20  ext){.    pNext 
124f0 3d 20 70 50 67 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pPg->pNext;.  
12500 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
12510 50 67 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  Pg);.  }.  pPage
12520 72 2d 3e 70 53 65 72 76 65 72 50 61 67 65 20 3d  r->pServerPage =
12530 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   0;.}.#endif../*
12540 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
12550 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  n is a no-op if 
12560 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
12570 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61  exclusive mode a
12580 6e 64 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65  nd not.** in the
12590 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 4f 74   ERROR state. Ot
125a0 68 65 72 77 69 73 65 2c 20 69 74 20 73 77 69 74  herwise, it swit
125b0 63 68 65 73 20 74 68 65 20 70 61 67 65 72 20 74  ches the pager t
125c0 6f 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20  o PAGER_OPEN.** 
125d0 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  state..**.** If 
125e0 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74  the pager is not
125f0 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63   in exclusive-ac
12600 63 65 73 73 20 6d 6f 64 65 2c 20 74 68 65 20 64  cess mode, the d
12610 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a  atabase file is.
12620 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20 75 6e  ** completely un
12630 6c 6f 63 6b 65 64 2e 20 49 66 20 74 68 65 20 66  locked. If the f
12640 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20  ile is unlocked 
12650 61 6e 64 20 74 68 65 20 66 69 6c 65 2d 73 79 73  and the file-sys
12660 74 65 6d 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20  tem does.** not 
12670 65 78 68 69 62 69 74 20 74 68 65 20 55 4e 44 45  exhibit the UNDE
12680 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45  LETABLE_WHEN_OPE
12690 4e 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 20  N property, the 
126a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a  journal file is.
126b0 2a 2a 20 63 6c 6f 73 65 64 20 28 69 66 20 69 74  ** closed (if it
126c0 20 69 73 20 6f 70 65 6e 29 2e 0a 2a 2a 0a 2a 2a   is open)..**.**
126d0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
126e0 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20   in ERROR state 
126f0 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
12700 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  on is called, th
12710 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f  e .** contents o
12720 66 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  f the pager cach
12730 65 20 61 72 65 20 64 69 73 63 61 72 64 65 64 20  e are discarded 
12740 62 65 66 6f 72 65 20 73 77 69 74 63 68 69 6e 67  before switching
12750 20 62 61 63 6b 20 74 6f 20 0a 2a 2a 20 74 68 65   back to .** the
12760 20 4f 50 45 4e 20 73 74 61 74 65 2e 20 52 65 67   OPEN state. Reg
12770 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
12780 65 72 20 74 68 65 20 70 61 67 65 72 20 69 73 20  er the pager is 
12790 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64  in exclusive-mod
127a0 65 0a 2a 2a 20 6f 72 20 6e 6f 74 2c 20 61 6e 79  e.** or not, any
127b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6c 65   journal file le
127c0 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  ft in the file-s
127d0 79 73 74 65 6d 20 77 69 6c 6c 20 62 65 20 74 72  ystem will be tr
127e0 65 61 74 65 64 0a 2a 2a 20 61 73 20 61 20 68 6f  eated.** as a ho
127f0 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f  t-journal and ro
12800 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 6e 65  lled back the ne
12810 78 74 20 74 69 6d 65 20 61 20 72 65 61 64 2d 74  xt time a read-t
12820 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73  ransaction.** is
12830 20 6f 70 65 6e 65 64 20 28 62 79 20 74 68 69 73   opened (by this
12840 20 6f 72 20 62 79 20 61 6e 79 20 6f 74 68 65 72   or by any other
12850 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0a 2a 2f   connection)..*/
12860 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
12870 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20  er_unlock(Pager 
12880 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20 61 73 73  *pPager){..  ass
12890 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
128a0 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
128b0 52 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61  R .       || pPa
128c0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
128d0 45 52 5f 4f 50 45 4e 20 0a 20 20 20 20 20 20 20  ER_OPEN .       
128e0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
128f0 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 0a  e==PAGER_ERROR .
12900 20 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42    );..  sqlite3B
12910 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
12920 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29  ger->pInJournal)
12930 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  ;.  pPager->pInJ
12940 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65  ournal = 0;.  re
12950 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e  leaseAllSavepoin
12960 74 73 28 70 50 61 67 65 72 29 3b 0a 0a 23 69 66  ts(pPager);..#if
12970 64 65 66 20 53 51 4c 49 54 45 5f 53 45 52 56 45  def SQLITE_SERVE
12980 52 5f 45 44 49 54 49 4f 4e 0a 20 20 69 66 28 20  R_EDITION.  if( 
12990 70 61 67 65 72 49 73 53 65 72 76 65 72 28 70 50  pagerIsServer(pP
129a0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 70 61 67  ager) ){.    pag
129b0 65 72 46 72 65 65 53 65 72 76 65 72 50 61 67 65  erFreeServerPage
129c0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 73 71  (pPager);.    sq
129d0 6c 69 74 65 33 53 65 72 76 65 72 45 6e 64 28 70  lite3ServerEnd(p
129e0 50 61 67 65 72 2d 3e 70 53 65 72 76 65 72 29 3b  Pager->pServer);
129f0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
12a00 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e  ate = PAGER_OPEN
12a10 3b 0a 20 20 7d 65 6c 73 65 20 0a 23 65 6e 64 69  ;.  }else .#endi
12a20 66 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  f.  if( pagerUse
12a30 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
12a40 20 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70     assert( !isOp
12a50 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
12a60 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61  );.    sqlite3Wa
12a70 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74  lEndReadTransact
12a80 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ion(pPager->pWal
12a90 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  );.    pPager->e
12aa0 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50  State = PAGER_OP
12ab0 45 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  EN;.  }else if( 
12ac0 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
12ad0 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e  veMode ){.    in
12ae0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
12af0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
12b00 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e  rror code return
12b10 65 64 20 62 79 20 70 61 67 65 72 55 6e 6c 6f 63  ed by pagerUnloc
12b20 6b 44 62 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74  kDb() */.    int
12b30 20 69 44 63 20 3d 20 69 73 4f 70 65 6e 28 70 50   iDc = isOpen(pP
12b40 61 67 65 72 2d 3e 66 64 29 3f 73 71 6c 69 74 65  ager->fd)?sqlite
12b50 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
12b60 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
12b70 3e 66 64 29 3a 30 3b 0a 0a 20 20 20 20 2f 2a 20  >fd):0;..    /* 
12b80 49 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  If the operating
12b90 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20   system support 
12ba0 64 65 6c 65 74 69 6f 6e 20 6f 66 20 6f 70 65 6e  deletion of open
12bb0 20 66 69 6c 65 73 2c 20 74 68 65 6e 0a 20 20 20   files, then.   
12bc0 20 2a 2a 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f   ** close the jo
12bd0 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20  urnal file when 
12be0 64 72 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74  dropping the dat
12bf0 61 62 61 73 65 20 6c 6f 63 6b 2e 20 20 4f 74 68  abase lock.  Oth
12c00 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 6e  erwise.    ** an
12c10 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
12c20 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f   with journal_mo
12c30 64 65 3d 64 65 6c 65 74 65 20 6d 69 67 68 74 20  de=delete might 
12c40 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 0a  delete the file.
12c50 20 20 20 20 2a 2a 20 6f 75 74 20 66 72 6f 6d 20      ** out from 
12c60 75 6e 64 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f  under us..    */
12c70 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41  .    assert( (PA
12c80 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
12c90 4d 45 4d 4f 52 59 20 20 20 26 20 35 29 21 3d 31  MEMORY   & 5)!=1
12ca0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
12cb0 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  (PAGER_JOURNALMO
12cc0 44 45 5f 4f 46 46 20 20 20 20 20 20 26 20 35 29  DE_OFF      & 5)
12cd0 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=1 );.    asser
12ce0 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
12cf0 4c 4d 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 26  LMODE_WAL      &
12d00 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73   5)!=1 );.    as
12d10 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
12d20 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20  RNALMODE_DELETE 
12d30 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20    & 5)!=1 );.   
12d40 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
12d50 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
12d60 43 41 54 45 20 26 20 35 29 3d 3d 31 20 29 3b 0a  CATE & 5)==1 );.
12d70 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
12d80 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
12d90 45 52 53 49 53 54 20 20 26 20 35 29 3d 3d 31 20  ERSIST  & 5)==1 
12da0 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 69  );.    if( 0==(i
12db0 44 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 43 41  Dc & SQLITE_IOCA
12dc0 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48  P_UNDELETABLE_WH
12dd0 45 4e 5f 4f 50 45 4e 29 0a 20 20 20 20 20 7c 7c  EN_OPEN).     ||
12de0 20 31 21 3d 28 70 50 61 67 65 72 2d 3e 6a 6f 75   1!=(pPager->jou
12df0 72 6e 61 6c 4d 6f 64 65 20 26 20 35 29 0a 20 20  rnalMode & 5).  
12e00 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74    ){.      sqlit
12e10 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
12e20 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20  ->jfd);.    }.. 
12e30 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67     /* If the pag
12e40 65 72 20 69 73 20 69 6e 20 74 68 65 20 45 52 52  er is in the ERR
12e50 4f 52 20 73 74 61 74 65 20 61 6e 64 20 74 68 65  OR state and the
12e60 20 63 61 6c 6c 20 74 6f 20 75 6e 6c 6f 63 6b 20   call to unlock 
12e70 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
12e80 20 2a 2a 20 66 69 6c 65 20 66 61 69 6c 73 2c 20   ** file fails, 
12e90 73 65 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  set the current 
12ea0 6c 6f 63 6b 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f  lock to UNKNOWN_
12eb0 4c 4f 43 4b 2e 20 53 65 65 20 74 68 65 20 63 6f  LOCK. See the co
12ec0 6d 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 61 62 6f  mment.    ** abo
12ed0 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 66  ve the #define f
12ee0 6f 72 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  or UNKNOWN_LOCK 
12ef0 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69  for an explanati
12f00 6f 6e 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20  on of why this. 
12f10 20 20 20 2a 2a 20 69 73 20 6e 65 63 65 73 73 61     ** is necessa
12f20 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ry..    */.    r
12f30 63 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44  c = pagerUnlockD
12f40 62 28 70 50 61 67 65 72 2c 20 4e 4f 5f 4c 4f 43  b(pPager, NO_LOC
12f50 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  K);.    if( rc!=
12f60 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
12f70 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
12f80 45 52 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20  ER_ERROR ){.    
12f90 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20    pPager->eLock 
12fa0 3d 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a  = UNKNOWN_LOCK;.
12fb0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
12fc0 65 20 70 61 67 65 72 20 73 74 61 74 65 20 6d 61  e pager state ma
12fd0 79 20 62 65 20 63 68 61 6e 67 65 64 20 66 72 6f  y be changed fro
12fe0 6d 20 50 41 47 45 52 5f 45 52 52 4f 52 20 74 6f  m PAGER_ERROR to
12ff0 20 50 41 47 45 52 5f 4f 50 45 4e 20 68 65 72 65   PAGER_OPEN here
13000 0a 20 20 20 20 2a 2a 20 77 69 74 68 6f 75 74 20  .    ** without 
13010 63 6c 65 61 72 69 6e 67 20 74 68 65 20 65 72 72  clearing the err
13020 6f 72 20 63 6f 64 65 2e 20 54 68 69 73 20 69 73  or code. This is
13030 20 69 6e 74 65 6e 74 69 6f 6e 61 6c 20 2d 20 74   intentional - t
13040 68 65 20 65 72 72 6f 72 0a 20 20 20 20 2a 2a 20  he error.    ** 
13050 63 6f 64 65 20 69 73 20 63 6c 65 61 72 65 64 20  code is cleared 
13060 61 6e 64 20 74 68 65 20 63 61 63 68 65 20 72 65  and the cache re
13070 73 65 74 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b  set in the block
13080 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20   below..    */. 
13090 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
130a0 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 70 50  r->errCode || pP
130b0 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
130c0 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 20  GER_ERROR );.   
130d0 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
130e0 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20  ountDone = 0;.  
130f0 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
13100 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20   = PAGER_OPEN;. 
13110 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 50 61 67 65   }..  /* If Page
13120 72 2e 65 72 72 43 6f 64 65 20 69 73 20 73 65 74  r.errCode is set
13130 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  , the contents o
13140 66 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  f the pager cach
13150 65 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20 2a 2a  e cannot be.  **
13160 20 74 72 75 73 74 65 64 2e 20 4e 6f 77 20 74 68   trusted. Now th
13170 61 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  at there are no 
13180 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
13190 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
131a0 67 65 72 2c 0a 20 20 2a 2a 20 69 74 20 63 61 6e  ger,.  ** it can
131b0 20 73 61 66 65 6c 79 20 6d 6f 76 65 20 62 61 63   safely move bac
131c0 6b 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20  k to PAGER_OPEN 
131d0 73 74 61 74 65 2e 20 54 68 69 73 20 68 61 70 70  state. This happ
131e0 65 6e 73 20 69 6e 20 62 6f 74 68 0a 20 20 2a 2a  ens in both.  **
131f0 20 6e 6f 72 6d 61 6c 20 61 6e 64 20 65 78 63 6c   normal and excl
13200 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f  usive-locking mo
13210 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  de..  */.  asser
13220 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  t( pPager->errCo
13230 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  de==SQLITE_OK ||
13240 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28   !MEMDB );.  if(
13250 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
13260 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
13270 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20  er->tempFile==0 
13280 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72  ){.      pager_r
13290 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
132a0 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e      pPager->chan
132b0 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b  geCountDone = 0;
132c0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65  .      pPager->e
132d0 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50  State = PAGER_OP
132e0 45 4e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EN;.    }else{. 
132f0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74       pPager->eSt
13300 61 74 65 20 3d 20 28 69 73 4f 70 65 6e 28 70 50  ate = (isOpen(pP
13310 61 67 65 72 2d 3e 6a 66 64 29 20 3f 20 50 41 47  ager->jfd) ? PAG
13320 45 52 5f 4f 50 45 4e 20 3a 20 50 41 47 45 52 5f  ER_OPEN : PAGER_
13330 52 45 41 44 45 52 29 3b 0a 20 20 20 20 7d 0a 20  READER);.    }. 
13340 20 20 20 69 66 28 20 55 53 45 46 45 54 43 48 28     if( USEFETCH(
13350 70 50 61 67 65 72 29 20 29 20 73 71 6c 69 74 65  pPager) ) sqlite
13360 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65  3OsUnfetch(pPage
13370 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20  r->fd, 0, 0);.  
13380 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
13390 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  e = SQLITE_OK;. 
133a0 20 20 20 73 65 74 47 65 74 74 65 72 4d 65 74 68     setGetterMeth
133b0 6f 64 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  od(pPager);.  }.
133c0 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
133d0 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61  alOff = 0;.  pPa
133e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
133f0 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  = 0;.  pPager->s
13400 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 7d 0a  etMaster = 0;.}.
13410 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
13420 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77  tion is called w
13430 68 65 6e 65 76 65 72 20 61 6e 20 49 4f 45 52 52  henever an IOERR
13440 20 6f 72 20 46 55 4c 4c 20 65 72 72 6f 72 20 74   or FULL error t
13450 68 61 74 20 72 65 71 75 69 72 65 73 0a 2a 2a 20  hat requires.** 
13460 74 68 65 20 70 61 67 65 72 20 74 6f 20 74 72 61  the pager to tra
13470 6e 73 69 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65  nsition into the
13480 20 45 52 52 4f 52 20 73 74 61 74 65 20 6d 61 79   ERROR state may
13490 20 61 68 76 65 20 6f 63 63 75 72 72 65 64 2e 0a   ahve occurred..
134a0 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67  ** The first arg
134b0 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74  ument is a point
134c0 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 72 20  er to the pager 
134d0 73 74 72 75 63 74 75 72 65 2c 20 74 68 65 20 73  structure, the s
134e0 65 63 6f 6e 64 20 0a 2a 2a 20 74 68 65 20 65 72  econd .** the er
134f0 72 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74  ror-code about t
13500 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  o be returned by
13510 20 61 20 70 61 67 65 72 20 41 50 49 20 66 75 6e   a pager API fun
13520 63 74 69 6f 6e 2e 20 54 68 65 20 0a 2a 2a 20 76  ction. The .** v
13530 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
13540 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73   a copy of the s
13550 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
13560 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  o this function.
13570 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73   .**.** If the s
13580 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
13590 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 53  s SQLITE_FULL, S
135a0 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 6f  QLITE_IOERR or o
135b0 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4f 45  ne of the.** IOE
135c0 52 52 20 73 75 62 2d 63 6f 64 65 73 2c 20 74 68  RR sub-codes, th
135d0 65 20 70 61 67 65 72 20 65 6e 74 65 72 73 20 74  e pager enters t
135e0 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 61  he ERROR state a
135f0 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  nd the error cod
13600 65 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 69  e.** is stored i
13610 6e 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e  n Pager.errCode.
13620 20 57 68 69 6c 65 20 74 68 65 20 70 61 67 65 72   While the pager
13630 20 72 65 6d 61 69 6e 73 20 69 6e 20 74 68 65 20   remains in the 
13640 45 52 52 4f 52 20 73 74 61 74 65 2c 0a 2a 2a 20  ERROR state,.** 
13650 61 6c 6c 20 6d 61 6a 6f 72 20 41 50 49 20 63 61  all major API ca
13660 6c 6c 73 20 6f 6e 20 74 68 65 20 50 61 67 65 72  lls on the Pager
13670 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c   will immediatel
13680 79 20 72 65 74 75 72 6e 20 50 61 67 65 72 2e 65  y return Pager.e
13690 72 72 43 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  rrCode..**.** Th
136a0 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 69 6e  e ERROR state in
136b0 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65  dicates that the
136c0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
136d0 20 70 61 67 65 72 2d 63 61 63 68 65 20 0a 2a 2a   pager-cache .**
136e0 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74   cannot be trust
136f0 65 64 2e 20 54 68 69 73 20 73 74 61 74 65 20 63  ed. This state c
13700 61 6e 20 62 65 20 63 6c 65 61 72 65 64 20 62 79  an be cleared by
13710 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73 63   completely disc
13720 61 72 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20 63  arding .** the c
13730 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
13740 61 67 65 72 2d 63 61 63 68 65 2e 20 49 66 20 61  ager-cache. If a
13750 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
13760 20 61 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a 20   active when.** 
13770 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 65  the persistent e
13780 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 74  rror occurred, t
13790 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  hen the rollback
137a0 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 6e 65 65   journal may nee
137b0 64 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c 61  d.** to be repla
137c0 79 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74  yed to restore t
137d0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
137e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
137f0 20 28 61 73 20 69 66 0a 2a 2a 20 69 74 20 77 65   (as if.** it we
13800 72 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  re a hot-journal
13810 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
13820 20 70 61 67 65 72 5f 65 72 72 6f 72 28 50 61 67   pager_error(Pag
13830 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
13840 72 63 29 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d  rc){.  int rc2 =
13850 20 72 63 20 26 20 30 78 66 66 3b 0a 20 20 61 73   rc & 0xff;.  as
13860 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
13870 5f 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b  _OK || !MEMDB );
13880 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20 20 20  .  assert(.     
13890 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
138a0 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c  e==SQLITE_FULL |
138b0 7c 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  |.       pPager-
138c0 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
138d0 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28 70  _OK ||.       (p
138e0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26  Pager->errCode &
138f0 20 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49   0xff)==SQLITE_I
13900 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69 66 28 20  OERR.  );.  if( 
13910 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  rc2==SQLITE_FULL
13920 20 7c 7c 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f   || rc2==SQLITE_
13930 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 70 50 61  IOERR ){.    pPa
13940 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72  ger->errCode = r
13950 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  c;.    pPager->e
13960 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 52  State = PAGER_ER
13970 52 4f 52 3b 0a 20 20 20 20 73 65 74 47 65 74 74  ROR;.    setGett
13980 65 72 4d 65 74 68 6f 64 28 70 50 61 67 65 72 29  erMethod(pPager)
13990 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
139a0 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  c;.}..static int
139b0 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
139c0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
139d0 67 6e 6f 20 6e 50 61 67 65 29 3b 0a 0a 2f 2a 0a  gno nPage);../*.
139e0 2a 2a 20 54 68 65 20 77 72 69 74 65 20 74 72 61  ** The write tra
139f0 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 20 6f 6e  nsaction open on
13a00 20 70 50 61 67 65 72 20 69 73 20 62 65 69 6e 67   pPager is being
13a10 20 63 6f 6d 6d 69 74 74 65 64 20 28 62 43 6f 6d   committed (bCom
13a20 6d 69 74 3d 3d 31 29 0a 2a 2a 20 6f 72 20 72 6f  mit==1).** or ro
13a30 6c 6c 65 64 20 62 61 63 6b 20 28 62 43 6f 6d 6d  lled back (bComm
13a40 69 74 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 52 65  it==0)..**.** Re
13a50 74 75 72 6e 20 54 52 55 45 20 69 66 20 61 6e 64  turn TRUE if and
13a60 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 69 72   only if all dir
13a70 74 79 20 70 61 67 65 73 20 73 68 6f 75 6c 64 20  ty pages should 
13a80 62 65 20 66 6c 75 73 68 65 64 20 74 6f 20 64 69  be flushed to di
13a90 73 6b 2e 0a 2a 2a 0a 2a 2a 20 52 75 6c 65 73 3a  sk..**.** Rules:
13aa0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 46 6f 72 20  .**.**   *  For 
13ab0 6e 6f 6e 2d 54 45 4d 50 20 64 61 74 61 62 61 73  non-TEMP databas
13ac0 65 73 2c 20 61 6c 77 61 79 73 20 73 79 6e 63 20  es, always sync 
13ad0 74 6f 20 64 69 73 6b 2e 20 20 54 68 69 73 20 69  to disk.  This i
13ae0 73 20 6e 65 63 65 73 73 61 72 79 0a 2a 2a 20 20  s necessary.**  
13af0 20 20 20 20 66 6f 72 20 74 72 61 6e 73 61 63 74      for transact
13b00 69 6f 6e 73 20 74 6f 20 62 65 20 64 75 72 61 62  ions to be durab
13b10 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 53  le..**.**   *  S
13b20 79 6e 63 20 54 45 4d 50 20 64 61 74 61 62 61 73  ync TEMP databas
13b30 65 20 6f 6e 6c 79 20 6f 6e 20 61 20 43 4f 4d 4d  e only on a COMM
13b40 49 54 20 28 6e 6f 74 20 61 20 52 4f 4c 4c 42 41  IT (not a ROLLBA
13b50 43 4b 29 20 77 68 65 6e 20 74 68 65 20 62 61 63  CK) when the bac
13b60 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 66 69 6c  king.**      fil
13b70 65 20 68 61 73 20 62 65 65 6e 20 63 72 65 61 74  e has been creat
13b80 65 64 20 61 6c 72 65 61 64 79 20 28 76 69 61 20  ed already (via 
13b90 61 20 73 70 69 6c 6c 20 6f 6e 20 70 61 67 65 72  a spill on pager
13ba0 53 74 72 65 73 73 28 29 29 20 61 6e 64 0a 2a 2a  Stress()) and.**
13bb0 20 20 20 20 20 20 77 68 65 6e 20 74 68 65 20 6e        when the n
13bc0 75 6d 62 65 72 20 6f 66 20 64 69 72 74 79 20 70  umber of dirty p
13bd0 61 67 65 73 20 69 6e 20 6d 65 6d 6f 72 79 20 65  ages in memory e
13be0 78 63 65 65 64 73 20 32 35 25 20 6f 66 20 74 68  xceeds 25% of th
13bf0 65 20 74 6f 74 61 6c 0a 2a 2a 20 20 20 20 20 20  e total.**      
13c00 63 61 63 68 65 20 73 69 7a 65 2e 0a 2a 2f 0a 73  cache size..*/.s
13c10 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 46  tatic int pagerF
13c20 6c 75 73 68 4f 6e 43 6f 6d 6d 69 74 28 50 61 67  lushOnCommit(Pag
13c30 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
13c40 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 69 66 28 20  bCommit){.  if( 
13c50 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
13c60 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
13c70 20 20 69 66 28 20 21 62 43 6f 6d 6d 69 74 20 29    if( !bCommit )
13c80 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
13c90 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
13ca0 3e 66 64 29 20 29 20 72 65 74 75 72 6e 20 30 3b  >fd) ) return 0;
13cb0 0a 20 20 72 65 74 75 72 6e 20 28 73 71 6c 69 74  .  return (sqlit
13cc0 65 33 50 43 61 63 68 65 50 65 72 63 65 6e 74 44  e3PCachePercentD
13cd0 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43  irty(pPager->pPC
13ce0 61 63 68 65 29 3e 3d 32 35 29 3b 0a 7d 0a 0a 2f  ache)>=25);.}../
13cf0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
13d00 65 20 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63  e ends a transac
13d10 74 69 6f 6e 2e 20 41 20 74 72 61 6e 73 61 63 74  tion. A transact
13d20 69 6f 6e 20 69 73 20 75 73 75 61 6c 6c 79 20 65  ion is usually e
13d30 6e 64 65 64 20 62 79 20 0a 2a 2a 20 65 69 74 68  nded by .** eith
13d40 65 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61  er a COMMIT or a
13d50 20 52 4f 4c 4c 42 41 43 4b 20 6f 70 65 72 61 74   ROLLBACK operat
13d60 69 6f 6e 2e 20 54 68 69 73 20 72 6f 75 74 69 6e  ion. This routin
13d70 65 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  e may be called 
13d80 0a 2a 2a 20 61 66 74 65 72 20 72 6f 6c 6c 62 61  .** after rollba
13d90 63 6b 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72  ck of a hot-jour
13da0 6e 61 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72  nal, or if an er
13db0 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
13dc0 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 74 68 65 20   opening.** the 
13dd0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
13de0 77 72 69 74 69 6e 67 20 74 68 65 20 76 65 72 79  writing the very
13df0 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68   first journal-h
13e00 65 61 64 65 72 20 6f 66 20 61 0a 2a 2a 20 64 61  eader of a.** da
13e10 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
13e20 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20  on..** .** This 
13e30 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72  routine is never
13e40 20 63 61 6c 6c 65 64 20 69 6e 20 50 41 47 45 52   called in PAGER
13e50 5f 45 52 52 4f 52 20 73 74 61 74 65 2e 20 49 66  _ERROR state. If
13e60 20 69 74 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a   it is called.**
13e70 20 69 6e 20 50 41 47 45 52 5f 4e 4f 4e 45 20 6f   in PAGER_NONE o
13e80 72 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73  r PAGER_SHARED s
13e90 74 61 74 65 20 61 6e 64 20 74 68 65 20 6c 6f 63  tate and the loc
13ea0 6b 20 68 65 6c 64 20 69 73 20 6c 65 73 73 0a 2a  k held is less.*
13eb0 2a 20 65 78 63 6c 75 73 69 76 65 20 74 68 61 6e  * exclusive than
13ec0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
13ed0 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
13ee0 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
13ef0 2c 20 61 6e 79 20 61 63 74 69 76 65 20 73 61 76  , any active sav
13f00 65 70 6f 69 6e 74 73 20 61 72 65 20 72 65 6c 65  epoints are rele
13f10 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ased..**.** If t
13f20 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
13f30 69 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74  is open, then it
13f40 20 69 73 20 22 66 69 6e 61 6c 69 7a 65 64 22 2e   is "finalized".
13f50 20 4f 6e 63 65 20 61 20 6a 6f 75 72 6e 61 6c 20   Once a journal 
13f60 0a 2a 2a 20 66 69 6c 65 20 68 61 73 20 62 65 65  .** file has bee
13f70 6e 20 66 69 6e 61 6c 69 7a 65 64 20 69 74 20 69  n finalized it i
13f80 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
13f90 6f 20 75 73 65 20 69 74 20 74 6f 20 72 6f 6c 6c  o use it to roll
13fa0 20 62 61 63 6b 20 61 20 0a 2a 2a 20 74 72 61 6e   back a .** tran
13fb0 73 61 63 74 69 6f 6e 2e 20 4e 6f 72 20 77 69 6c  saction. Nor wil
13fc0 6c 20 69 74 20 62 65 20 63 6f 6e 73 69 64 65 72  l it be consider
13fd0 65 64 20 74 6f 20 62 65 20 61 20 68 6f 74 2d 6a  ed to be a hot-j
13fe0 6f 75 72 6e 61 6c 20 62 79 20 74 68 69 73 0a 2a  ournal by this.*
13ff0 2a 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 64  * or any other d
14000 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
14010 6f 6e 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20  on. Exactly how 
14020 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e  a journal is fin
14030 61 6c 69 7a 65 64 0a 2a 2a 20 64 65 70 65 6e 64  alized.** depend
14040 73 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  s on whether or 
14050 6e 6f 74 20 74 68 65 20 70 61 67 65 72 20 69 73  not the pager is
14060 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
14070 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 0a 2a  usive mode and.*
14080 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 6a 6f  * the current jo
14090 75 72 6e 61 6c 2d 6d 6f 64 65 20 28 50 61 67 65  urnal-mode (Page
140a0 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 76 61  r.journalMode va
140b0 6c 75 65 29 2c 20 61 73 20 66 6f 6c 6c 6f 77 73  lue), as follows
140c0 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61  :.**.**   journa
140d0 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a  lMode==MEMORY.**
140e0 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c       Journal fil
140f0 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
14100 73 69 6d 70 6c 79 20 63 6c 6f 73 65 64 2e 20 54  simply closed. T
14110 68 69 73 20 64 65 73 74 72 6f 79 73 20 61 6e 20  his destroys an 
14120 0a 2a 2a 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72  .**     in-memor
14130 79 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  y journal..**.**
14140 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d     journalMode==
14150 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20 20  TRUNCATE.**     
14160 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  Journal file is 
14170 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72  truncated to zer
14180 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  o bytes in size.
14190 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  .**.**   journal
141a0 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 0a 2a 2a  Mode==PERSIST.**
141b0 20 20 20 20 20 54 68 65 20 66 69 72 73 74 20 32       The first 2
141c0 38 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a  8 bytes of the j
141d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 72 65 20  ournal file are 
141e0 7a 65 72 6f 65 64 2e 20 54 68 69 73 20 69 6e 76  zeroed. This inv
141f0 61 6c 69 64 61 74 65 73 0a 2a 2a 20 20 20 20 20  alidates.**     
14200 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
14210 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 20  l header in the 
14220 66 69 6c 65 2c 20 61 6e 64 20 68 65 6e 63 65 20  file, and hence 
14230 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e  the entire journ
14240 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 2e 20  al.**     file. 
14250 41 6e 20 69 6e 76 61 6c 69 64 20 6a 6f 75 72 6e  An invalid journ
14260 61 6c 20 66 69 6c 65 20 63 61 6e 6e 6f 74 20 62  al file cannot b
14270 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  e rolled back..*
14280 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f  *.**   journalMo
14290 64 65 3d 3d 44 45 4c 45 54 45 0a 2a 2a 20 20 20  de==DELETE.**   
142a0 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69    The journal fi
142b0 6c 65 20 69 73 20 63 6c 6f 73 65 64 20 61 6e 64  le is closed and
142c0 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 73   deleted using s
142d0 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29  qlite3OsDelete()
142e0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 66 20 74  ..**.**     If t
142f0 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e  he pager is runn
14300 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
14310 20 6d 6f 64 65 2c 20 74 68 69 73 20 6d 65 74 68   mode, this meth
14320 6f 64 20 6f 66 20 66 69 6e 61 6c 69 7a 69 6e 67  od of finalizing
14330 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72  .**     the jour
14340 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65  nal file is neve
14350 72 20 75 73 65 64 2e 20 49 6e 73 74 65 61 64 2c  r used. Instead,
14360 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 4d   if the journalM
14370 6f 64 65 20 69 73 0a 2a 2a 20 20 20 20 20 44 45  ode is.**     DE
14380 4c 45 54 45 20 61 6e 64 20 74 68 65 20 70 61 67  LETE and the pag
14390 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69  er is in exclusi
143a0 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6d 65 74  ve mode, the met
143b0 68 6f 64 20 64 65 73 63 72 69 62 65 64 20 75 6e  hod described un
143c0 64 65 72 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  der.**     journ
143d0 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 20  alMode==PERSIST 
143e0 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e  is used instead.
143f0 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65  .**.** After the
14400 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61   journal is fina
14410 6c 69 7a 65 64 2c 20 74 68 65 20 70 61 67 65 72  lized, the pager
14420 20 6d 6f 76 65 73 20 74 6f 20 50 41 47 45 52 5f   moves to PAGER_
14430 52 45 41 44 45 52 20 73 74 61 74 65 2e 0a 2a 2a  READER state..**
14440 20 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6e   If running in n
14450 6f 6e 2d 65 78 63 6c 75 73 69 76 65 20 72 6f 6c  on-exclusive rol
14460 6c 62 61 63 6b 20 6d 6f 64 65 2c 20 74 68 65 20  lback mode, the 
14470 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
14480 20 69 73 20 0a 2a 2a 20 64 6f 77 6e 67 72 61 64   is .** downgrad
14490 65 64 20 74 6f 20 61 20 53 48 41 52 45 44 5f 4c  ed to a SHARED_L
144a0 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  OCK..**.** SQLIT
144b0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
144c0 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   if no error occ
144d0 75 72 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  urs. If an error
144e0 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 0a 2a   occurs during.*
144f0 2a 20 61 6e 79 20 6f 66 20 74 68 65 20 49 4f 20  * any of the IO 
14500 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 66 69  operations to fi
14510 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
14520 61 6c 20 66 69 6c 65 20 6f 72 20 75 6e 6c 6f 63  al file or unloc
14530 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  k the.** databas
14540 65 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  e then the IO er
14550 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
14560 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72  rned to the user
14570 2e 20 49 66 20 74 68 65 20 0a 2a 2a 20 6f 70 65  . If the .** ope
14580 72 61 74 69 6f 6e 20 74 6f 20 66 69 6e 61 6c 69  ration to finali
14590 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ze the journal f
145a0 69 6c 65 20 66 61 69 6c 73 2c 20 74 68 65 6e 20  ile fails, then 
145b0 74 68 65 20 63 6f 64 65 20 73 74 69 6c 6c 0a 2a  the code still.*
145c0 2a 20 74 72 69 65 73 20 74 6f 20 75 6e 6c 6f 63  * tries to unloc
145d0 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  k the database f
145e0 69 6c 65 20 69 66 20 6e 6f 74 20 69 6e 20 65 78  ile if not in ex
145f0 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 20 49 66  clusive mode. If
14600 20 74 68 65 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f   the.** unlock o
14610 70 65 72 61 74 69 6f 6e 20 66 61 69 6c 73 20 61  peration fails a
14620 73 20 77 65 6c 6c 2c 20 74 68 65 6e 20 74 68 65  s well, then the
14630 20 66 69 72 73 74 20 65 72 72 6f 72 20 63 6f 64   first error cod
14640 65 20 72 65 6c 61 74 65 64 0a 2a 2a 20 74 6f 20  e related.** to 
14650 74 68 65 20 66 69 72 73 74 20 65 72 72 6f 72 20  the first error 
14660 65 6e 63 6f 75 6e 74 65 72 65 64 20 28 74 68 65  encountered (the
14670 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a   journal finaliz
14680 61 74 69 6f 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a  ation one) is.**
14690 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
146a0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65  atic int pager_e
146b0 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 50  nd_transaction(P
146c0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
146d0 74 20 68 61 73 4d 61 73 74 65 72 2c 20 69 6e 74  t hasMaster, int
146e0 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 69 6e 74   bCommit){.  int
146f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
14700 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63        /* Error c
14710 6f 64 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c  ode from journal
14720 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70   finalization op
14730 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  eration */.  int
14740 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b   rc2 = SQLITE_OK
14750 3b 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63  ;     /* Error c
14760 6f 64 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65  ode from db file
14770 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f   unlock operatio
14780 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f  n */..  /* Do no
14790 74 68 69 6e 67 20 69 66 20 74 68 65 20 70 61 67  thing if the pag
147a0 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  er does not have
147b0 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74   an open write t
147c0 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
147d0 6f 72 20 61 74 20 6c 65 61 73 74 20 61 20 52 45  or at least a RE
147e0 53 45 52 56 45 44 20 6c 6f 63 6b 2e 20 54 68 69  SERVED lock. Thi
147f0 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62  s function may b
14800 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68  e called when th
14810 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77  ere.  ** is no w
14820 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
14830 20 61 63 74 69 76 65 20 62 75 74 20 61 20 52 45   active but a RE
14840 53 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65  SERVED or greate
14850 72 20 6c 6f 63 6b 20 69 73 0a 20 20 2a 2a 20 68  r lock is.  ** h
14860 65 6c 64 20 75 6e 64 65 72 20 74 77 6f 20 63 69  eld under two ci
14870 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 20 20 2a  rcumstances:.  *
14880 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 41 66 74 65  *.  **   1. Afte
14890 72 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 68  r a successful h
148a0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
148b0 61 63 6b 2c 20 69 74 20 69 73 20 63 61 6c 6c 65  ack, it is calle
148c0 64 20 77 69 74 68 0a 20 20 2a 2a 20 20 20 20 20  d with.  **     
148d0 20 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4e   eState==PAGER_N
148e0 4f 4e 45 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45  ONE and eLock==E
148f0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 20  XCLUSIVE_LOCK.. 
14900 20 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 49 66   **.  **   2. If
14910 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69   a connection wi
14920 74 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  th locking_mode=
14930 65 78 63 6c 75 73 69 76 65 20 68 6f 6c 64 69 6e  exclusive holdin
14940 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a  g an EXCLUSIVE .
14950 20 20 2a 2a 20 20 20 20 20 20 6c 6f 63 6b 20 73    **      lock s
14960 77 69 74 63 68 65 73 20 62 61 63 6b 20 74 6f 20  witches back to 
14970 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72  locking_mode=nor
14980 6d 61 6c 20 61 6e 64 20 74 68 65 6e 20 65 78 65  mal and then exe
14990 63 75 74 65 73 20 61 0a 20 20 2a 2a 20 20 20 20  cutes a.  **    
149a0 20 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69    read-transacti
149b0 6f 6e 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  on, this functio
149c0 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68  n is called with
149d0 20 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52   eState==PAGER_R
149e0 45 41 44 45 52 20 0a 20 20 2a 2a 20 20 20 20 20  EADER .  **     
149f0 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c   and eLock==EXCL
14a00 55 53 49 56 45 5f 4c 4f 43 4b 20 77 68 65 6e 20  USIVE_LOCK when 
14a10 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63  the read-transac
14a20 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 0a  tion is closed..
14a30 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61    */.  assert( a
14a40 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
14a50 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  e(pPager) );.  a
14a60 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
14a70 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
14a80 4f 52 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  OR );.  if( pPag
14a90 65 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52  er->eState<PAGER
14aa0 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 26  _WRITER_LOCKED &
14ab0 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c  & pPager->eLock<
14ac0 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b  RESERVED_LOCK ){
14ad0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14ae0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 65  TE_OK;.  }..  re
14af0 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e  leaseAllSavepoin
14b00 74 73 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73  ts(pPager);.  as
14b10 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
14b20 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61  ger->jfd) || pPa
14b30 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
14b40 3d 30 20 0a 20 20 20 20 20 20 7c 7c 20 28 73 71  =0 .      || (sq
14b50 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
14b60 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
14b70 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f  ger->fd)&SQLITE_
14b80 49 4f 43 41 50 5f 42 41 54 43 48 5f 41 54 4f 4d  IOCAP_BATCH_ATOM
14b90 49 43 29 0a 20 20 29 3b 0a 20 20 69 66 28 20 69  IC).  );.  if( i
14ba0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
14bb0 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  d) ){.    assert
14bc0 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
14bd0 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 20 20 2f  Pager) );..    /
14be0 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a  * Finalize the j
14bf0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a  ournal file. */.
14c00 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 4a      if( sqlite3J
14c10 6f 75 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f 72 79  ournalIsInMemory
14c20 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
14c30 0a 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74  .      /* assert
14c40 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
14c50 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
14c60 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
14c70 29 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  ); */.      sqli
14c80 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
14c90 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c  r->jfd);.    }el
14ca0 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  se if( pPager->j
14cb0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
14cc0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  R_JOURNALMODE_TR
14cd0 55 4e 43 41 54 45 20 29 7b 0a 20 20 20 20 20 20  UNCATE ){.      
14ce0 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
14cf0 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20  nalOff==0 ){.   
14d00 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
14d10 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  _OK;.      }else
14d20 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
14d30 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
14d40 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29  (pPager->jfd, 0)
14d50 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
14d60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
14d70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
14d80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
14d90 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65  Make sure the ne
14da0 77 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20 77  w file size is w
14db0 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
14dc0 69 6e 6f 64 65 20 72 69 67 68 74 20 61 77 61 79  inode right away
14dd0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4f  ..          ** O
14de0 74 68 65 72 77 69 73 65 20 74 68 65 20 6a 6f 75  therwise the jou
14df0 72 6e 61 6c 20 6d 69 67 68 74 20 72 65 73 75 72  rnal might resur
14e00 72 65 63 74 20 66 6f 6c 6c 6f 77 69 6e 67 20 61  rect following a
14e10 20 70 6f 77 65 72 20 6c 6f 73 73 20 61 6e 64 0a   power loss and.
14e20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 75            ** cau
14e30 73 65 20 74 68 65 20 6c 61 73 74 20 74 72 61 6e  se the last tran
14e40 73 61 63 74 69 6f 6e 20 74 6f 20 72 6f 6c 6c 20  saction to roll 
14e50 62 61 63 6b 2e 20 20 53 65 65 0a 20 20 20 20 20  back.  See.     
14e60 20 20 20 20 20 2a 2a 20 68 74 74 70 73 3a 2f 2f       ** https://
14e70 62 75 67 7a 69 6c 6c 61 2e 6d 6f 7a 69 6c 6c 61  bugzilla.mozilla
14e80 2e 6f 72 67 2f 73 68 6f 77 5f 62 75 67 2e 63 67  .org/show_bug.cg
14e90 69 3f 69 64 3d 31 30 37 32 37 37 33 0a 20 20 20  i?id=1072773.   
14ea0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
14eb0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14ec0 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
14ed0 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  fd, pPager->sync
14ee0 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20  Flags);.        
14ef0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
14f00 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
14f10 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ff = 0;.    }els
14f20 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f  e if( pPager->jo
14f30 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
14f40 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
14f50 53 49 53 54 0a 20 20 20 20 20 20 7c 7c 20 28 70  SIST.      || (p
14f60 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
14f70 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Mode && pPager->
14f80 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
14f90 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
14fa0 41 4c 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  AL).    ){.     
14fb0 20 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61   rc = zeroJourna
14fc0 6c 48 64 72 28 70 50 61 67 65 72 2c 20 68 61 73  lHdr(pPager, has
14fd0 4d 61 73 74 65 72 7c 7c 70 50 61 67 65 72 2d 3e  Master||pPager->
14fe0 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20 20  tempFile);.     
14ff0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
15000 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Off = 0;.    }el
15010 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69  se{.      /* Thi
15020 73 20 62 72 61 6e 63 68 20 6d 61 79 20 62 65 20  s branch may be 
15030 65 78 65 63 75 74 65 64 20 77 69 74 68 20 50 61  executed with Pa
15040 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  ger.journalMode=
15050 3d 4d 45 4d 4f 52 59 20 69 66 0a 20 20 20 20 20  =MEMORY if.     
15060 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   ** a hot-journa
15070 6c 20 77 61 73 20 6a 75 73 74 20 72 6f 6c 6c 65  l was just rolle
15080 64 20 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20  d back. In this 
15090 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  case the journal
150a0 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 73  .      ** file s
150b0 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20  hould be closed 
150c0 61 6e 64 20 64 65 6c 65 74 65 64 2e 20 49 66 20  and deleted. If 
150d0 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
150e0 77 72 69 74 65 73 20 74 6f 0a 20 20 20 20 20 20  writes to.      
150f0 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
15100 66 69 6c 65 2c 20 69 74 20 77 69 6c 6c 20 64 6f  file, it will do
15110 20 73 6f 20 75 73 69 6e 67 20 61 6e 20 69 6e 2d   so using an in-
15120 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a  memory journal..
15130 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
15140 6e 74 20 62 44 65 6c 65 74 65 20 3d 20 21 70 50  nt bDelete = !pP
15150 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
15160 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
15170 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 49 73 49 6e  lite3JournalIsIn
15180 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 6a  Memory(pPager->j
15190 66 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  fd)==0 );.      
151a0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
151b0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
151c0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
151d0 45 4c 45 54 45 20 0a 20 20 20 20 20 20 20 20 20  ELETE .         
151e0 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75    || pPager->jou
151f0 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
15200 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
15210 52 59 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  RY .           |
15220 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
15230 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
15240 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20  RNALMODE_WAL .  
15250 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c      );.      sql
15260 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
15270 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
15280 69 66 28 20 62 44 65 6c 65 74 65 20 29 7b 0a 20  if( bDelete ){. 
15290 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
152a0 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67  te3OsDelete(pPag
152b0 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72  er->pVfs, pPager
152c0 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
152d0 65 72 2d 3e 65 78 74 72 61 53 79 6e 63 29 3b 0a  er->extraSync);.
152e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
152f0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
15300 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 73  _CHECK_PAGES.  s
15310 71 6c 69 74 65 33 50 63 61 63 68 65 49 74 65 72  qlite3PcacheIter
15320 61 74 65 44 69 72 74 79 28 70 50 61 67 65 72 2d  ateDirty(pPager-
15330 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65 72 5f  >pPCache, pager_
15340 73 65 74 5f 70 61 67 65 68 61 73 68 29 3b 0a 20  set_pagehash);. 
15350 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
15360 69 7a 65 3d 3d 30 20 26 26 20 73 71 6c 69 74 65  ize==0 && sqlite
15370 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
15380 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
15390 3e 30 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  >0 ){.    PgHdr 
153a0 2a 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  *p = sqlite3Page
153b0 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  rLookup(pPager, 
153c0 31 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b  1);.    if( p ){
153d0 0a 20 20 20 20 20 20 70 2d 3e 70 61 67 65 48 61  .      p->pageHa
153e0 73 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  sh = 0;.      sq
153f0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e  lite3PagerUnrefN
15400 6f 74 4e 75 6c 6c 28 70 29 3b 0a 20 20 20 20 7d  otNull(p);.    }
15410 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73  .  }.#endif..  s
15420 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
15430 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  roy(pPager->pInJ
15440 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65  ournal);.  pPage
15450 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
15460 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  0;.  pPager->nRe
15470 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 3d  c = 0;.  if( rc=
15480 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15490 20 20 69 66 28 20 4d 45 4d 44 42 20 7c 7c 20 70    if( MEMDB || p
154a0 61 67 65 72 46 6c 75 73 68 4f 6e 43 6f 6d 6d 69  agerFlushOnCommi
154b0 74 28 70 50 61 67 65 72 2c 20 62 43 6f 6d 6d 69  t(pPager, bCommi
154c0 74 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  t) ){.      sqli
154d0 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c  te3PcacheCleanAl
154e0 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  l(pPager->pPCach
154f0 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
15500 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63       sqlite3Pcac
15510 68 65 43 6c 65 61 72 57 72 69 74 61 62 6c 65 28  heClearWritable(
15520 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
15530 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
15540 74 65 33 50 63 61 63 68 65 54 72 75 6e 63 61 74  te3PcacheTruncat
15550 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
15560 65 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  e, pPager->dbSiz
15570 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  e);.  }..  if( p
15580 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
15590 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 44 72 6f  r) ){.    /* Dro
155a0 70 20 74 68 65 20 57 41 4c 20 77 72 69 74 65 2d  p the WAL write-
155b0 6c 6f 63 6b 2c 20 69 66 20 61 6e 79 2e 20 41 6c  lock, if any. Al
155c0 73 6f 2c 20 69 66 20 74 68 65 20 63 6f 6e 6e 65  so, if the conne
155d0 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 0a 20 20  ction was in .  
155e0 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64    ** locking_mod
155f0 65 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  e=exclusive mode
15600 20 62 75 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65   but is no longe
15610 72 2c 20 64 72 6f 70 20 74 68 65 20 45 58 43 4c  r, drop the EXCL
15620 55 53 49 56 45 20 0a 20 20 20 20 2a 2a 20 6c 6f  USIVE .    ** lo
15630 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  ck held on the d
15640 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
15650 20 20 2a 2f 0a 20 20 20 20 72 63 32 20 3d 20 73    */.    rc2 = s
15660 71 6c 69 74 65 33 57 61 6c 45 6e 64 57 72 69 74  qlite3WalEndWrit
15670 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  eTransaction(pPa
15680 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20  ger->pWal);.    
15690 61 73 73 65 72 74 28 20 72 63 32 3d 3d 53 51 4c  assert( rc2==SQL
156a0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 65 6c 73  ITE_OK );.  }els
156b0 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
156c0 5f 4f 4b 20 26 26 20 62 43 6f 6d 6d 69 74 20 26  _OK && bCommit &
156d0 26 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  & pPager->dbFile
156e0 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 64 62 53  Size>pPager->dbS
156f0 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ize ){.    /* Th
15700 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b  is branch is tak
15710 65 6e 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69  en when committi
15720 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ng a transaction
15730 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75   in rollback-jou
15740 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65  rnal.    ** mode
15750 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
15760 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73   file on disk is
15770 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
15780 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2e   database image.
15790 0a 20 20 20 20 2a 2a 20 41 74 20 74 68 69 73 20  .    ** At this 
157a0 70 6f 69 6e 74 20 74 68 65 20 6a 6f 75 72 6e 61  point the journa
157b0 6c 20 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c  l has been final
157c0 69 7a 65 64 20 61 6e 64 20 74 68 65 20 74 72 61  ized and the tra
157d0 6e 73 61 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a  nsaction .    **
157e0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f   successfully co
157f0 6d 6d 69 74 74 65 64 2c 20 62 75 74 20 74 68 65  mmitted, but the
15800 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
15810 69 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e  is still held on
15820 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65   the.    ** file
15830 2e 20 53 6f 20 69 74 20 69 73 20 73 61 66 65 20  . So it is safe 
15840 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  to truncate the 
15850 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
15860 20 69 74 73 20 6d 69 6e 69 6d 75 6d 0a 20 20 20   its minimum.   
15870 20 2a 2a 20 72 65 71 75 69 72 65 64 20 73 69 7a   ** required siz
15880 65 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  e.  */.    asser
15890 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  t( pPager->eLock
158a0 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
158b0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   );.    rc = pag
158c0 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67  er_truncate(pPag
158d0 65 72 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69  er, pPager->dbSi
158e0 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ze);.  }..  if( 
158f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
15900 20 62 43 6f 6d 6d 69 74 20 26 26 20 69 73 4f 70   bCommit && isOp
15910 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
15920 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
15930 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  e3OsFileControl(
15940 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49  pPager->fd, SQLI
15950 54 45 5f 46 43 4e 54 4c 5f 43 4f 4d 4d 49 54 5f  TE_FCNTL_COMMIT_
15960 50 48 41 53 45 54 57 4f 2c 20 30 29 3b 0a 20 20  PHASETWO, 0);.  
15970 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
15980 5f 4e 4f 54 46 4f 55 4e 44 20 29 20 72 63 20 3d  _NOTFOUND ) rc =
15990 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
159a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53  .#ifdef SQLITE_S
159b0 45 52 56 45 52 5f 45 44 49 54 49 4f 4e 0a 20 20  ERVER_EDITION.  
159c0 69 66 28 20 70 61 67 65 72 49 73 53 65 72 76 65  if( pagerIsServe
159d0 72 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  r(pPager) ){.   
159e0 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 53 65   rc2 = sqlite3Se
159f0 72 76 65 72 45 6e 64 57 72 69 74 65 28 70 50 61  rverEndWrite(pPa
15a00 67 65 72 2d 3e 70 53 65 72 76 65 72 29 3b 0a 20  ger->pServer);. 
15a10 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
15a20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
15a30 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20 26  lusiveMode .   &
15a40 26 20 28 21 70 61 67 65 72 55 73 65 57 61 6c 28  & (!pagerUseWal(
15a50 70 50 61 67 65 72 29 20 7c 7c 20 73 71 6c 69 74  pPager) || sqlit
15a60 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f  e3WalExclusiveMo
15a70 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  de(pPager->pWal,
15a80 20 30 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 63   0)).  ){.    rc
15a90 32 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44  2 = pagerUnlockD
15aa0 62 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44  b(pPager, SHARED
15ab0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61 67  _LOCK);.    pPag
15ac0 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
15ad0 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  one = 0;.  }.  p
15ae0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
15af0 50 41 47 45 52 5f 52 45 41 44 45 52 3b 0a 20 20  PAGER_READER;.  
15b00 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
15b10 72 20 3d 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e  r = 0;..  return
15b20 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f   (rc==SQLITE_OK?
15b30 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rc2:rc);.}../*.*
15b40 2a 20 45 78 65 63 75 74 65 20 61 20 72 6f 6c 6c  * Execute a roll
15b50 62 61 63 6b 20 69 66 20 61 20 74 72 61 6e 73 61  back if a transa
15b60 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20  ction is active 
15b70 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a  and unlock the .
15b80 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
15b90 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
15ba0 70 61 67 65 72 20 68 61 73 20 61 6c 72 65 61 64  pager has alread
15bb0 79 20 65 6e 74 65 72 65 64 20 74 68 65 20 45 52  y entered the ER
15bc0 52 4f 52 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f  ROR state, do no
15bd0 74 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 74 68  t attempt .** th
15be0 65 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20 74 68  e rollback at th
15bf0 69 73 20 74 69 6d 65 2e 20 49 6e 73 74 65 61 64  is time. Instead
15c00 2c 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  , pager_unlock()
15c10 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 0a   is called. The.
15c20 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72  ** call to pager
15c30 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 64  _unlock() will d
15c40 69 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d 6d 65  iscard all in-me
15c50 6d 6f 72 79 20 70 61 67 65 73 2c 20 75 6e 6c 6f  mory pages, unlo
15c60 63 6b 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  ck.** the databa
15c70 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 6f 76 65  se file and move
15c80 20 74 68 65 20 70 61 67 65 72 20 62 61 63 6b 20   the pager back 
15c90 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e 20 49  to OPEN state. I
15ca0 66 20 74 68 69 73 20 0a 2a 2a 20 6d 65 61 6e 73  f this .** means
15cb0 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61   that there is a
15cc0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6c 65 66   hot-journal lef
15cd0 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  t in the file-sy
15ce0 73 74 65 6d 2c 20 74 68 65 20 6e 65 78 74 20 0a  stem, the next .
15cf0 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  ** connection to
15d00 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65 64   obtain a shared
15d10 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61 67   lock on the pag
15d20 65 72 20 28 77 68 69 63 68 20 6d 61 79 20 62 65  er (which may be
15d30 20 74 68 69 73 20 6f 6e 65 29 20 0a 2a 2a 20 77   this one) .** w
15d40 69 6c 6c 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b  ill roll it back
15d50 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
15d60 61 67 65 72 20 68 61 73 20 6e 6f 74 20 61 6c 72  ager has not alr
15d70 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65  eady entered the
15d80 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62 75   ERROR state, bu
15d90 74 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a 20 6d 61  t an IO or.** ma
15da0 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72  lloc error occur
15db0 73 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62  s during a rollb
15dc0 61 63 6b 2c 20 74 68 65 6e 20 74 68 69 73 20 77  ack, then this w
15dd0 69 6c 6c 20 69 74 73 65 6c 66 20 63 61 75 73 65  ill itself cause
15de0 20 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74   .** the pager t
15df0 6f 20 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f  o enter the ERRO
15e00 52 20 73 74 61 74 65 2e 20 57 68 69 63 68 20 77  R state. Which w
15e10 69 6c 6c 20 62 65 20 63 6c 65 61 72 65 64 20 62  ill be cleared b
15e20 79 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f  y the.** call to
15e30 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 2c   pager_unlock(),
15e40 20 61 73 20 64 65 73 63 72 69 62 65 64 20 61 62   as described ab
15e50 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ove..*/.static v
15e60 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41  oid pagerUnlockA
15e70 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72  ndRollback(Pager
15e80 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
15e90 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
15ea0 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26 20  =PAGER_ERROR && 
15eb0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
15ec0 50 41 47 45 52 5f 4f 50 45 4e 20 29 7b 0a 20 20  PAGER_OPEN ){.  
15ed0 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
15ee0 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
15ef0 67 65 72 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ger) );.    if( 
15f00 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
15f10 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
15f20 4b 45 44 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  KED ){.      sql
15f30 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
15f40 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 73  alloc();.      s
15f50 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
15f60 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
15f70 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
15f80 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
15f90 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61 67   }else if( !pPag
15fa0 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
15fb0 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  e ){.      asser
15fc0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
15fd0 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
15fe0 29 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65  );.      pager_e
15ff0 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
16000 50 61 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20  Pager, 0, 0);.  
16010 20 20 7d 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f    }.  }.  pager_
16020 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
16030 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  }../*.** Paramet
16040 65 72 20 61 44 61 74 61 20 6d 75 73 74 20 70 6f  er aData must po
16050 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
16060 6f 66 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  of pPager->pageS
16070 69 7a 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20  ize bytes.** of 
16080 64 61 74 61 2e 20 43 6f 6d 70 75 74 65 20 61 6e  data. Compute an
16090 64 20 72 65 74 75 72 6e 20 61 20 63 68 65 63 6b  d return a check
160a0 73 75 6d 20 62 61 73 65 64 20 6f 6e 74 20 74 68  sum based ont th
160b0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
160c0 65 20 0a 2a 2a 20 70 61 67 65 20 6f 66 20 64 61  e .** page of da
160d0 74 61 20 61 6e 64 20 74 68 65 20 63 75 72 72 65  ta and the curre
160e0 6e 74 20 76 61 6c 75 65 20 6f 66 20 70 50 61 67  nt value of pPag
160f0 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 2e 0a 2a  er->cksumInit..*
16100 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74  *.** This is not
16110 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73 75 6d   a real checksum
16120 2e 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20 6a  . It is really j
16130 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20 74  ust the sum of t
16140 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e  he .** random in
16150 69 74 69 61 6c 20 76 61 6c 75 65 20 28 70 50 61  itial value (pPa
16160 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 20  ger->cksumInit) 
16170 61 6e 64 20 65 76 65 72 79 20 32 30 30 74 68 20  and every 200th 
16180 62 79 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70  byte.** of the p
16190 61 67 65 20 64 61 74 61 2c 20 73 74 61 72 74 69  age data, starti
161a0 6e 67 20 77 69 74 68 20 62 79 74 65 20 6f 66 66  ng with byte off
161b0 73 65 74 20 28 70 50 61 67 65 72 2d 3e 70 61 67  set (pPager->pag
161c0 65 53 69 7a 65 25 32 30 30 29 2e 0a 2a 2a 20 45  eSize%200)..** E
161d0 61 63 68 20 62 79 74 65 20 69 73 20 69 6e 74 65  ach byte is inte
161e0 72 70 72 65 74 65 64 20 61 73 20 61 6e 20 38 2d  rpreted as an 8-
161f0 62 69 74 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  bit unsigned int
16200 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 68 61 6e  eger..**.** Chan
16210 67 69 6e 67 20 74 68 65 20 66 6f 72 6d 75 6c 61  ging the formula
16220 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   used to compute
16230 20 74 68 69 73 20 63 68 65 63 6b 73 75 6d 20 72   this checksum r
16240 65 73 75 6c 74 73 20 69 6e 20 61 6e 0a 2a 2a 20  esults in an.** 
16250 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6a 6f 75  incompatible jou
16260 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74  rnal file format
16270 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a 6f 75 72 6e  ..**.** If journ
16280 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63  al corruption oc
16290 63 75 72 73 20 64 75 65 20 74 6f 20 61 20 70 6f  curs due to a po
162a0 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65  wer failure, the
162b0 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 0a 2a 2a   most likely .**
162c0 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74 68 61   scenario is tha
162d0 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65  t one end or the
162e0 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72 65   other of the re
162f0 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61  cord will be cha
16300 6e 67 65 64 2e 20 0a 2a 2a 20 49 74 20 69 73 20  nged. .** It is 
16310 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79  much less likely
16320 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e   that the two en
16330 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ds of the journa
16340 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65  l record will be
16350 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20  .** correct and 
16360 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f  the middle be co
16370 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68  rrupt.  Thus, th
16380 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63  is "checksum" sc
16390 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20  heme,.** though 
163a0 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c  fast and simple,
163b0 20 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73   catches the mos
163c0 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20  tly likely kind 
163d0 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a  of corruption..*
163e0 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67  /.static u32 pag
163f0 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20 2a  er_cksum(Pager *
16400 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 75 38  pPager, const u8
16410 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32 20   *aData){.  u32 
16420 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e  cksum = pPager->
16430 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20  cksumInit;      
16440 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 76     /* Checksum v
16450 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a  alue to return *
16460 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70 50 61 67  /.  int i = pPag
16470 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30 30  er->pageSize-200
16480 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f  ;          /* Lo
16490 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
164a0 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20  while( i>0 ){.  
164b0 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61    cksum += aData
164c0 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30  [i];.    i -= 20
164d0 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
164e0 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  cksum;.}../*.** 
164f0 52 65 70 6f 72 74 20 74 68 65 20 63 75 72 72 65  Report the curre
16500 6e 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e 64  nt page size and
16510 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72   number of reser
16520 76 65 64 20 62 79 74 65 73 20 62 61 63 6b 0a 2a  ved bytes back.*
16530 2a 20 74 6f 20 74 68 65 20 63 6f 64 65 63 2e 0a  * to the codec..
16540 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
16550 5f 48 41 53 5f 43 4f 44 45 43 0a 73 74 61 74 69  _HAS_CODEC.stati
16560 63 20 76 6f 69 64 20 70 61 67 65 72 52 65 70 6f  c void pagerRepo
16570 72 74 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50  rtSize(Pager *pP
16580 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61  ager){.  if( pPa
16590 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43  ger->xCodecSizeC
165a0 68 6e 67 20 29 7b 0a 20 20 20 20 70 50 61 67 65  hng ){.    pPage
165b0 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e  r->xCodecSizeChn
165c0 67 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63  g(pPager->pCodec
165d0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
165e0 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze,.            
165f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
16600 69 6e 74 29 70 50 61 67 65 72 2d 3e 6e 52 65 73  int)pPager->nRes
16610 65 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  erve);.  }.}.#el
16620 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65  se.# define page
16630 72 52 65 70 6f 72 74 53 69 7a 65 28 58 29 20 20  rReportSize(X)  
16640 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69 66 20 77     /* No-op if w
16650 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74  e do not support
16660 20 61 20 63 6f 64 65 63 20 2a 2f 0a 23 65 6e 64   a codec */.#end
16670 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
16680 45 5f 48 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a  E_HAS_CODEC./*.*
16690 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
166a0 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76  number of reserv
166b0 65 64 20 62 69 74 73 20 69 73 20 74 68 65 20 73  ed bits is the s
166c0 61 6d 65 20 69 6e 20 74 68 65 20 64 65 73 74 69  ame in the desti
166d0 6e 61 74 69 6f 6e 0a 2a 2a 20 70 61 67 65 72 20  nation.** pager 
166e0 61 73 20 69 74 20 69 73 20 69 6e 20 74 68 65 20  as it is in the 
166f0 73 6f 75 72 63 65 2e 20 20 54 68 69 73 20 63 6f  source.  This co
16700 6d 65 73 20 75 70 20 77 68 65 6e 20 61 20 56 41  mes up when a VA
16710 43 55 55 4d 20 63 68 61 6e 67 65 73 20 74 68 65  CUUM changes the
16720 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  .** number of re
16730 73 65 72 76 65 64 20 62 69 74 73 20 74 6f 20 74  served bits to t
16740 68 65 20 22 6f 70 74 69 6d 61 6c 22 20 61 6d 6f  he "optimal" amo
16750 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  unt..*/.void sql
16760 69 74 65 33 50 61 67 65 72 41 6c 69 67 6e 52 65  ite3PagerAlignRe
16770 73 65 72 76 65 28 50 61 67 65 72 20 2a 70 44 65  serve(Pager *pDe
16780 73 74 2c 20 50 61 67 65 72 20 2a 70 53 72 63 29  st, Pager *pSrc)
16790 7b 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 6e  {.  if( pDest->n
167a0 52 65 73 65 72 76 65 21 3d 70 53 72 63 2d 3e 6e  Reserve!=pSrc->n
167b0 52 65 73 65 72 76 65 20 29 7b 0a 20 20 20 20 70  Reserve ){.    p
167c0 44 65 73 74 2d 3e 6e 52 65 73 65 72 76 65 20 3d  Dest->nReserve =
167d0 20 70 53 72 63 2d 3e 6e 52 65 73 65 72 76 65 3b   pSrc->nReserve;
167e0 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f 72 74  .    pagerReport
167f0 53 69 7a 65 28 70 44 65 73 74 29 3b 0a 20 20 7d  Size(pDest);.  }
16800 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
16810 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70   Read a single p
16820 61 67 65 20 66 72 6f 6d 20 65 69 74 68 65 72 20  age from either 
16830 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
16840 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d   (if isMainJrnl=
16850 3d 31 29 20 6f 72 0a 2a 2a 20 66 72 6f 6d 20 74  =1) or.** from t
16860 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 28  he sub-journal (
16870 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 30  if isMainJrnl==0
16880 29 20 61 6e 64 20 70 6c 61 79 62 61 63 6b 20 74  ) and playback t
16890 68 61 74 20 70 61 67 65 2e 0a 2a 2a 20 54 68 65  hat page..** The
168a0 20 70 61 67 65 20 62 65 67 69 6e 73 20 61 74 20   page begins at 
168b0 6f 66 66 73 65 74 20 2a 70 4f 66 66 73 65 74 20  offset *pOffset 
168c0 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54  into the file. T
168d0 68 65 20 2a 70 4f 66 66 73 65 74 0a 2a 2a 20 76  he *pOffset.** v
168e0 61 6c 75 65 20 69 73 20 69 6e 63 72 65 61 73 65  alue is increase
168f0 64 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  d to the start o
16900 66 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  f the next page 
16910 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  in the journal..
16920 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 72  **.** The main r
16930 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
16940 75 73 65 73 20 63 68 65 63 6b 73 75 6d 73 20 2d  uses checksums -
16950 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
16960 6f 75 72 6e 61 6c 20 64 6f 65 73 20 0a 2a 2a 20  ournal does .** 
16970 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  not..**.** If th
16980 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
16990 20 74 68 65 20 70 61 67 65 20 72 65 63 6f 72 64   the page record
169a0 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28   read from the (
169b0 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c  sub-)journal fil
169c0 65 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20  e.** is greater 
169d0 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
169e0 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e   value of Pager.
169f0 64 62 53 69 7a 65 2c 20 74 68 65 6e 20 70 6c 61  dbSize, then pla
16a00 79 62 61 63 6b 20 69 73 0a 2a 2a 20 73 6b 69 70  yback is.** skip
16a10 70 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ped and SQLITE_O
16a20 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
16a30 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e 65 20 69 73  *.** If pDone is
16a40 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
16a50 69 74 20 69 73 20 61 20 72 65 63 6f 72 64 20 6f  it is a record o
16a60 66 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76  f pages that hav
16a70 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65  e already.** bee
16a80 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 20  n played back.  
16a90 49 66 20 74 68 65 20 70 61 67 65 20 61 74 20 2a  If the page at *
16aa0 70 4f 66 66 73 65 74 20 68 61 73 20 61 6c 72 65  pOffset has alre
16ab0 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20  ady been played 
16ac0 62 61 63 6b 0a 2a 2a 20 28 69 66 20 74 68 65 20  back.** (if the 
16ad0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 44  corresponding pD
16ae0 6f 6e 65 20 62 69 74 20 69 73 20 73 65 74 29 20  one bit is set) 
16af0 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20 70 6c  then skip the pl
16b00 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20  ayback..** Make 
16b10 73 75 72 65 20 74 68 65 20 70 44 6f 6e 65 20 62  sure the pDone b
16b20 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  it corresponding
16b30 20 74 6f 20 74 68 65 20 2a 70 4f 66 66 73 65 74   to the *pOffset
16b40 20 70 61 67 65 20 69 73 20 73 65 74 0a 2a 2a 20   page is set.** 
16b50 70 72 69 6f 72 20 74 6f 20 72 65 74 75 72 6e 69  prior to returni
16b60 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ng..**.** If the
16b70 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 73 20   page record is 
16b80 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65 61  successfully rea
16b90 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d  d from the (sub-
16ba0 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a  )journal file.**
16bb0 20 61 6e 64 20 70 6c 61 79 65 64 20 62 61 63 6b   and played back
16bc0 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b  , then SQLITE_OK
16bd0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
16be0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
16bf0 75 72 73 0a 2a 2a 20 77 68 69 6c 65 20 72 65 61  urs.** while rea
16c00 64 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64 20  ding the record 
16c10 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a  from the (sub-)j
16c20 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77  ournal file or w
16c30 68 69 6c 65 20 77 72 69 74 69 6e 67 0a 2a 2a 20  hile writing.** 
16c40 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
16c50 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 49  file, then the I
16c60 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
16c70 72 65 74 75 72 6e 65 64 2e 20 49 66 20 64 61 74  returned. If dat
16c80 61 0a 2a 2a 20 69 73 20 73 75 63 63 65 73 73 66  a.** is successf
16c90 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 74  ully read from t
16ca0 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c  he (sub-)journal
16cb0 20 66 69 6c 65 20 62 75 74 20 61 70 70 65 61 72   file but appear
16cc0 73 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 72 72 75  s to be.** corru
16cd0 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e  pted, SQLITE_DON
16ce0 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 44  E is returned. D
16cf0 61 74 61 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ata is considere
16d00 64 20 63 6f 72 72 75 70 74 65 64 20 69 6e 0a 2a  d corrupted in.*
16d10 2a 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e  * two circumstan
16d20 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20  ces:.** .**   * 
16d30 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 70 61  If the record pa
16d40 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 69 6c 6c  ge-number is ill
16d50 65 67 61 6c 20 28 30 20 6f 72 20 50 41 47 45 52  egal (0 or PAGER
16d60 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a  _MJ_PGNO), or.**
16d70 20 20 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f     * If the reco
16d80 72 64 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c  rd is being roll
16d90 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  ed back from the
16da0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   main journal fi
16db0 6c 65 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74 68  le.**     and th
16dc0 65 20 63 68 65 63 6b 73 75 6d 20 66 69 65 6c 64  e checksum field
16dd0 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
16de0 74 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 74 65  the record conte
16df0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65  nt..**.** Neithe
16e00 72 20 6f 66 20 74 68 65 73 65 20 74 77 6f 20 73  r of these two s
16e10 63 65 6e 61 72 69 6f 73 20 61 72 65 20 70 6f 73  cenarios are pos
16e20 73 69 62 6c 65 20 64 75 72 69 6e 67 20 61 20 73  sible during a s
16e30 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63  avepoint rollbac
16e40 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  k..**.** If this
16e50 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20   is a savepoint 
16e60 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 6d  rollback, then m
16e70 65 6d 6f 72 79 20 6d 61 79 20 68 61 76 65 20 74  emory may have t
16e80 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79  o be dynamically
16e90 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  .** allocated by
16ea0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
16eb0 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  If this is the c
16ec0 61 73 65 20 61 6e 64 20 61 6e 20 61 6c 6c 6f 63  ase and an alloc
16ed0 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20  ation fails,.** 
16ee0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20  SQLITE_NOMEM is 
16ef0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
16f00 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c  tic int pager_pl
16f10 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
16f20 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
16f30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
16f40 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 62 65   /* The pager be
16f50 69 6e 67 20 70 6c 61 79 65 64 20 62 61 63 6b 20  ing played back 
16f60 2a 2f 0a 20 20 69 36 34 20 2a 70 4f 66 66 73 65  */.  i64 *pOffse
16f70 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
16f80 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
16f90 72 65 63 6f 72 64 20 74 6f 20 70 6c 61 79 62 61  record to playba
16fa0 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  ck */.  Bitvec *
16fb0 70 44 6f 6e 65 2c 20 20 20 20 20 20 20 20 20 20  pDone,          
16fc0 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20        /* Bitvec 
16fd0 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61 64 79  of pages already
16fe0 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a   played back */.
16ff0 20 20 69 6e 74 20 69 73 4d 61 69 6e 4a 72 6e 6c    int isMainJrnl
17000 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
17010 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75  /* 1 -> main jou
17020 72 6e 61 6c 2e 20 30 20 2d 3e 20 73 75 62 2d 6a  rnal. 0 -> sub-j
17030 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74  ournal. */.  int
17040 20 69 73 53 61 76 65 70 6e 74 20 20 20 20 20 20   isSavepnt      
17050 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
17060 75 65 20 66 6f 72 20 61 20 73 61 76 65 70 6f 69  ue for a savepoi
17070 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 29  nt rollback */.)
17080 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  {.  int rc;.  Pg
17090 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20  Hdr *pPg;       
170a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
170b0 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 20  n existing page 
170c0 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a  in the cache */.
170d0 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20    Pgno pgno;    
170e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
170f0 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  /* The page numb
17100 65 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20  er of a page in 
17110 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
17120 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20   cksum;         
17130 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
17140 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20  ecksum used for 
17150 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
17160 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44 61 74 61  */.  char *aData
17170 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17180 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20     /* Temporary 
17190 73 74 6f 72 61 67 65 20 66 6f 72 20 74 68 65 20  storage for the 
171a0 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  page */.  sqlite
171b0 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20  3_file *jfd;    
171c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
171d0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
171e0 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  or the journal f
171f0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53  ile */.  int isS
17200 79 6e 63 65 64 3b 20 20 20 20 20 20 20 20 20 20  ynced;          
17210 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
17220 66 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 69  f journal page i
17230 73 20 73 79 6e 63 65 64 20 2a 2f 0a 23 69 66 64  s synced */.#ifd
17240 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
17250 44 45 43 0a 20 20 2f 2a 20 54 68 65 20 6a 72 6e  DEC.  /* The jrn
17260 6c 45 6e 63 20 66 6c 61 67 20 69 73 20 74 72 75  lEnc flag is tru
17270 65 20 69 66 20 4a 6f 75 72 6e 61 6c 20 70 61 67  e if Journal pag
17280 65 73 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73  es should be pas
17290 73 65 64 20 74 68 72 6f 75 67 68 0a 20 20 2a 2a  sed through.  **
172a0 20 74 68 65 20 63 6f 64 65 63 2e 20 20 49 74 20   the codec.  It 
172b0 69 73 20 66 61 6c 73 65 20 66 6f 72 20 70 75 72  is false for pur
172c0 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72  e in-memory jour
172d0 6e 61 6c 73 2e 20 2a 2f 0a 20 20 63 6f 6e 73 74  nals. */.  const
172e0 20 69 6e 74 20 6a 72 6e 6c 45 6e 63 20 3d 20 28   int jrnlEnc = (
172f0 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20 70 50  isMainJrnl || pP
17300 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f  ager->subjInMemo
17310 72 79 3d 3d 30 29 3b 0a 23 65 6e 64 69 66 0a 0a  ry==0);.#endif..
17320 20 20 61 73 73 65 72 74 28 20 28 69 73 4d 61 69    assert( (isMai
17330 6e 4a 72 6e 6c 26 7e 31 29 3d 3d 30 20 29 3b 20  nJrnl&~1)==0 ); 
17340 20 20 20 20 20 2f 2a 20 69 73 4d 61 69 6e 4a 72       /* isMainJr
17350 6e 6c 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a  nl is 0 or 1 */.
17360 20 20 61 73 73 65 72 74 28 20 28 69 73 53 61 76    assert( (isSav
17370 65 70 6e 74 26 7e 31 29 3d 3d 30 20 29 3b 20 20  epnt&~1)==0 );  
17380 20 20 20 20 20 2f 2a 20 69 73 53 61 76 65 70 6e       /* isSavepn
17390 74 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20  t is 0 or 1 */. 
173a0 20 61 73 73 65 72 74 28 20 69 73 4d 61 69 6e 4a   assert( isMainJ
173b0 72 6e 6c 20 7c 7c 20 70 44 6f 6e 65 20 29 3b 20  rnl || pDone ); 
173c0 20 20 20 20 2f 2a 20 70 44 6f 6e 65 20 61 6c 77      /* pDone alw
173d0 61 79 73 20 75 73 65 64 20 6f 6e 20 73 75 62 2d  ays used on sub-
173e0 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 61 73  journals */.  as
173f0 73 65 72 74 28 20 69 73 53 61 76 65 70 6e 74 20  sert( isSavepnt 
17400 7c 7c 20 70 44 6f 6e 65 3d 3d 30 20 29 3b 20 20  || pDone==0 );  
17410 20 2f 2a 20 70 44 6f 6e 65 20 6e 65 76 65 72 20   /* pDone never 
17420 75 73 65 64 20 6f 6e 20 6e 6f 6e 2d 73 61 76 65  used on non-save
17430 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 61 44 61 74  point */..  aDat
17440 61 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  a = pPager->pTmp
17450 53 70 61 63 65 3b 0a 20 20 61 73 73 65 72 74 28  Space;.  assert(
17460 20 61 44 61 74 61 20 29 3b 20 20 20 20 20 20 20   aData );       
17470 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67    /* Temp storag
17480 65 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65  e must have alre
17490 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
174a0 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ed */.  assert( 
174b0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
174c0 65 72 29 3d 3d 30 20 7c 7c 20 28 21 69 73 4d 61  er)==0 || (!isMa
174d0 69 6e 4a 72 6e 6c 20 26 26 20 69 73 53 61 76 65  inJrnl && isSave
174e0 70 6e 74 29 20 29 3b 0a 0a 20 20 2f 2a 20 45 69  pnt) );..  /* Ei
174f0 74 68 65 72 20 74 68 65 20 73 74 61 74 65 20 69  ther the state i
17500 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 50  s greater than P
17510 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
17520 45 4d 4f 44 20 28 61 20 74 72 61 6e 73 61 63 74  EMOD (a transact
17530 69 6f 6e 20 0a 20 20 2a 2a 20 6f 72 20 73 61 76  ion .  ** or sav
17540 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20  epoint rollback 
17550 64 6f 6e 65 20 61 74 20 74 68 65 20 72 65 71 75  done at the requ
17560 65 73 74 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  est of the calle
17570 72 29 20 6f 72 20 74 68 69 73 20 69 73 0a 20 20  r) or this is.  
17580 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
17590 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 66 20 69 74   rollback. If it
175a0 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   is a hot-journa
175b0 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20  l rollback, the 
175c0 70 61 67 65 72 0a 20 20 2a 2a 20 69 73 20 69 6e  pager.  ** is in
175d0 20 73 74 61 74 65 20 4f 50 45 4e 20 61 6e 64 20   state OPEN and 
175e0 68 6f 6c 64 73 20 61 6e 20 45 58 43 4c 55 53 49  holds an EXCLUSI
175f0 56 45 20 6c 6f 63 6b 2e 20 48 6f 74 2d 6a 6f 75  VE lock. Hot-jou
17600 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 0a 20 20  rnal rollback.  
17610 2a 2a 20 6f 6e 6c 79 20 72 65 61 64 73 20 66 72  ** only reads fr
17620 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  om the main jour
17630 6e 61 6c 2c 20 6e 6f 74 20 74 68 65 20 73 75 62  nal, not the sub
17640 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20  -journal..  */. 
17650 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
17660 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
17670 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20  RITER_CACHEMOD. 
17680 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72        || (pPager
17690 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
176a0 4f 50 45 4e 20 26 26 20 70 50 61 67 65 72 2d 3e  OPEN && pPager->
176b0 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
176c0 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 20 20 61 73  _LOCK).  );.  as
176d0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
176e0 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
176f0 45 52 5f 43 41 43 48 45 4d 4f 44 20 7c 7c 20 69  ER_CACHEMOD || i
17700 73 4d 61 69 6e 4a 72 6e 6c 20 29 3b 0a 0a 20 20  sMainJrnl );..  
17710 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65  /* Read the page
17720 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65   number and page
17730 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6a   data from the j
17740 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f  ournal or sub-jo
17750 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 2e  urnal.  ** file.
17760 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
17770 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c   code to the cal
17780 6c 65 72 20 69 66 20 61 6e 20 49 4f 20 65 72 72  ler if an IO err
17790 6f 72 20 6f 63 63 75 72 73 2e 0a 20 20 2a 2f 0a  or occurs..  */.
177a0 20 20 6a 66 64 20 3d 20 69 73 4d 61 69 6e 4a 72    jfd = isMainJr
177b0 6e 6c 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64  nl ? pPager->jfd
177c0 20 3a 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 3b   : pPager->sjfd;
177d0 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
177e0 74 73 28 6a 66 64 2c 20 2a 70 4f 66 66 73 65 74  ts(jfd, *pOffset
177f0 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  , &pgno);.  if( 
17800 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
17810 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
17820 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
17830 6a 66 64 2c 20 28 75 38 2a 29 61 44 61 74 61 2c  jfd, (u8*)aData,
17840 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
17850 65 2c 20 28 2a 70 4f 66 66 73 65 74 29 2b 34 29  e, (*pOffset)+4)
17860 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
17870 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
17880 63 3b 0a 20 20 2a 70 4f 66 66 73 65 74 20 2b 3d  c;.  *pOffset +=
17890 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
178a0 65 20 2b 20 34 20 2b 20 69 73 4d 61 69 6e 4a 72  e + 4 + isMainJr
178b0 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69  nl*4;..  /* Sani
178c0 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74  ty checking on t
178d0 68 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 69  he page.  This i
178e0 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74  s more important
178f0 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c   that I original
17900 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e  ly.  ** thought.
17910 20 20 49 66 20 61 20 70 6f 77 65 72 20 66 61 69    If a power fai
17920 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c  lure occurs whil
17930 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  e the journal is
17940 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a   being written,.
17950 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61    ** it could ca
17960 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61  use invalid data
17970 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
17980 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  nto the journal.
17990 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a    We need to.  *
179a0 2a 20 64 65 74 65 63 74 20 74 68 69 73 20 69 6e  * detect this in
179b0 76 61 6c 69 64 20 64 61 74 61 20 28 77 69 74 68  valid data (with
179c0 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74   high probabilit
179d0 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74  y) and ignore it
179e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e  ..  */.  if( pgn
179f0 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41  o==0 || pgno==PA
17a00 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
17a10 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  er) ){.    asser
17a20 74 28 20 21 69 73 53 61 76 65 70 6e 74 20 29 3b  t( !isSavepnt );
17a30 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
17a40 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69  TE_DONE;.  }.  i
17a50 66 28 20 70 67 6e 6f 3e 28 50 67 6e 6f 29 70 50  f( pgno>(Pgno)pP
17a60 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 7c 7c 20  ager->dbSize || 
17a70 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
17a80 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 20 29  t(pDone, pgno) )
17a90 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
17aa0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
17ab0 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a  ( isMainJrnl ){.
17ac0 20 20 20 20 72 63 20 3d 20 72 65 61 64 33 32 62      rc = read32b
17ad0 69 74 73 28 6a 66 64 2c 20 28 2a 70 4f 66 66 73  its(jfd, (*pOffs
17ae0 65 74 29 2d 34 2c 20 26 63 6b 73 75 6d 29 3b 0a  et)-4, &cksum);.
17af0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
17b00 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20  urn rc;.    if( 
17b10 21 69 73 53 61 76 65 70 6e 74 20 26 26 20 70 61  !isSavepnt && pa
17b20 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72  ger_cksum(pPager
17b30 2c 20 28 75 38 2a 29 61 44 61 74 61 29 21 3d 63  , (u8*)aData)!=c
17b40 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 65  ksum ){.      re
17b50 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
17b60 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
17b70 2a 20 49 66 20 74 68 69 73 20 70 61 67 65 20 68  * If this page h
17b80 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
17b90 70 6c 61 79 65 64 20 62 61 63 6b 20 62 65 66 6f  played back befo
17ba0 72 65 20 64 75 72 69 6e 67 20 74 68 65 20 63 75  re during the cu
17bb0 72 72 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c 6c 62  rrent.  ** rollb
17bc0 61 63 6b 2c 20 74 68 65 6e 20 64 6f 6e 27 74 20  ack, then don't 
17bd0 62 6f 74 68 65 72 20 74 6f 20 70 6c 61 79 20 69  bother to play i
17be0 74 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 20 20  t back again..  
17bf0 2a 2f 0a 20 20 69 66 28 20 70 44 6f 6e 65 20 26  */.  if( pDone &
17c00 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42  & (rc = sqlite3B
17c10 69 74 76 65 63 53 65 74 28 70 44 6f 6e 65 2c 20  itvecSet(pDone, 
17c20 70 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45 5f 4f  pgno))!=SQLITE_O
17c30 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
17c40 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68  rc;.  }..  /* Wh
17c50 65 6e 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20  en playing back 
17c60 70 61 67 65 20 31 2c 20 72 65 73 74 6f 72 65 20  page 1, restore 
17c70 74 68 65 20 6e 52 65 73 65 72 76 65 20 73 65 74  the nReserve set
17c80 74 69 6e 67 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ting.  */.  if( 
17c90 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 67 65  pgno==1 && pPage
17ca0 72 2d 3e 6e 52 65 73 65 72 76 65 21 3d 28 28 75  r->nReserve!=((u
17cb0 38 2a 29 61 44 61 74 61 29 5b 32 30 5d 20 29 7b  8*)aData)[20] ){
17cc0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
17cd0 73 65 72 76 65 20 3d 20 28 28 75 38 2a 29 61 44  serve = ((u8*)aD
17ce0 61 74 61 29 5b 32 30 5d 3b 0a 20 20 20 20 70 61  ata)[20];.    pa
17cf0 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50  gerReportSize(pP
17d00 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ager);.  }..  /*
17d10 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
17d20 20 69 6e 20 43 41 43 48 45 4d 4f 44 20 73 74 61   in CACHEMOD sta
17d30 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d  te, then there m
17d40 75 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66  ust be a copy of
17d50 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20   this.  ** page 
17d60 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  in the pager cac
17d70 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  he. In this case
17d80 20 6a 75 73 74 20 75 70 64 61 74 65 20 74 68 65   just update the
17d90 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20   pager cache,.  
17da0 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62  ** not the datab
17db0 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61  ase file. The pa
17dc0 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65  ge is left marke
17dd0 64 20 64 69 72 74 79 20 69 6e 20 74 68 69 73 20  d dirty in this 
17de0 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  case..  **.  ** 
17df0 41 6e 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20  An exception to 
17e00 74 68 65 20 61 62 6f 76 65 20 72 75 6c 65 3a 20  the above rule: 
17e10 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
17e20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  is in no-sync mo
17e30 64 65 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 61  de.  ** and a pa
17e40 67 65 20 69 73 20 6d 6f 76 65 64 20 64 75 72 69  ge is moved duri
17e50 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  ng an incrementa
17e60 6c 20 76 61 63 75 75 6d 20 74 68 65 6e 20 74 68  l vacuum then th
17e70 65 20 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20  e page may.  ** 
17e80 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20 70 61  not be in the pa
17e90 67 65 72 20 63 61 63 68 65 2e 20 4c 61 74 65 72  ger cache. Later
17ea0 3a 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20  : if a malloc() 
17eb0 6f 72 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  or IO error occu
17ec0 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 61  rs.  ** during a
17ed0 20 4d 6f 76 65 70 61 67 65 28 29 20 63 61 6c 6c   Movepage() call
17ee0 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  , then the page 
17ef0 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 20 74 68  may not be in th
17f00 65 20 63 61 63 68 65 0a 20 20 2a 2a 20 65 69 74  e cache.  ** eit
17f10 68 65 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64  her. So the cond
17f20 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20  ition described 
17f30 69 6e 20 74 68 65 20 61 62 6f 76 65 20 70 61 72  in the above par
17f40 61 67 72 61 70 68 20 69 73 20 6e 6f 74 0a 20 20  agraph is not.  
17f50 2a 2a 20 61 73 73 65 72 74 28 29 61 62 6c 65 2e  ** assert()able.
17f60 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e  .  **.  ** If in
17f70 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 2c 20 57   WRITER_DBMOD, W
17f80 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 6f  RITER_FINISHED o
17f90 72 20 4f 50 45 4e 20 73 74 61 74 65 2c 20 74 68  r OPEN state, th
17fa0 65 6e 20 77 65 20 75 70 64 61 74 65 20 74 68 65  en we update the
17fb0 0a 20 20 2a 2a 20 70 61 67 65 72 20 63 61 63 68  .  ** pager cach
17fc0 65 20 69 66 20 69 74 20 65 78 69 73 74 73 20 61  e if it exists a
17fd0 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65  nd the main file
17fe0 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 74 68  . The page is th
17ff0 65 6e 20 6d 61 72 6b 65 64 20 0a 20 20 2a 2a 20  en marked .  ** 
18000 6e 6f 74 20 64 69 72 74 79 2e 20 53 69 6e 63 65  not dirty. Since
18010 20 74 68 69 73 20 63 6f 64 65 20 69 73 20 6f 6e   this code is on
18020 6c 79 20 65 78 65 63 75 74 65 64 20 69 6e 20 50  ly executed in P
18030 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 20  AGER_OPEN state 
18040 66 6f 72 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a  for.  ** a hot-j
18050 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c  ournal rollback,
18060 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   it is guarantee
18070 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d  d that the page-
18080 63 61 63 68 65 20 69 73 20 65 6d 70 74 79 0a 20  cache is empty. 
18090 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 72   ** if the pager
180a0 20 69 73 20 69 6e 20 4f 50 45 4e 20 73 74 61 74   is in OPEN stat
180b0 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63  e..  **.  ** Tic
180c0 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68 65 20  ket #1171:  The 
180d0 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
180e0 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  l might contain 
180f0 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61  page content tha
18100 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72  t is.  ** differ
18110 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ent from the pag
18120 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65  e content at the
18130 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
18140 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  ansaction..  ** 
18150 54 68 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e  This occurs when
18160 20 61 20 70 61 67 65 20 69 73 20 63 68 61 6e 67   a page is chang
18170 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
18180 73 74 61 72 74 20 6f 66 20 61 20 73 74 61 74 65  start of a state
18190 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63  ment.  ** then c
181a0 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74  hanged again wit
181b0 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hin the statemen
181c0 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67  t.  When rolling
181d0 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a   back such a.  *
181e0 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d  * statement we m
181f0 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f  ust not write to
18200 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
18210 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65  tabase unless we
18220 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63   know.  ** for c
18230 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67  ertain that orig
18240 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e  inal page conten
18250 74 73 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e  ts are synced in
18260 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  to the main roll
18270 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  back.  ** journa
18280 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61  l.  Otherwise, a
18290 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68   power loss migh
182a0 74 20 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64  t leave modified
182b0 20 64 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a   data in the.  *
182c0 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
182d0 77 69 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79  without an entry
182e0 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   in the rollback
182f0 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61   journal that ca
18300 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74  n.  ** restore t
18310 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69  he database to i
18320 74 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d  ts original form
18330 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e  .  Two condition
18340 73 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d  s must be.  ** m
18350 65 74 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  et before writin
18360 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
18370 65 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65  e files. (1) the
18380 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
18390 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20  e.  ** locked.  
183a0 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74  (2) we know that
183b0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
183c0 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75  ge content is fu
183d0 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20  lly synced.  ** 
183e0 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  in the main jour
183f0 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63 61 75  nal either becau
18400 73 65 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  se the page is n
18410 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65  ot in cache or e
18420 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  lse.  ** the pag
18430 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e  e is marked as n
18440 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a  eedSync==0..  **
18450 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31 34  .  ** 2008-04-14
18460 3a 20 20 57 68 65 6e 20 61 74 74 65 6d 70 74 69  :  When attempti
18470 6e 67 20 74 6f 20 76 61 63 75 75 6d 20 61 20 63  ng to vacuum a c
18480 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  orrupt database 
18490 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69 73  file, it.  ** is
184a0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 66 61 69   possible to fai
184b0 6c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e  l a statement on
184c0 20 61 20 64 61 74 61 62 61 73 65 20 74 68 61 74   a database that
184d0 20 64 6f 65 73 20 6e 6f 74 20 79 65 74 20 65 78   does not yet ex
184e0 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74  ist..  ** Do not
184f0 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74   attempt to writ
18500 65 20 69 66 20 64 61 74 61 62 61 73 65 20 66 69  e if database fi
18510 6c 65 20 68 61 73 20 6e 65 76 65 72 20 62 65 65  le has never bee
18520 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20  n opened..  */. 
18530 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
18540 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
18550 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  pPg = 0;.  }else
18560 7b 0a 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69  {.    pPg = sqli
18570 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70  te3PagerLookup(p
18580 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
18590 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 20  }.  assert( pPg 
185a0 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61  || !MEMDB );.  a
185b0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
185c0 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45  State!=PAGER_OPE
185d0 4e 20 7c 7c 20 70 50 67 3d 3d 30 20 7c 7c 20 70  N || pPg==0 || p
185e0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
185f0 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  );.  PAGERTRACE(
18600 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61  ("PLAYBACK %d pa
18610 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29  ge %d hash(%08x)
18620 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
18630 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
18640 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f  r), pgno, pager_
18650 64 61 74 61 68 61 73 68 28 70 50 61 67 65 72 2d  datahash(pPager-
18660 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 38 2a 29  >pageSize, (u8*)
18670 61 44 61 74 61 29 2c 0a 20 20 20 20 20 20 20 20  aData),.        
18680 20 20 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f 22     (isMainJrnl?"
18690 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22 73  main-journal":"s
186a0 75 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20 20 29  ub-journal").  )
186b0 29 3b 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a  );.  if( isMainJ
186c0 72 6e 6c 20 29 7b 0a 20 20 20 20 69 73 53 79 6e  rnl ){.    isSyn
186d0 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f  ced = pPager->no
186e0 53 79 6e 63 20 7c 7c 20 28 2a 70 4f 66 66 73 65  Sync || (*pOffse
186f0 74 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  t <= pPager->jou
18700 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 65 6c 73  rnalHdr);.  }els
18710 65 7b 0a 20 20 20 20 69 73 53 79 6e 63 65 64 20  e{.    isSynced 
18720 3d 20 28 70 50 67 3d 3d 30 20 7c 7c 20 30 3d 3d  = (pPg==0 || 0==
18730 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47  (pPg->flags & PG
18740 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 29 3b  HDR_NEED_SYNC));
18750 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4f 70 65  .  }.  if( isOpe
18760 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 0a 20 20  n(pPager->fd).  
18770 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74   && (pPager->eSt
18780 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
18790 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65  R_DBMOD || pPage
187a0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
187b0 5f 4f 50 45 4e 29 0a 20 20 20 26 26 20 69 73 53  _OPEN).   && isS
187c0 79 6e 63 65 64 0a 20 20 29 7b 0a 20 20 20 20 69  ynced.  ){.    i
187d0 36 34 20 6f 66 73 74 20 3d 20 28 70 67 6e 6f 2d  64 ofst = (pgno-
187e0 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
187f0 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 74 65  pageSize;.    te
18800 73 74 63 61 73 65 28 20 21 69 73 53 61 76 65 70  stcase( !isSavep
18810 6e 74 20 26 26 20 70 50 67 21 3d 30 20 26 26 20  nt && pPg!=0 && 
18820 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
18830 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30 20  R_NEED_SYNC)!=0 
18840 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
18850 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
18860 65 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 57  er) );..    /* W
18870 72 69 74 65 20 74 68 65 20 64 61 74 61 20 72 65  rite the data re
18880 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
18890 6e 61 6c 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  nal back into th
188a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
188b0 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20  .    ** This is 
188c0 75 73 75 61 6c 6c 79 20 73 61 66 65 20 65 76 65  usually safe eve
188d0 6e 20 66 6f 72 20 61 6e 20 65 6e 63 72 79 70 74  n for an encrypt
188e0 65 64 20 64 61 74 61 62 61 73 65 20 2d 20 61 73  ed database - as
188f0 20 74 68 65 20 64 61 74 61 0a 20 20 20 20 2a 2a   the data.    **
18900 20 77 61 73 20 65 6e 63 72 79 70 74 65 64 20 62   was encrypted b
18910 65 66 6f 72 65 20 69 74 20 77 61 73 20 77 72 69  efore it was wri
18920 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
18930 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 65 78  nal file. The ex
18940 63 65 70 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 69  ception.    ** i
18950 73 20 69 66 20 74 68 65 20 64 61 74 61 20 77 61  s if the data wa
18960 73 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d  s just read from
18970 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 75   an in-memory su
18980 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 74 68  b-journal. In th
18990 61 74 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 69  at.    ** case i
189a0 74 20 6d 75 73 74 20 62 65 20 65 6e 63 72 79 70  t must be encryp
189b0 74 65 64 20 68 65 72 65 20 62 65 66 6f 72 65 20  ted here before 
189c0 69 74 20 69 73 20 63 6f 70 69 65 64 20 69 6e 74  it is copied int
189d0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  o the database. 
189e0 20 20 20 2a 2a 20 66 69 6c 65 2e 20 20 2a 2f 0a     ** file.  */.
189f0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
18a00 53 5f 43 4f 44 45 43 0a 20 20 20 20 69 66 28 20  S_CODEC.    if( 
18a10 21 6a 72 6e 6c 45 6e 63 20 29 7b 0a 20 20 20 20  !jrnlEnc ){.    
18a20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c    CODEC2(pPager,
18a30 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 37 2c   aData, pgno, 7,
18a40 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   rc=SQLITE_NOMEM
18a50 5f 42 4b 50 54 2c 20 61 44 61 74 61 29 3b 0a 20  _BKPT, aData);. 
18a60 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
18a70 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
18a80 3e 66 64 2c 20 28 75 38 20 2a 29 61 44 61 74 61  >fd, (u8 *)aData
18a90 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
18aa0 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20 20  ze, ofst);.     
18ab0 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
18ac0 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20  aData, pgno, 3, 
18ad0 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rc=SQLITE_NOMEM_
18ae0 42 4b 50 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65  BKPT);.    }else
18af0 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d  .#endif.    rc =
18b00 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
18b10 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 75 38 20  pPager->fd, (u8 
18b20 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  *)aData, pPager-
18b30 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 73 74 29  >pageSize, ofst)
18b40 3b 0a 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e  ;..    if( pgno>
18b50 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
18b60 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  ze ){.      pPag
18b70 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d  er->dbFileSize =
18b80 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20   pgno;.    }.   
18b90 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 42 61   if( pPager->pBa
18ba0 63 6b 75 70 20 29 7b 0a 23 69 66 64 65 66 20 53  ckup ){.#ifdef S
18bb0 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
18bc0 20 20 20 20 20 20 69 66 28 20 6a 72 6e 6c 45 6e        if( jrnlEn
18bd0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 43 4f 44  c ){.        COD
18be0 45 43 31 28 70 50 61 67 65 72 2c 20 61 44 61 74  EC1(pPager, aDat
18bf0 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53  a, pgno, 3, rc=S
18c00 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
18c10 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
18c20 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 70  e3BackupUpdate(p
18c30 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20  Pager->pBackup, 
18c40 70 67 6e 6f 2c 20 28 75 38 2a 29 61 44 61 74 61  pgno, (u8*)aData
18c50 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43  );.        CODEC
18c60 32 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c  2(pPager, aData,
18c70 20 70 67 6e 6f 2c 20 37 2c 20 72 63 3d 53 51 4c   pgno, 7, rc=SQL
18c80 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 61  ITE_NOMEM_BKPT,a
18c90 44 61 74 61 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Data);.      }el
18ca0 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  se.#endif.      
18cb0 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64  sqlite3BackupUpd
18cc0 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63  ate(pPager->pBac
18cd0 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29  kup, pgno, (u8*)
18ce0 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  aData);.    }.  
18cf0 7d 65 6c 73 65 20 69 66 28 20 21 69 73 4d 61 69  }else if( !isMai
18d00 6e 4a 72 6e 6c 20 26 26 20 70 50 67 3d 3d 30 20  nJrnl && pPg==0 
18d10 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ){.    /* If thi
18d20 73 20 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20  s is a rollback 
18d30 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 61  of a savepoint a
18d40 6e 64 20 64 61 74 61 20 77 61 73 20 6e 6f 74 20  nd data was not 
18d50 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 2a  written to.    *
18d60 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  * the database a
18d70 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  nd the page is n
18d80 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20 74 68  ot in-memory, th
18d90 65 72 65 20 69 73 20 61 20 70 6f 74 65 6e 74 69  ere is a potenti
18da0 61 6c 0a 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65  al.    ** proble
18db0 6d 2e 20 57 68 65 6e 20 74 68 65 20 70 61 67 65  m. When the page
18dc0 20 69 73 20 6e 65 78 74 20 66 65 74 63 68 65 64   is next fetched
18dd0 20 62 79 20 74 68 65 20 62 2d 74 72 65 65 20 6c   by the b-tree l
18de0 61 79 65 72 2c 20 69 74 20 0a 20 20 20 20 2a 2a  ayer, it .    **
18df0 20 77 69 6c 6c 20 62 65 20 72 65 61 64 20 66 72   will be read fr
18e00 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
18e10 66 69 6c 65 2c 20 77 68 69 63 68 20 6d 61 79 20  file, which may 
18e20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 0a 20  or may not be . 
18e30 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 2e 20 0a     ** current. .
18e40 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
18e50 65 72 65 20 61 72 65 20 61 20 63 6f 75 70 6c 65  ere are a couple
18e60 20 6f 66 20 64 69 66 66 65 72 65 6e 74 20 77 61   of different wa
18e70 79 73 20 74 68 69 73 20 63 61 6e 20 68 61 70 70  ys this can happ
18e80 65 6e 2e 20 41 6c 6c 20 61 72 65 20 71 75 69 74  en. All are quit
18e90 65 0a 20 20 20 20 2a 2a 20 6f 62 73 63 75 72 65  e.    ** obscure
18ea0 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69  . When running i
18eb0 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f  n synchronous mo
18ec0 64 65 2c 20 74 68 69 73 20 63 61 6e 20 6f 6e 6c  de, this can onl
18ed0 79 20 68 61 70 70 65 6e 20 0a 20 20 20 20 2a 2a  y happen .    **
18ee0 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
18ef0 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
18f00 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
18f10 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
18f20 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 70 6f  , then.    ** po
18f30 70 75 6c 61 74 65 64 2c 20 74 68 65 6e 20 6d 6f  pulated, then mo
18f40 76 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ved using sqlite
18f50 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 29  3PagerMovepage()
18f60 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
18f70 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20  The solution is 
18f80 74 6f 20 61 64 64 20 61 6e 20 69 6e 2d 6d 65 6d  to add an in-mem
18f90 6f 72 79 20 70 61 67 65 20 74 6f 20 74 68 65 20  ory page to the 
18fa0 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 69 6e 67  cache containing
18fb0 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61  .    ** the data
18fc0 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20   just read from 
18fd0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  the sub-journal.
18fe0 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   Mark the page a
18ff0 73 20 64 69 72 74 79 20 0a 20 20 20 20 2a 2a 20  s dirty .    ** 
19000 61 6e 64 20 69 66 20 74 68 65 20 70 61 67 65 72  and if the pager
19010 20 72 65 71 75 69 72 65 73 20 61 20 6a 6f 75 72   requires a jour
19020 6e 61 6c 2d 73 79 6e 63 2c 20 74 68 65 6e 20 6d  nal-sync, then m
19030 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
19040 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 69 6e  .    ** requirin
19050 67 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63  g a journal-sync
19060 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 77 72   before it is wr
19070 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  itten..    */.  
19080 20 20 61 73 73 65 72 74 28 20 69 73 53 61 76 65    assert( isSave
19090 70 6e 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72  pnt );.    asser
190a0 74 28 20 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  t( (pPager->doNo
190b0 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c  tSpill & SPILLFL
190c0 41 47 5f 52 4f 4c 4c 42 41 43 4b 29 3d 3d 30 20  AG_ROLLBACK)==0 
190d0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
190e0 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20 53 50 49  oNotSpill |= SPI
190f0 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 3b  LLFLAG_ROLLBACK;
19100 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
19110 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72  3PagerGet(pPager
19120 2c 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20 31 29  , pgno, &pPg, 1)
19130 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
19140 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
19150 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f  l & SPILLFLAG_RO
19160 4c 4c 42 41 43 4b 29 21 3d 30 20 29 3b 0a 20 20  LLBACK)!=0 );.  
19170 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53    pPager->doNotS
19180 70 69 6c 6c 20 26 3d 20 7e 53 50 49 4c 4c 46 4c  pill &= ~SPILLFL
19190 41 47 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20  AG_ROLLBACK;.   
191a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
191b0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
191c0 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
191d0 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b  eMakeDirty(pPg);
191e0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 20 29  .  }.  if( pPg )
191f0 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65  {.    /* No page
19200 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62 65 20   should ever be 
19210 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c 6c 65  explicitly rolle
19220 64 20 62 61 63 6b 20 74 68 61 74 20 69 73 20 69  d back that is i
19230 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a 20 20  n use, except.  
19240 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20 31 20    ** for page 1 
19250 77 68 69 63 68 20 69 73 20 68 65 6c 64 20 69 6e  which is held in
19260 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20 74 6f   use in order to
19270 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f   keep the lock o
19280 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  n the.    ** dat
19290 61 62 61 73 65 20 61 63 74 69 76 65 2e 20 48 6f  abase active. Ho
192a0 77 65 76 65 72 20 73 75 63 68 20 61 20 70 61 67  wever such a pag
192b0 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65 64 20  e may be rolled 
192c0 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74  back as a result
192d0 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20 69 6e  .    ** of an in
192e0 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72 65 73  ternal error res
192f0 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61 75 74  ulting in an aut
19300 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f 0a 20  omatic call to. 
19310 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67     ** sqlite3Pag
19320 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20 20  erRollback()..  
19330 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70    */.    void *p
19340 44 61 74 61 3b 0a 20 20 20 20 70 44 61 74 61 20  Data;.    pData 
19350 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20  = pPg->pData;.  
19360 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20    memcpy(pData, 
19370 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67  (u8*)aData, pPag
19380 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
19390 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e     pPager->xRein
193a0 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20 2f  iter(pPg);.    /
193b0 2a 20 49 74 20 75 73 65 64 20 74 6f 20 62 65 20  * It used to be 
193c0 74 68 61 74 20 73 71 6c 69 74 65 33 50 63 61 63  that sqlite3Pcac
193d0 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29  heMakeClean(pPg)
193e0 20 77 61 73 20 63 61 6c 6c 65 64 20 68 65 72 65   was called here
193f0 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a 20 74 68  .  But.    ** th
19400 61 74 20 63 61 6c 6c 20 77 61 73 20 64 61 6e 67  at call was dang
19410 65 72 6f 75 73 20 61 6e 64 20 68 61 64 20 6e 6f  erous and had no
19420 20 64 65 74 65 63 74 61 62 6c 65 20 62 65 6e 65   detectable bene
19430 66 69 74 20 73 69 6e 63 65 20 74 68 65 20 63 61  fit since the ca
19440 63 68 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f  che.    ** is no
19450 72 6d 61 6c 6c 79 20 63 6c 65 61 6e 65 64 20 62  rmally cleaned b
19460 79 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43  y sqlite3PcacheC
19470 6c 65 61 6e 41 6c 6c 28 29 20 61 66 74 65 72 20  leanAll() after 
19480 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 73 6f 0a  rollback and so.
19490 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20      ** has been 
194a0 72 65 6d 6f 76 65 64 2e 20 2a 2f 0a 20 20 20 20  removed. */.    
194b0 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61  pager_set_pageha
194c0 73 68 28 70 50 67 29 3b 0a 0a 20 20 20 20 2f 2a  sh(pPg);..    /*
194d0 20 49 66 20 74 68 69 73 20 77 61 73 20 70 61 67   If this was pag
194e0 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f 72  e 1, then restor
194f0 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50  e the value of P
19500 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 2e  ager.dbFileVers.
19510 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73 20  .    ** Do this 
19520 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f 64  before any decod
19530 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ing. */.    if( 
19540 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20  pgno==1 ){.     
19550 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
19560 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28  >dbFileVers, &((
19570 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c 73  u8*)pData)[24],s
19580 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62  izeof(pPager->db
19590 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20  FileVers));.    
195a0 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65  }..    /* Decode
195b0 20 74 68 65 20 70 61 67 65 20 6a 75 73 74 20 72   the page just r
195c0 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a 2f  ead from disk */
195d0 0a 23 69 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  .#if SQLITE_HAS_
195e0 43 4f 44 45 43 0a 20 20 20 20 69 66 28 20 6a 72  CODEC.    if( jr
195f0 6e 6c 45 6e 63 20 29 7b 20 43 4f 44 45 43 31 28  nlEnc ){ CODEC1(
19600 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
19610 50 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72 63 3d  Pg->pgno, 3, rc=
19620 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
19630 54 29 3b 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20  T); }.#endif.   
19640 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
19650 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a  lease(pPg);.  }.
19660 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
19670 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  /*.** Parameter 
19680 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65 20 6e  zMaster is the n
19690 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20  ame of a master 
196a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20  journal file. A 
196b0 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a  single journal.*
196c0 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65 66 65  * file that refe
196d0 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74  rred to the mast
196e0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
196f0 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f  has just been ro
19700 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68  lled back..** Th
19710 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
19720 73 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69  s if it is possi
19730 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68  ble to delete th
19740 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
19750 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f   file,.** and do
19760 65 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a  es so if it is..
19770 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a  **.** Argument z
19780 4d 61 73 74 65 72 20 6d 61 79 20 70 6f 69 6e 74  Master may point
19790 20 74 6f 20 50 61 67 65 72 2e 70 54 6d 70 53 70   to Pager.pTmpSp
197a0 61 63 65 2e 20 53 6f 20 74 68 61 74 20 62 75 66  ace. So that buf
197b0 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61  fer is not .** a
197c0 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65  vailable for use
197d0 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e   within this fun
197e0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  ction..**.** Whe
197f0 6e 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  n a master journ
19800 61 6c 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  al file is creat
19810 65 64 2c 20 69 74 20 69 73 20 70 6f 70 75 6c 61  ed, it is popula
19820 74 65 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d  ted with the nam
19830 65 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66  es .** of all of
19840 20 69 74 73 20 63 68 69 6c 64 20 6a 6f 75 72 6e   its child journ
19850 61 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72 20 61  als, one after a
19860 6e 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74 74 65  nother, formatte
19870 64 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a 20 65  d as utf-8 .** e
19880 6e 63 6f 64 65 64 20 74 65 78 74 2e 20 54 68 65  ncoded text. The
19890 20 65 6e 64 20 6f 66 20 65 61 63 68 20 63 68 69   end of each chi
198a0 6c 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ld journal file 
198b0 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20 61  is marked with a
198c0 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61   .** nul-termina
198d0 74 6f 72 20 62 79 74 65 20 28 30 78 30 30 29 2e  tor byte (0x00).
198e0 20 69 2e 65 2e 20 74 68 65 20 65 6e 74 69 72 65   i.e. the entire
198f0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 6d   contents of a m
19900 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  aster journal.**
19910 20 66 69 6c 65 20 66 6f 72 20 61 20 74 72 61 6e   file for a tran
19920 73 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76 69 6e  saction involvin
19930 67 20 74 77 6f 20 64 61 74 61 62 61 73 65 73 20  g two databases 
19940 6d 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a 2a 20  might be:.**.** 
19950 20 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 61 2e    "/home/bill/a.
19960 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 2f 68  db-journal\x00/h
19970 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d 6a 6f  ome/bill/b.db-jo
19980 75 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a 2a 2a  urnal\x00".**.**
19990 20 41 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   A master journa
199a0 6c 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c 79 20  l file may only 
199b0 62 65 20 64 65 6c 65 74 65 64 20 6f 6e 63 65 20  be deleted once 
199c0 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64  all of its child
199d0 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20 68 61   .** journals ha
199e0 76 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62  ve been rolled b
199f0 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ack..**.** This 
19a00 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 73 20 74  function reads t
19a10 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
19a20 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
19a30 6c 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a 2a 20  l file into .** 
19a40 6d 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f 70 73  memory and loops
19a50 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 6f 66   through each of
19a60 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e   the child journ
19a70 61 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a 2a 2a  al names. For.**
19a80 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72   each child jour
19a90 6e 61 6c 2c 20 69 74 20 63 68 65 63 6b 73 20 69  nal, it checks i
19aa0 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69 66 20  f:.**.**   * if 
19ab0 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  the child journa
19ac0 6c 20 65 78 69 73 74 73 2c 20 61 6e 64 20 69 66  l exists, and if
19ad0 20 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68   so.**   * if th
19ae0 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  e child journal 
19af0 63 6f 6e 74 61 69 6e 73 20 61 20 72 65 66 65 72  contains a refer
19b00 65 6e 63 65 20 74 6f 20 6d 61 73 74 65 72 20 6a  ence to master j
19b10 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 66  ournal .**     f
19b20 69 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a 0a 2a  ile zMaster.**.*
19b30 2a 20 49 66 20 61 20 63 68 69 6c 64 20 6a 6f 75  * If a child jou
19b40 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e  rnal can be foun
19b50 64 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 62  d that matches b
19b60 6f 74 68 20 6f 66 20 74 68 65 20 63 72 69 74 65  oth of the crite
19b70 72 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68  ria.** above, th
19b80 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
19b90 72 6e 73 20 77 69 74 68 6f 75 74 20 64 6f 69 6e  rns without doin
19ba0 67 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74 68 65  g anything. Othe
19bb0 72 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e 6f 20  rwise, if.** no 
19bc0 73 75 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e  such child journ
19bd0 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c  al can be found,
19be0 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 20 69 73   file zMaster is
19bf0 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a 2a 2a   deleted from.**
19c00 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
19c10 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73   using sqlite3Os
19c20 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  Delete()..**.** 
19c30 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 77  If an IO error w
19c40 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74  ithin this funct
19c50 69 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  ion, an error co
19c60 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
19c70 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  This.** function
19c80 20 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d 6f 72   allocates memor
19c90 79 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c  y by calling sql
19ca0 69 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20 49 66  ite3Malloc(). If
19cb0 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a   an allocation.*
19cc0 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f  * fails, SQLITE_
19cd0 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65  NOMEM is returne
19ce0 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  d. Otherwise, if
19cf0 20 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63   no IO or malloc
19d00 20 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63 63 75   errors .** occu
19d10 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  r, SQLITE_OK is 
19d20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
19d30 54 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e 63 74  TODO: This funct
19d40 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 20  ion allocates a 
19d50 73 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f 66 20  single block of 
19d60 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64 0a 2a  memory to load.*
19d70 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e  * the entire con
19d80 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73  tents of the mas
19d90 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
19da0 2e 20 54 68 69 73 20 63 6f 75 6c 64 20 62 65 0a  . This could be.
19db0 2a 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 6b  ** a couple of k
19dc0 69 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f 20 2d  ilobytes or so -
19dd0 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c 61 72   potentially lar
19de0 67 65 72 20 74 68 61 6e 20 74 68 65 20 70 61 67  ger than the pag
19df0 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f 0a 73  e .** size..*/.s
19e00 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
19e10 64 65 6c 6d 61 73 74 65 72 28 50 61 67 65 72 20  delmaster(Pager 
19e20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63  *pPager, const c
19e30 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20  har *zMaster){. 
19e40 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
19e50 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
19e60 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  s;.  int rc;    
19e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19e80 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
19e90 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
19ea0 2a 70 4d 61 73 74 65 72 3b 20 20 20 20 2f 2a 20  *pMaster;    /* 
19eb0 4d 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65 72 2d  Malloc'd master-
19ec0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  journal file des
19ed0 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73 71 6c  criptor */.  sql
19ee0 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72  ite3_file *pJour
19ef0 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63  nal;   /* Malloc
19f00 27 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e 61 6c  'd child-journal
19f10 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
19f20 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   */.  char *zMas
19f30 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20  terJournal = 0; 
19f40 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d  /* Contents of m
19f50 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
19f60 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73  le */.  i64 nMas
19f70 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20  terJournal;     
19f80 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73    /* Size of mas
19f90 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
19fa0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75   */.  char *zJou
19fb0 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  rnal;           
19fc0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6f 6e  /* Pointer to on
19fd0 65 20 6a 6f 75 72 6e 61 6c 20 77 69 74 68 69 6e  e journal within
19fe0 20 4d 4a 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68   MJ file */.  ch
19ff0 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 3b 20  ar *zMasterPtr; 
1a000 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65          /* Space
1a010 20 74 6f 20 68 6f 6c 64 20 4d 4a 20 66 69 6c 65   to hold MJ file
1a020 6e 61 6d 65 20 66 72 6f 6d 20 61 20 6a 6f 75 72  name from a jour
1a030 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  nal file */.  in
1a040 74 20 6e 4d 61 73 74 65 72 50 74 72 3b 20 20 20  t nMasterPtr;   
1a050 20 20 20 20 20 20 20 20 2f 2a 20 41 6d 6f 75 6e          /* Amoun
1a060 74 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63  t of space alloc
1a070 61 74 65 64 20 74 6f 20 7a 4d 61 73 74 65 72 50  ated to zMasterP
1a080 74 72 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c  tr[] */..  /* Al
1a090 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
1a0a0 20 62 6f 74 68 20 74 68 65 20 70 4a 6f 75 72 6e   both the pJourn
1a0b0 61 6c 20 61 6e 64 20 70 4d 61 73 74 65 72 20 66  al and pMaster f
1a0c0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2e  ile descriptors.
1a0d0 0a 20 20 2a 2a 20 49 66 20 73 75 63 63 65 73 73  .  ** If success
1a0e0 66 75 6c 2c 20 6f 70 65 6e 20 74 68 65 20 6d 61  ful, open the ma
1a0f0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1a100 65 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 20  e for reading.. 
1a110 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d 20   */.  pMaster = 
1a120 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
1a130 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
1a140 6f 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  o(pVfs->szOsFile
1a150 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61   * 2);.  pJourna
1a160 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  l = (sqlite3_fil
1a170 65 20 2a 29 28 28 28 75 38 20 2a 29 70 4d 61 73  e *)(((u8 *)pMas
1a180 74 65 72 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f  ter) + pVfs->szO
1a190 73 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 70  sFile);.  if( !p
1a1a0 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72 63  Master ){.    rc
1a1b0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
1a1c0 42 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  BKPT;.  }else{. 
1a1d0 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61     const int fla
1a1e0 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45  gs = (SQLITE_OPE
1a1f0 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54  N_READONLY|SQLIT
1a200 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
1a210 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63 20 3d  URNAL);.    rc =
1a220 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
1a230 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4d  Vfs, zMaster, pM
1a240 61 73 74 65 72 2c 20 66 6c 61 67 73 2c 20 30 29  aster, flags, 0)
1a250 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
1a260 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
1a270 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
1a280 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65  .  /* Load the e
1a290 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75  ntire master jou
1a2a0 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73  rnal file into s
1a2b0 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72  pace obtained fr
1a2c0 6f 6d 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  om.  ** sqlite3_
1a2d0 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69  malloc() and poi
1a2e0 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74  nted to by zMast
1a2f0 65 72 4a 6f 75 72 6e 61 6c 2e 20 20 20 41 6c 73  erJournal.   Als
1a300 6f 20 6f 62 74 61 69 6e 0a 20 20 2a 2a 20 73 75  o obtain.  ** su
1a310 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 28  fficient space (
1a320 69 6e 20 7a 4d 61 73 74 65 72 50 74 72 29 20 74  in zMasterPtr) t
1a330 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65 73  o hold the names
1a340 20 6f 66 20 6d 61 73 74 65 72 0a 20 20 2a 2a 20   of master.  ** 
1a350 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 65 78  journal files ex
1a360 74 72 61 63 74 65 64 20 66 72 6f 6d 20 72 65 67  tracted from reg
1a370 75 6c 61 72 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f  ular rollback-jo
1a380 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 72  urnals..  */.  r
1a390 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
1a3a0 65 53 69 7a 65 28 70 4d 61 73 74 65 72 2c 20 26  eSize(pMaster, &
1a3b0 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b  nMasterJournal);
1a3c0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1a3d0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d  E_OK ) goto delm
1a3e0 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6e 4d 61  aster_out;.  nMa
1a3f0 73 74 65 72 50 74 72 20 3d 20 70 56 66 73 2d 3e  sterPtr = pVfs->
1a400 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20  mxPathname+1;.  
1a410 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d  zMasterJournal =
1a420 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e   sqlite3Malloc(n
1a430 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 2b 20  MasterJournal + 
1a440 6e 4d 61 73 74 65 72 50 74 72 20 2b 20 31 29 3b  nMasterPtr + 1);
1a450 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a  .  if( !zMasterJ
1a460 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 72 63  ournal ){.    rc
1a470 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
1a480 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 64  BKPT;.    goto d
1a490 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
1a4a0 7d 0a 20 20 7a 4d 61 73 74 65 72 50 74 72 20 3d  }.  zMasterPtr =
1a4b0 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   &zMasterJournal
1a4c0 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2b  [nMasterJournal+
1a4d0 31 5d 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  1];.  rc = sqlit
1a4e0 65 33 4f 73 52 65 61 64 28 70 4d 61 73 74 65 72  e3OsRead(pMaster
1a4f0 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  , zMasterJournal
1a500 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f  , (int)nMasterJo
1a510 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 69 66 28  urnal, 0);.  if(
1a520 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1a530 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
1a540 6f 75 74 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f  out;.  zMasterJo
1a550 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75  urnal[nMasterJou
1a560 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20 20 7a 4a  rnal] = 0;..  zJ
1a570 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72  ournal = zMaster
1a580 4a 6f 75 72 6e 61 6c 3b 0a 20 20 77 68 69 6c 65  Journal;.  while
1a590 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73  ( (zJournal-zMas
1a5a0 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73  terJournal)<nMas
1a5b0 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  terJournal ){.  
1a5c0 20 20 69 6e 74 20 65 78 69 73 74 73 3b 0a 20 20    int exists;.  
1a5d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1a5e0 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4a 6f  Access(pVfs, zJo
1a5f0 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43  urnal, SQLITE_AC
1a600 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78  CESS_EXISTS, &ex
1a610 69 73 74 73 29 3b 0a 20 20 20 20 69 66 28 20 72  ists);.    if( r
1a620 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1a630 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
1a640 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  ster_out;.    }.
1a650 20 20 20 20 69 66 28 20 65 78 69 73 74 73 20 29      if( exists )
1a660 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f  {.      /* One o
1a670 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70  f the journals p
1a680 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65  ointed to by the
1a690 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1a6a0 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a  exists..      **
1a6b0 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65   Open it and che
1a6c0 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20  ck if it points 
1a6d0 61 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  at the master jo
1a6e0 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20  urnal. If.      
1a6f0 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69  ** so, return wi
1a700 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74  thout deleting t
1a710 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
1a720 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2f  l file..      */
1a730 0a 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 20 20  .      int c;.  
1a740 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
1a750 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  (SQLITE_OPEN_REA
1a760 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45  DONLY|SQLITE_OPE
1a770 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b  N_MAIN_JOURNAL);
1a780 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1a790 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
1a7a0 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e  zJournal, pJourn
1a7b0 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20  al, flags, 0);. 
1a7c0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1a7d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1a7e0 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
1a7f0 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _out;.      }.. 
1a800 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61       rc = readMa
1a810 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75  sterJournal(pJou
1a820 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50 74 72  rnal, zMasterPtr
1a830 2c 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20  , nMasterPtr);. 
1a840 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
1a850 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ose(pJournal);. 
1a860 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1a870 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1a880 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
1a890 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _out;.      }.. 
1a8a0 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74 65 72       c = zMaster
1a8b0 50 74 72 5b 30 5d 21 3d 30 20 26 26 20 73 74 72  Ptr[0]!=0 && str
1a8c0 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c 20  cmp(zMasterPtr, 
1a8d0 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20  zMaster)==0;.   
1a8e0 20 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20     if( c ){.    
1a8f0 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61      /* We have a
1a900 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64   match. Do not d
1a910 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
1a920 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a   journal file. *
1a930 2f 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64  /.        goto d
1a940 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
1a950 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1a960 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 71 6c  zJournal += (sql
1a970 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4a 6f  ite3Strlen30(zJo
1a980 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 7d 0a 20  urnal)+1);.  }. 
1a990 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73  .  sqlite3OsClos
1a9a0 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 63  e(pMaster);.  rc
1a9b0 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65   = sqlite3OsDele
1a9c0 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
1a9d0 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72  , 0);..delmaster
1a9e0 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f  _out:.  sqlite3_
1a9f0 66 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72  free(zMasterJour
1aa00 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70 4d 61 73  nal);.  if( pMas
1aa10 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ter ){.    sqlit
1aa20 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65  e3OsClose(pMaste
1aa30 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
1aa40 21 69 73 4f 70 65 6e 28 70 4a 6f 75 72 6e 61 6c  !isOpen(pJournal
1aa50 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
1aa60 5f 66 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a  _free(pMaster);.
1aa70 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1aa80 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
1aa90 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
1aaa0 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 61   to change the a
1aab0 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68  ctual size of th
1aac0 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66  e database .** f
1aad0 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  ile in the file-
1aae0 73 79 73 74 65 6d 2e 20 54 68 69 73 20 6f 6e 6c  system. This onl
1aaf0 79 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 63  y happens when c
1ab00 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e  ommitting a tran
1ab10 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f 72 20 72  saction,.** or r
1ab20 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74 72  olling back a tr
1ab30 61 6e 73 61 63 74 69 6f 6e 20 28 69 6e 63 6c 75  ansaction (inclu
1ab40 64 69 6e 67 20 72 6f 6c 6c 69 6e 67 20 62 61 63  ding rolling bac
1ab50 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29  k a hot-journal)
1ab60 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d  ..**.** If the m
1ab70 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
1ab80 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f  e is not open, o
1ab90 72 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e  r the pager is n
1aba0 6f 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20  ot in either.** 
1abb0 44 42 4d 4f 44 20 6f 72 20 4f 50 45 4e 20 73 74  DBMOD or OPEN st
1abc0 61 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ate, this functi
1abd0 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f  on is a no-op. O
1abe0 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 73 69  therwise, the si
1abf0 7a 65 20 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69  ze .** of the fi
1ac00 6c 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f  le is changed to
1ac10 20 6e 50 61 67 65 20 70 61 67 65 73 20 28 6e 50   nPage pages (nP
1ac20 61 67 65 2a 70 50 61 67 65 72 2d 3e 70 61 67 65  age*pPager->page
1ac30 53 69 7a 65 20 62 79 74 65 73 29 2e 20 0a 2a 2a  Size bytes). .**
1ac40 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20   If the file on 
1ac50 64 69 73 6b 20 69 73 20 63 75 72 72 65 6e 74 6c  disk is currentl
1ac60 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 50  y larger than nP
1ac70 61 67 65 20 70 61 67 65 73 2c 20 74 68 65 6e 20  age pages, then 
1ac80 75 73 65 20 74 68 65 20 56 46 53 0a 2a 2a 20 78  use the VFS.** x
1ac90 54 72 75 6e 63 61 74 65 28 29 20 6d 65 74 68 6f  Truncate() metho
1aca0 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20 69 74  d to truncate it
1acb0 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74 20 6d  ..**.** Or, it m
1acc0 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73 65  ight be the case
1acd0 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 6f   that the file o
1ace0 6e 20 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c 65  n disk is smalle
1acf0 72 20 74 68 61 6e 20 0a 2a 2a 20 6e 50 61 67 65  r than .** nPage
1ad00 20 70 61 67 65 73 2e 20 53 6f 6d 65 20 6f 70 65   pages. Some ope
1ad10 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6d  rating system im
1ad20 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63 61  plementations ca
1ad30 6e 20 67 65 74 20 63 6f 6e 66 75 73 65 64 20 69  n get confused i
1ad40 66 20 0a 2a 2a 20 79 6f 75 20 74 72 79 20 74 6f  f .** you try to
1ad50 20 74 72 75 6e 63 61 74 65 20 61 20 66 69 6c 65   truncate a file
1ad60 20 74 6f 20 73 6f 6d 65 20 73 69 7a 65 20 74 68   to some size th
1ad70 61 74 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  at is larger tha
1ad80 6e 20 69 74 20 0a 2a 2a 20 63 75 72 72 65 6e 74  n it .** current
1ad90 6c 79 20 69 73 2c 20 73 6f 20 64 65 74 65 63 74  ly is, so detect
1ada0 20 74 68 69 73 20 63 61 73 65 20 61 6e 64 20 77   this case and w
1adb0 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20 7a 65  rite a single ze
1adc0 72 6f 20 62 79 74 65 20 74 6f 20 0a 2a 2a 20 74  ro byte to .** t
1add0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6e 65  he end of the ne
1ade0 77 20 66 69 6c 65 20 69 6e 73 74 65 61 64 2e 0a  w file instead..
1adf0 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
1ae00 66 75 6c 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ful, return SQLI
1ae10 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 20  TE_OK. If an IO 
1ae20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
1ae30 6c 65 20 6d 6f 64 69 66 79 69 6e 67 0a 2a 2a 20  le modifying.** 
1ae40 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1ae50 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65 72  e, return the er
1ae60 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20  ror code to the 
1ae70 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  caller..*/.stati
1ae80 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e  c int pager_trun
1ae90 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  cate(Pager *pPag
1aea0 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b  er, Pgno nPage){
1aeb0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1aec0 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
1aed0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
1aee0 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a  =PAGER_ERROR );.
1aef0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1af00 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
1af10 52 45 41 44 45 52 20 29 3b 0a 20 20 0a 20 20 69  READER );.  .  i
1af20 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
1af30 2d 3e 66 64 29 20 0a 20 20 20 26 26 20 28 70 50  ->fd) .   && (pP
1af40 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
1af50 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
1af60 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
1af70 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 20  te==PAGER_OPEN) 
1af80 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20 63 75  .  ){.    i64 cu
1af90 72 72 65 6e 74 53 69 7a 65 2c 20 6e 65 77 53 69  rrentSize, newSi
1afa0 7a 65 3b 0a 20 20 20 20 69 6e 74 20 73 7a 50 61  ze;.    int szPa
1afb0 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  ge = pPager->pag
1afc0 65 53 69 7a 65 3b 0a 20 20 20 20 61 73 73 65 72  eSize;.    asser
1afd0 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  t( pPager->eLock
1afe0 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
1aff0 20 29 3b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a   );.    /* TODO:
1b000 20 49 73 20 69 74 20 73 61 66 65 20 74 6f 20 75   Is it safe to u
1b010 73 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53  se Pager.dbFileS
1b020 69 7a 65 20 68 65 72 65 3f 20 2a 2f 0a 20 20 20  ize here? */.   
1b030 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
1b040 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
1b050 66 64 2c 20 26 63 75 72 72 65 6e 74 53 69 7a 65  fd, &currentSize
1b060 29 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65 20 3d  );.    newSize =
1b070 20 73 7a 50 61 67 65 2a 28 69 36 34 29 6e 50 61   szPage*(i64)nPa
1b080 67 65 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  ge;.    if( rc==
1b090 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75 72  SQLITE_OK && cur
1b0a0 72 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69 7a  rentSize!=newSiz
1b0b0 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63  e ){.      if( c
1b0c0 75 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69  urrentSize>newSi
1b0d0 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ze ){.        rc
1b0e0 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
1b0f0 63 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  cate(pPager->fd,
1b100 20 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 20   newSize);.     
1b110 20 7d 65 6c 73 65 20 69 66 28 20 28 63 75 72 72   }else if( (curr
1b120 65 6e 74 53 69 7a 65 2b 73 7a 50 61 67 65 29 3c  entSize+szPage)<
1b130 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20  =newSize ){.    
1b140 20 20 20 20 63 68 61 72 20 2a 70 54 6d 70 20 3d      char *pTmp =
1b150 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
1b160 63 65 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  ce;.        mems
1b170 65 74 28 70 54 6d 70 2c 20 30 2c 20 73 7a 50 61  et(pTmp, 0, szPa
1b180 67 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  ge);.        tes
1b190 74 63 61 73 65 28 20 28 6e 65 77 53 69 7a 65 2d  tcase( (newSize-
1b1a0 73 7a 50 61 67 65 29 20 3d 3d 20 63 75 72 72 65  szPage) == curre
1b1b0 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  ntSize );.      
1b1c0 20 20 74 65 73 74 63 61 73 65 28 20 28 6e 65 77    testcase( (new
1b1d0 53 69 7a 65 2d 73 7a 50 61 67 65 29 20 3e 20 20  Size-szPage) >  
1b1e0 63 75 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a 20  currentSize );. 
1b1f0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1b200 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
1b210 72 2d 3e 66 64 2c 20 70 54 6d 70 2c 20 73 7a 50  r->fd, pTmp, szP
1b220 61 67 65 2c 20 6e 65 77 53 69 7a 65 2d 73 7a 50  age, newSize-szP
1b230 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
1b240 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1b250 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1b260 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53   pPager->dbFileS
1b270 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20  ize = nPage;.   
1b280 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1b290 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1b2a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 61  *.** Return a sa
1b2b0 6e 69 74 69 7a 65 64 20 76 65 72 73 69 6f 6e 20  nitized version 
1b2c0 6f 66 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69  of the sector-si
1b2d0 7a 65 20 6f 66 20 4f 53 20 66 69 6c 65 20 70 46  ze of OS file pF
1b2e0 69 6c 65 2e 20 54 68 65 0a 2a 2a 20 72 65 74 75  ile. The.** retu
1b2f0 72 6e 20 76 61 6c 75 65 20 69 73 20 67 75 61 72  rn value is guar
1b300 61 6e 74 65 65 64 20 74 6f 20 6c 69 65 20 62 65  anteed to lie be
1b310 74 77 65 65 6e 20 33 32 20 61 6e 64 20 4d 41 58  tween 32 and MAX
1b320 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2f  _SECTOR_SIZE..*/
1b330 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 63 74  .int sqlite3Sect
1b340 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  orSize(sqlite3_f
1b350 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69  ile *pFile){.  i
1b360 6e 74 20 69 52 65 74 20 3d 20 73 71 6c 69 74 65  nt iRet = sqlite
1b370 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70 46  3OsSectorSize(pF
1b380 69 6c 65 29 3b 0a 20 20 69 66 28 20 69 52 65 74  ile);.  if( iRet
1b390 3c 33 32 20 29 7b 0a 20 20 20 20 69 52 65 74 20  <32 ){.    iRet 
1b3a0 3d 20 35 31 32 3b 0a 20 20 7d 65 6c 73 65 20 69  = 512;.  }else i
1b3b0 66 28 20 69 52 65 74 3e 4d 41 58 5f 53 45 43 54  f( iRet>MAX_SECT
1b3c0 4f 52 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 61  OR_SIZE ){.    a
1b3d0 73 73 65 72 74 28 20 4d 41 58 5f 53 45 43 54 4f  ssert( MAX_SECTO
1b3e0 52 5f 53 49 5a 45 3e 3d 35 31 32 20 29 3b 0a 20  R_SIZE>=512 );. 
1b3f0 20 20 20 69 52 65 74 20 3d 20 4d 41 58 5f 53 45     iRet = MAX_SE
1b400 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 20  CTOR_SIZE;.  }. 
1b410 20 72 65 74 75 72 6e 20 69 52 65 74 3b 0a 7d 0a   return iRet;.}.
1b420 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76  ./*.** Set the v
1b430 61 6c 75 65 20 6f 66 20 74 68 65 20 50 61 67 65  alue of the Page
1b440 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72  r.sectorSize var
1b450 69 61 62 6c 65 20 66 6f 72 20 74 68 65 20 67 69  iable for the gi
1b460 76 65 6e 0a 2a 2a 20 70 61 67 65 72 20 62 61 73  ven.** pager bas
1b470 65 64 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20  ed on the value 
1b480 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
1b490 78 53 65 63 74 6f 72 53 69 7a 65 20 6d 65 74 68  xSectorSize meth
1b4a0 6f 64 0a 2a 2a 20 6f 66 20 74 68 65 20 6f 70 65  od.** of the ope
1b4b0 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
1b4c0 20 54 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   The sector size
1b4d0 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 0a 2a   will be used .*
1b4e0 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  * to determine t
1b4f0 68 65 20 73 69 7a 65 20 61 6e 64 20 61 6c 69 67  he size and alig
1b500 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61 6c  nment of journal
1b510 20 68 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a 20   header and .** 
1b520 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
1b530 6f 69 6e 74 65 72 73 20 77 69 74 68 69 6e 20 63  ointers within c
1b540 72 65 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20 66  reated journal f
1b550 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  iles..**.** For 
1b560 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20  temporary files 
1b570 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65  the effective se
1b580 63 74 6f 72 20 73 69 7a 65 20 69 73 20 61 6c 77  ctor size is alw
1b590 61 79 73 20 35 31 32 20 62 79 74 65 73 2e 0a 2a  ays 512 bytes..*
1b5a0 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
1b5b0 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72  for non-temporar
1b5c0 79 20 66 69 6c 65 73 2c 20 74 68 65 20 65 66 66  y files, the eff
1b5d0 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69  ective sector si
1b5e0 7a 65 20 69 73 0a 2a 2a 20 74 68 65 20 76 61 6c  ze is.** the val
1b5f0 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ue returned by t
1b600 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65 28 29  he xSectorSize()
1b610 20 6d 65 74 68 6f 64 20 72 6f 75 6e 64 65 64 20   method rounded 
1b620 75 70 20 74 6f 20 33 32 20 69 66 0a 2a 2a 20 69  up to 32 if.** i
1b630 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 33  t is less than 3
1b640 32 2c 20 6f 72 20 72 6f 75 6e 64 65 64 20 64 6f  2, or rounded do
1b650 77 6e 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f 52  wn to MAX_SECTOR
1b660 5f 53 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20 69  _SIZE if it.** i
1b670 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 4d  s greater than M
1b680 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a  AX_SECTOR_SIZE..
1b690 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c  **.** If the fil
1b6a0 65 20 68 61 73 20 74 68 65 20 53 51 4c 49 54 45  e has the SQLITE
1b6b0 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45  _IOCAP_POWERSAFE
1b6c0 5f 4f 56 45 52 57 52 49 54 45 20 70 72 6f 70 65  _OVERWRITE prope
1b6d0 72 74 79 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a  rty, then set.**
1b6e0 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
1b6f0 65 63 74 6f 72 20 73 69 7a 65 20 74 6f 20 69 74  ector size to it
1b700 73 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20  s minimum value 
1b710 28 35 31 32 29 2e 20 20 54 68 65 20 70 75 72 70  (512).  The purp
1b720 6f 73 65 20 6f 66 0a 2a 2a 20 70 50 61 67 65 72  ose of.** pPager
1b730 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20  ->sectorSize is 
1b740 74 6f 20 64 65 66 69 6e 65 20 74 68 65 20 22 62  to define the "b
1b750 6c 61 73 74 20 72 61 64 69 75 73 22 20 6f 66 20  last radius" of 
1b760 62 79 74 65 73 20 74 68 61 74 0a 2a 2a 20 6d 69  bytes that.** mi
1b770 67 68 74 20 63 68 61 6e 67 65 20 69 66 20 61 20  ght change if a 
1b780 63 72 61 73 68 20 6f 63 63 75 72 73 20 77 68 69  crash occurs whi
1b790 6c 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61 20  le writing to a 
1b7a0 73 69 6e 67 6c 65 20 62 79 74 65 20 69 6e 0a 2a  single byte in.*
1b7b0 2a 20 74 68 61 74 20 72 61 6e 67 65 2e 20 20 42  * that range.  B
1b7c0 75 74 20 77 69 74 68 20 50 4f 57 45 52 53 41 46  ut with POWERSAF
1b7d0 45 5f 4f 56 45 52 57 52 49 54 45 2c 20 74 68 65  E_OVERWRITE, the
1b7e0 20 62 6c 61 73 74 20 72 61 64 69 75 73 20 69 73   blast radius is
1b7f0 20 7a 65 72 6f 0a 2a 2a 20 28 74 68 61 74 20 69   zero.** (that i
1b800 73 20 77 68 61 74 20 50 4f 57 45 52 53 41 46 45  s what POWERSAFE
1b810 5f 4f 56 45 52 57 52 49 54 45 20 6d 65 61 6e 73  _OVERWRITE means
1b820 29 2c 20 73 6f 20 77 65 20 6d 69 6e 69 6d 69 7a  ), so we minimiz
1b830 65 20 74 68 65 20 73 65 63 74 6f 72 0a 2a 2a 20  e the sector.** 
1b840 73 69 7a 65 2e 20 20 46 6f 72 20 62 61 63 6b 77  size.  For backw
1b850 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69  ards compatibili
1b860 74 79 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61  ty of the rollba
1b870 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ck journal file 
1b880 66 6f 72 6d 61 74 2c 0a 2a 2a 20 77 65 20 63 61  format,.** we ca
1b890 6e 6e 6f 74 20 72 65 64 75 63 65 20 74 68 65 20  nnot reduce the 
1b8a0 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72  effective sector
1b8b0 20 73 69 7a 65 20 62 65 6c 6f 77 20 35 31 32 2e   size below 512.
1b8c0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1b8d0 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 50 61  setSectorSize(Pa
1b8e0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1b8f0 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
1b900 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50  Pager->fd) || pP
1b910 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
1b920 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
1b930 3e 74 65 6d 70 46 69 6c 65 0a 20 20 20 7c 7c 20  >tempFile.   || 
1b940 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65  (sqlite3OsDevice
1b950 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
1b960 70 50 61 67 65 72 2d 3e 66 64 29 20 26 20 0a 20  pPager->fd) & . 
1b970 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
1b980 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53  ITE_IOCAP_POWERS
1b990 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29 21 3d  AFE_OVERWRITE)!=
1b9a0 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65  0.  ){.    /* Se
1b9b0 63 74 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e 27  ctor size doesn'
1b9c0 74 20 6d 61 74 74 65 72 20 66 6f 72 20 74 65 6d  t matter for tem
1b9d0 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 41 6c  porary files. Al
1b9e0 73 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20 20 20  so, the file.   
1b9f0 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76 65   ** may not have
1ba00 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 79 65 74   been opened yet
1ba10 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20  , in which case 
1ba20 74 68 65 20 4f 73 53 65 63 74 6f 72 53 69 7a 65  the OsSectorSize
1ba30 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77  ().    ** call w
1ba40 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e 20 2a 2f  ill segfault. */
1ba50 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63  .    pPager->sec
1ba60 74 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20  torSize = 512;. 
1ba70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
1ba80 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
1ba90 20 73 71 6c 69 74 65 33 53 65 63 74 6f 72 53 69   sqlite3SectorSi
1baa0 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  ze(pPager->fd);.
1bab0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61    }.}../*.** Pla
1bac0 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61  yback the journa
1bad0 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f  l and thus resto
1bae0 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
1baf0 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73  file to.** the s
1bb00 74 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 62  tate it was in b
1bb10 65 66 6f 72 65 20 77 65 20 73 74 61 72 74 65 64  efore we started
1bb20 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e   making changes.
1bb30 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75    .**.** The jou
1bb40 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74  rnal file format
1bb50 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20   is as follows: 
1bb60 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62  .**.**  (1)  8 b
1bb70 79 74 65 20 70 72 65 66 69 78 2e 20 20 41 20 63  yte prefix.  A c
1bb80 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d  opy of aJournalM
1bb90 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20  agic[]..**  (2) 
1bba0 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
1bbb0 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
1bbc0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
1bbd0 66 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63  f valid page rec
1bbe0 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e  ords.**       in
1bbf0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49   the journal.  I
1bc00 66 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20  f this value is 
1bc10 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e  0xffffffff, then
1bc20 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20   compute the.** 
1bc30 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20        number of 
1bc40 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f  page records fro
1bc50 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69  m the journal si
1bc60 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62  ze..**  (3)  4 b
1bc70 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
1bc80 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
1bc90 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75  the initial valu
1bca0 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20  e for the .**   
1bcb0 20 20 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b      sanity check
1bcc0 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20  sum..**  (4)  4 
1bcd0 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69  byte integer whi
1bce0 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
1bcf0 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72 75   of pages to tru
1bd00 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20  ncate the.**    
1bd10 20 20 20 64 61 74 61 62 61 73 65 20 74 6f 20 64     database to d
1bd20 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
1bd30 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74  ..**  (5)  4 byt
1bd40 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
1bd50 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
1bd60 65 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 20 20  e sector size.  
1bd70 54 68 65 20 68 65 61 64 65 72 0a 2a 2a 20 20 20  The header.**   
1bd80 20 20 20 20 69 73 20 74 68 69 73 20 6d 61 6e 79      is this many
1bd90 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
1bda0 2a 2a 20 20 28 36 29 20 20 34 20 62 79 74 65 20  **  (6)  4 byte 
1bdb0 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
1bdc0 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
1bdd0 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  page size..**  (
1bde0 37 29 20 20 7a 65 72 6f 20 70 61 64 64 69 6e 67  7)  zero padding
1bdf0 20 6f 75 74 20 74 6f 20 74 68 65 20 6e 65 78 74   out to the next
1be00 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 0a 2a 2a   sector size..**
1be10 20 20 28 38 29 20 20 5a 65 72 6f 20 6f 72 20 6d    (8)  Zero or m
1be20 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e  ore pages instan
1be30 63 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c  ces, each as fol
1be40 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20  lows:.**        
1be50 2b 20 20 34 20 62 79 74 65 20 70 61 67 65 20 6e  +  4 byte page n
1be60 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20  umber..**       
1be70 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65   +  pPager->page
1be80 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61  Size bytes of da
1be90 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  ta..**        + 
1bea0 20 34 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d   4 byte checksum
1beb0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73  .**.** When we s
1bec0 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72  peak of the jour
1bed0 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d  nal header, we m
1bee0 65 61 6e 20 74 68 65 20 66 69 72 73 74 20 37 20  ean the first 7 
1bef0 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20  items above..** 
1bf00 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68  Each entry in th
1bf10 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20  e journal is an 
1bf20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
1bf30 38 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20  8th item..**.** 
1bf40 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66  Call the value f
1bf50 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62  rom the second b
1bf60 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e  ullet "nRec".  n
1bf70 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65  Rec is the numbe
1bf80 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61  r of.** valid pa
1bf90 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ge entries in th
1bfa0 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d  e journal.  In m
1bfb0 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63  ost cases, you c
1bfc0 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a  an compute the.*
1bfd0 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  * value of nRec 
1bfe0 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66  from the size of
1bff0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1c000 65 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f 77  e.  But if a pow
1c010 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63  er.** failure oc
1c020 63 75 72 72 65 64 20 77 68 69 6c 65 20 74 68 65  curred while the
1c030 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69   journal was bei
1c040 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63  ng written, it c
1c050 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63  ould be the.** c
1c060 61 73 65 20 74 68 61 74 20 74 68 65 20 73 69 7a  ase that the siz
1c070 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
1c080 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64   file had alread
1c090 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64  y been increased
1c0a0 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72   but.** the extr
1c0b0 61 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f  a entries had no
1c0c0 74 20 79 65 74 20 6d 61 64 65 20 69 74 20 73 61  t yet made it sa
1c0d0 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49  fely to disk.  I
1c0e0 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a  n such a case,.*
1c0f0 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  * the value of n
1c100 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f  Rec computed fro
1c110 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  m the file size 
1c120 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72  would be too lar
1c130 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74  ge.  For.** that
1c140 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61   reason, we alwa
1c150 79 73 20 75 73 65 20 74 68 65 20 6e 52 65 63 20  ys use the nRec 
1c160 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61  value in the hea
1c170 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  der..**.** If th
1c180 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20  e nRec value is 
1c190 30 78 66 66 66 66 66 66 66 66 20 69 74 20 6d 65  0xffffffff it me
1c1a0 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73 68  ans that nRec sh
1c1b0 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64  ould be computed
1c1c0 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  .** from the fil
1c1d0 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61  e size.  This va
1c1e0 6c 75 65 20 69 73 20 75 73 65 64 20 77 68 65 6e  lue is used when
1c1f0 20 74 68 65 20 75 73 65 72 20 73 65 6c 65 63 74   the user select
1c200 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63  s the.** no-sync
1c210 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20   option for the 
1c220 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65  journal.  A powe
1c230 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20  r failure could 
1c240 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69  lead to corrupti
1c250 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61  on.** in this ca
1c260 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69  se.  But for thi
1c270 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61  ngs like tempora
1c280 72 79 20 74 61 62 6c 65 20 28 77 68 69 63 68 20  ry table (which 
1c290 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74  will be.** delet
1c2a0 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65  ed when the powe
1c2b0 72 20 69 73 20 72 65 73 74 6f 72 65 64 29 20 77  r is restored) w
1c2c0 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a  e don't care.  .
1c2d0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c  **.** If the fil
1c2e0 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20  e opened as the 
1c2f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
1c300 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65  not a well-forme
1c310 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  d.** journal fil
1c320 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73  e then all pages
1c330 20 75 70 20 74 6f 20 74 68 65 20 66 69 72 73 74   up to the first
1c340 20 63 6f 72 72 75 70 74 65 64 20 70 61 67 65 20   corrupted page 
1c350 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61  are rolled.** ba
1c360 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20  ck (or no pages 
1c370 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  if the journal h
1c380 65 61 64 65 72 20 69 73 20 63 6f 72 72 75 70 74  eader is corrupt
1c390 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c  ed). The journal
1c3a0 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e   file.** is then
1c3b0 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c   deleted and SQL
1c3c0 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c  ITE_OK returned,
1c3d0 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20 63   just as if no c
1c3e0 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a  orruption had.**
1c3f0 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65   been encountere
1c400 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  d..**.** If an I
1c410 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65  /O or malloc() e
1c420 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
1c430 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73   journal-file is
1c440 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20   not deleted.** 
1c450 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  and an error cod
1c460 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
1c470 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f 74 20 70  *.** The isHot p
1c480 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74  arameter indicat
1c490 65 73 20 74 68 61 74 20 77 65 20 61 72 65 20 74  es that we are t
1c4a0 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63  rying to rollbac
1c4b0 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 74  k a journal.** t
1c4c0 68 61 74 20 6d 69 67 68 74 20 62 65 20 61 20 68  hat might be a h
1c4d0 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c  ot journal.  Or,
1c4e0 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 61   it could be tha
1c4f0 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  t the journal is
1c500 20 0a 2a 2a 20 70 72 65 73 65 72 76 65 64 20 62   .** preserved b
1c510 65 63 61 75 73 65 20 6f 66 20 4a 4f 55 52 4e 41  ecause of JOURNA
1c520 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 6f 72  LMODE_PERSIST or
1c530 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55   JOURNALMODE_TRU
1c540 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20 74 68 65  NCATE..** If the
1c550 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c 6c 79 20   journal really 
1c560 69 73 20 68 6f 74 2c 20 72 65 73 65 74 20 74 68  is hot, reset th
1c570 65 20 70 61 67 65 72 20 63 61 63 68 65 20 70 72  e pager cache pr
1c580 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a 20 62  ior rolling.** b
1c590 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65 6e 74 2e  ack any content.
1c5a0 20 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c    If the journal
1c5b0 20 69 73 20 6d 65 72 65 6c 79 20 70 65 72 73 69   is merely persi
1c5c0 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73 65 74 20  stent, no reset 
1c5d0 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f  is.** needed..*/
1c5e0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1c5f0 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72  r_playback(Pager
1c600 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73   *pPager, int is
1c610 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  Hot){.  sqlite3_
1c620 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67  vfs *pVfs = pPag
1c630 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34 20  er->pVfs;.  i64 
1c640 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20  szJ;            
1c650 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1c660 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1c670 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75   in bytes */.  u
1c680 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20  32 nRec;        
1c690 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1c6a0 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20  r of Records in 
1c6b0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  the journal */. 
1c6c0 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20 20   u32 u;         
1c6d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73            /* Uns
1c6e0 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74  igned loop count
1c6f0 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50  er */.  Pgno mxP
1c700 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
1c710 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
1c720 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e  original file in
1c730 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20   pages */.  int 
1c740 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1c750 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
1c760 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74  ode of a subrout
1c770 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73  ine */.  int res
1c780 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
1c790 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72    /* Value retur
1c7a0 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73  ned by sqlite3Os
1c7b0 41 63 63 65 73 73 28 29 20 2a 2f 0a 20 20 63 68  Access() */.  ch
1c7c0 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b  ar *zMaster = 0;
1c7d0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
1c7e0 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
1c7f0 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a   file if any */.
1c800 20 20 69 6e 74 20 6e 65 65 64 50 61 67 65 72 52    int needPagerR
1c810 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 54 72  eset;      /* Tr
1c820 75 65 20 74 6f 20 72 65 73 65 74 20 70 61 67 65  ue to reset page
1c830 20 70 72 69 6f 72 20 74 6f 20 66 69 72 73 74 20   prior to first 
1c840 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  page rollback */
1c850 0a 20 20 69 6e 74 20 6e 50 6c 61 79 62 61 63 6b  .  int nPlayback
1c860 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54   = 0;       /* T
1c870 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
1c880 61 67 65 73 20 72 65 73 74 6f 72 65 64 20 66 72  ages restored fr
1c890 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  om journal */.  
1c8a0 75 33 32 20 73 61 76 65 64 50 61 67 65 53 69 7a  u32 savedPageSiz
1c8b0 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  e = pPager->page
1c8c0 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 46 69 67 75  Size;..  /* Figu
1c8d0 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
1c8e0 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74  records are in t
1c8f0 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f  he journal.  Abo
1c900 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a  rt early if.  **
1c910 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
1c920 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73  empty..  */.  as
1c930 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
1c940 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 72  ger->jfd) );.  r
1c950 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
1c960 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
1c970 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20  d, &szJ);.  if( 
1c980 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1c990 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
1c9a0 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  ayback;.  }..  /
1c9b0 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74 65  * Read the maste
1c9c0 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66  r journal name f
1c9d0 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  rom the journal,
1c9e0 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65 6e   if it is presen
1c9f0 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73  t..  ** If a mas
1ca00 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1ca10 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69   name is specifi
1ca20 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65  ed, but the file
1ca30 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65   is not.  ** pre
1ca40 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68  sent on disk, th
1ca50 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  en the journal i
1ca60 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f  s not hot and do
1ca70 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
1ca80 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61  e.  ** played ba
1ca90 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f  ck..  **.  ** TO
1caa0 44 4f 3a 20 54 65 63 68 6e 69 63 61 6c 6c 79 20  DO: Technically 
1cab0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  the following is
1cac0 20 61 6e 20 65 72 72 6f 72 20 62 65 63 61 75 73   an error becaus
1cad0 65 20 69 74 20 61 73 73 75 6d 65 73 20 74 68 61  e it assumes tha
1cae0 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 50 61  t.  ** buffer Pa
1caf0 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 69 73  ger.pTmpSpace is
1cb00 20 28 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 20   (mxPathname+1) 
1cb10 62 79 74 65 73 20 6f 72 20 6c 61 72 67 65 72 2e  bytes or larger.
1cb20 20 69 2e 65 2e 20 74 68 61 74 0a 20 20 2a 2a 20   i.e. that.  ** 
1cb30 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
1cb40 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  e >= pPager->pVf
1cb50 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s->mxPathname+1)
1cb60 2e 20 55 73 69 6e 67 20 6f 73 5f 75 6e 69 78 2e  . Using os_unix.
1cb70 63 2c 0a 20 20 2a 2a 20 6d 78 50 61 74 68 6e 61  c,.  ** mxPathna
1cb80 6d 65 20 69 73 20 35 31 32 2c 20 77 68 69 63 68  me is 512, which
1cb90 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
1cba0 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f  the minimum allo
1cbb0 77 61 62 6c 65 20 76 61 6c 75 65 0a 20 20 2a 2a  wable value.  **
1cbc0 20 66 6f 72 20 70 61 67 65 53 69 7a 65 2e 0a 20   for pageSize.. 
1cbd0 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20   */.  zMaster = 
1cbe0 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
1cbf0 65 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61  e;.  rc = readMa
1cc00 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sterJournal(pPag
1cc10 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72  er->jfd, zMaster
1cc20 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e  , pPager->pVfs->
1cc30 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20  mxPathname+1);. 
1cc40 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1cc50 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d  OK && zMaster[0]
1cc60 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1cc70 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
1cc80 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49  s, zMaster, SQLI
1cc90 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
1cca0 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20 7a  , &res);.  }.  z
1ccb0 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 69 66  Master = 0;.  if
1ccc0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1ccd0 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20 20 20 67  || !res ){.    g
1cce0 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
1ccf0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
1cd00 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
1cd10 20 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74    needPagerReset
1cd20 20 3d 20 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a 20   = isHot;..  /* 
1cd30 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e  This loop termin
1cd40 61 74 65 73 20 65 69 74 68 65 72 20 77 68 65 6e  ates either when
1cd50 20 61 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   a readJournalHd
1cd60 72 28 29 20 6f 72 20 0a 20 20 2a 2a 20 70 61 67  r() or .  ** pag
1cd70 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
1cd80 70 61 67 65 28 29 20 63 61 6c 6c 20 72 65 74 75  page() call retu
1cd90 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rns SQLITE_DONE 
1cda0 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a  or an IO error .
1cdb0 20 20 2a 2a 20 6f 63 63 75 72 73 2e 20 0a 20 20    ** occurs. .  
1cdc0 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  */.  while( 1 ){
1cdd0 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
1cde0 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65   next journal he
1cdf0 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ader from the jo
1ce00 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66 20  urnal file.  If 
1ce10 74 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a 2a  there are.    **
1ce20 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65   not enough byte
1ce30 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a 6f  s left in the jo
1ce40 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 61  urnal file for a
1ce50 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72   complete header
1ce60 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20 69  , or.    ** it i
1ce70 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65  s corrupted, the
1ce80 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73 74  n a process must
1ce90 20 68 61 76 65 20 66 61 69 6c 65 64 20 77 68 69   have failed whi
1cea0 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20  le writing it.. 
1ceb0 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63     ** This indic
1cec0 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72  ates nothing mor
1ced0 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  e needs to be ro
1cee0 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a  lled back..    *
1cef0 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a  /.    rc = readJ
1cf00 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
1cf10 2c 20 69 73 48 6f 74 2c 20 73 7a 4a 2c 20 26 6e  , isHot, szJ, &n
1cf20 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20  Rec, &mxPg);.   
1cf30 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1cf40 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28  OK ){ .      if(
1cf50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
1cf60 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1cf70 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1cf80 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65    }.      goto e
1cf90 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
1cfa0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52   }..    /* If nR
1cfb0 65 63 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ec is 0xffffffff
1cfc0 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72  , then this jour
1cfd0 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65 64 20  nal was created 
1cfe0 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20  by a process.   
1cff0 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e   ** working in n
1d000 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69  o-sync mode. Thi
1d010 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  s means that the
1d020 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
1d030 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65  rnal.    ** file
1d040 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67   consists of pag
1d050 65 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f  es, there are no
1d060 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65   more journal he
1d070 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20  aders. Compute. 
1d080 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20     ** the value 
1d090 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e  of nRec based on
1d0a0 20 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e   this assumption
1d0b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1d0c0 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66   nRec==0xfffffff
1d0d0 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  f ){.      asser
1d0e0 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
1d0f0 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48  alOff==JOURNAL_H
1d100 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
1d110 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69  .      nRec = (i
1d120 6e 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e  nt)((szJ - JOURN
1d130 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
1d140 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  ))/JOURNAL_PG_SZ
1d150 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d  (pPager));.    }
1d160 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63  ..    /* If nRec
1d170 20 69 73 20 30 20 61 6e 64 20 74 68 69 73 20 72   is 0 and this r
1d180 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61 20  ollback is of a 
1d190 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65 61  transaction crea
1d1a0 74 65 64 20 62 79 20 74 68 69 73 0a 20 20 20 20  ted by this.    
1d1b0 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e 64 20 69  ** process and i
1d1c0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
1d1d0 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68  nal header in th
1d1e0 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20  e journal, then 
1d1f0 69 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20  it means.    ** 
1d200 74 68 61 74 20 74 68 69 73 20 70 61 72 74 20 6f  that this part o
1d210 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  f the journal wa
1d220 73 20 62 65 69 6e 67 20 66 69 6c 6c 65 64 20 62  s being filled b
1d230 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  ut has not yet b
1d240 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65  een.    ** synce
1d250 64 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70  d to disk.  Comp
1d260 75 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ute the number o
1d270 66 20 70 61 67 65 73 20 62 61 73 65 64 20 6f 6e  f pages based on
1d280 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20   the remaining. 
1d290 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68     ** size of th
1d2a0 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  e file..    **. 
1d2b0 20 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64 20     ** The third 
1d2c0 74 65 72 6d 20 6f 66 20 74 68 65 20 74 65 73 74  term of the test
1d2d0 20 77 61 73 20 61 64 64 65 64 20 74 6f 20 66 69   was added to fi
1d2e0 78 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 0a  x ticket #2565..
1d2f0 20 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c      ** When roll
1d300 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 20 6a  ing back a hot j
1d310 6f 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30 20  ournal, nRec==0 
1d320 61 6c 77 61 79 73 20 6d 65 61 6e 73 20 74 68 61  always means tha
1d330 74 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 2a  t the next.    *
1d340 2a 20 63 68 75 6e 6b 20 6f 66 20 74 68 65 20 6a  * chunk of the j
1d350 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20  ournal contains 
1d360 7a 65 72 6f 20 70 61 67 65 73 20 74 6f 20 62 65  zero pages to be
1d370 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 42   rolled back.  B
1d380 75 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 64  ut.    ** when d
1d390 6f 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 20  oing a ROLLBACK 
1d3a0 61 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d 30 20  and the nRec==0 
1d3b0 63 68 75 6e 6b 20 69 73 20 74 68 65 20 6c 61 73  chunk is the las
1d3c0 74 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20 20 2a  t chunk in.    *
1d3d0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69  * the journal, i
1d3e0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
1d3f0 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63   journal might c
1d400 6f 6e 74 61 69 6e 20 61 64 64 69 74 69 6f 6e 61  ontain additiona
1d410 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65 73 20 74  l.    ** pages t
1d420 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 72  hat need to be r
1d430 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 74  olled back and t
1d440 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hat the number o
1d450 66 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20  f pages .    ** 
1d460 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74  should be comput
1d470 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  ed based on the 
1d480 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 69 7a  journal file siz
1d490 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
1d4a0 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73  ( nRec==0 && !is
1d4b0 48 6f 74 20 26 26 0a 20 20 20 20 20 20 20 20 70  Hot &&.        p
1d4c0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
1d4d0 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  r+JOURNAL_HDR_SZ
1d4e0 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72  (pPager)==pPager
1d4f0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a  ->journalOff ){.
1d500 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e        nRec = (in
1d510 74 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72  t)((szJ - pPager
1d520 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20  ->journalOff) / 
1d530 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
1d540 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  ager));.    }.. 
1d550 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
1d560 20 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65   the first heade
1d570 72 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  r read from the 
1d580 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74  journal, truncat
1d590 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  e the.    ** dat
1d5a0 61 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20  abase file back 
1d5b0 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
1d5c0 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
1d5d0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
1d5e0 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c  rnalOff==JOURNAL
1d5f0 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
1d600 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
1d610 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61  ger_truncate(pPa
1d620 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20  ger, mxPg);.    
1d630 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1d640 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
1d650 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
1d660 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1d670 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
1d680 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a 20 20   mxPg;.    }..  
1d690 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e    /* Copy origin
1d6a0 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20  al pages out of 
1d6b0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  the journal and 
1d6c0 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 0a 20  back into the . 
1d6d0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
1d6e0 69 6c 65 20 61 6e 64 2f 6f 72 20 70 61 67 65 20  ile and/or page 
1d6f0 63 61 63 68 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  cache..    */.  
1d700 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6e 52 65    for(u=0; u<nRe
1d710 63 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 20 20 69  c; u++){.      i
1d720 66 28 20 6e 65 65 64 50 61 67 65 72 52 65 73 65  f( needPagerRese
1d730 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67  t ){.        pag
1d740 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
1d750 3b 0a 20 20 20 20 20 20 20 20 6e 65 65 64 50 61  ;.        needPa
1d760 67 65 72 52 65 73 65 74 20 3d 20 30 3b 0a 20 20  gerReset = 0;.  
1d770 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
1d780 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
1d790 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
1d7a0 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  &pPager->journal
1d7b0 4f 66 66 2c 30 2c 31 2c 30 29 3b 0a 20 20 20 20  Off,0,1,0);.    
1d7c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1d7d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  _OK ){.        n
1d7e0 50 6c 61 79 62 61 63 6b 2b 2b 3b 0a 20 20 20 20  Playback++;.    
1d7f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1d800 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1d810 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  DONE ){.        
1d820 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1d830 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20  lOff = szJ;.    
1d840 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1d850 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
1d860 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
1d870 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
1d880 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
1d890 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65  e journal has be
1d8a0 65 6e 20 74 72 75 6e 63 61 74 65 64 2c 20 73 69  en truncated, si
1d8b0 6d 70 6c 79 20 73 74 6f 70 20 72 65 61 64 69 6e  mply stop readin
1d8c0 67 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20  g and.          
1d8d0 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68  ** processing th
1d8e0 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 68 69 73 20  e journal. This 
1d8f0 6d 69 67 68 74 20 68 61 70 70 65 6e 20 69 66 20  might happen if 
1d900 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a  the journal was.
1d910 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74            ** not
1d920 20 63 6f 6d 70 6c 65 74 65 6c 79 20 77 72 69 74   completely writ
1d930 74 65 6e 20 61 6e 64 20 73 79 6e 63 65 64 20 70  ten and synced p
1d940 72 69 6f 72 20 74 6f 20 61 20 63 72 61 73 68 2e  rior to a crash.
1d950 20 20 49 6e 20 74 68 61 74 0a 20 20 20 20 20 20    In that.      
1d960 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74 68 65      ** case, the
1d970 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64   database should
1d980 20 68 61 76 65 20 6e 65 76 65 72 20 62 65 65 6e   have never been
1d990 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 65 0a   written in the.
1d9a0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72            ** fir
1d9b0 73 74 20 70 6c 61 63 65 20 73 6f 20 69 74 20 69  st place so it i
1d9c0 73 20 4f 4b 20 74 6f 20 73 69 6d 70 6c 79 20 61  s OK to simply a
1d9d0 62 61 6e 64 6f 6e 20 74 68 65 20 72 6f 6c 6c 62  bandon the rollb
1d9e0 61 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ack. */.        
1d9f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1da00 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
1da10 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
1da20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1da30 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65          /* If we
1da40 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 72   are unable to r
1da50 6f 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20 61 6e  ollback, quit an
1da60 64 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72  d return the err
1da70 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  or.          ** 
1da80 63 6f 64 65 2e 20 20 54 68 69 73 20 77 69 6c 6c  code.  This will
1da90 20 63 61 75 73 65 20 74 68 65 20 70 61 67 65 72   cause the pager
1daa0 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 65 72   to enter the er
1dab0 72 6f 72 20 73 74 61 74 65 0a 20 20 20 20 20 20  ror state.      
1dac0 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 6e      ** so that n
1dad0 6f 20 66 75 72 74 68 65 72 20 68 61 72 6d 20 77  o further harm w
1dae0 69 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20 50 65  ill be done.  Pe
1daf0 72 68 61 70 73 20 74 68 65 20 6e 65 78 74 0a 20  rhaps the next. 
1db00 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63           ** proc
1db10 65 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e  ess to come alon
1db20 67 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20 74  g will be able t
1db30 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 64  o rollback the d
1db40 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 20  atabase..       
1db50 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
1db60 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
1db70 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
1db80 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1db90 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a   /*NOTREACHED*/.
1dba0 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a    assert( 0 );..
1dbb0 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20  end_playback:.  
1dbc0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1dbd0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
1dbe0 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
1dbf0 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26 73  esize(pPager, &s
1dc00 61 76 65 64 50 61 67 65 53 69 7a 65 2c 20 2d 31  avedPageSize, -1
1dc10 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46 6f 6c 6c  );.  }.  /* Foll
1dc20 6f 77 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  owing a rollback
1dc30 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  , the database f
1dc40 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 62 61  ile should be ba
1dc50 63 6b 20 69 6e 20 69 74 73 20 6f 72 69 67 69 6e  ck in its origin
1dc60 61 6c 0a 20 20 2a 2a 20 73 74 61 74 65 20 70 72  al.  ** state pr
1dc70 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  ior to the start
1dc80 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
1dc90 69 6f 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65 20 74  ion, so invoke t
1dca0 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46  he.  ** SQLITE_F
1dcb0 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45  CNTL_DB_UNCHANGE
1dcc0 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d  D file-control m
1dcd0 65 74 68 6f 64 20 74 6f 20 64 69 73 61 62 6c 65  ethod to disable
1dce0 20 74 68 65 0a 20 20 2a 2a 20 61 73 73 65 72 74   the.  ** assert
1dcf0 69 6f 6e 20 74 68 61 74 20 74 68 65 20 74 72 61  ion that the tra
1dd00 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
1dd10 20 77 61 73 20 6d 6f 64 69 66 69 65 64 2e 0a 20   was modified.. 
1dd20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
1dd30 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 50  E_DEBUG.  if( pP
1dd40 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
1dd50 64 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ds ){.    sqlite
1dd60 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69  3OsFileControlHi
1dd70 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 53 51  nt(pPager->fd,SQ
1dd80 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e  LITE_FCNTL_DB_UN
1dd90 43 48 41 4e 47 45 44 2c 30 29 3b 0a 20 20 7d 0a  CHANGED,0);.  }.
1dda0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
1ddb0 74 68 69 73 20 70 6c 61 79 62 61 63 6b 20 69 73  this playback is
1ddc0 20 68 61 70 70 65 6e 69 6e 67 20 61 75 74 6f 6d   happening autom
1ddd0 61 74 69 63 61 6c 6c 79 20 61 73 20 61 20 72 65  atically as a re
1dde0 73 75 6c 74 20 6f 66 20 61 6e 20 49 4f 20 6f 72  sult of an IO or
1ddf0 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72   .  ** malloc er
1de00 72 6f 72 20 74 68 61 74 20 6f 63 63 75 72 72 65  ror that occurre
1de10 64 20 61 66 74 65 72 20 74 68 65 20 63 68 61 6e  d after the chan
1de20 67 65 2d 63 6f 75 6e 74 65 72 20 77 61 73 20 75  ge-counter was u
1de30 70 64 61 74 65 64 20 62 75 74 20 0a 20 20 2a 2a  pdated but .  **
1de40 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e   before the tran
1de50 73 61 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d  saction was comm
1de60 69 74 74 65 64 2c 20 74 68 65 6e 20 74 68 65 20  itted, then the 
1de70 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a  change-counter .
1de80 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f    ** modificatio
1de90 6e 20 6d 61 79 20 6a 75 73 74 20 68 61 76 65 20  n may just have 
1dea0 62 65 65 6e 20 72 65 76 65 72 74 65 64 2e 20 49  been reverted. I
1deb0 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 20 69  f this happens i
1dec0 6e 20 65 78 63 6c 75 73 69 76 65 20 0a 20 20 2a  n exclusive .  *
1ded0 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 73 75 62  * mode, then sub
1dee0 73 65 71 75 65 6e 74 20 74 72 61 6e 73 61 63 74  sequent transact
1def0 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65 64 20 62  ions performed b
1df00 79 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  y the connection
1df10 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75   will not.  ** u
1df20 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
1df30 2d 63 6f 75 6e 74 65 72 20 61 74 20 61 6c 6c 2e  -counter at all.
1df40 20 54 68 69 73 20 6d 61 79 20 6c 65 61 64 20 74   This may lead t
1df50 6f 20 63 61 63 68 65 20 69 6e 63 6f 6e 73 69 73  o cache inconsis
1df60 74 65 6e 63 79 0a 20 20 2a 2a 20 70 72 6f 62 6c  tency.  ** probl
1df70 65 6d 73 20 66 6f 72 20 6f 74 68 65 72 20 70 72  ems for other pr
1df80 6f 63 65 73 73 65 73 20 61 74 20 73 6f 6d 65 20  ocesses at some 
1df90 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74  point in the fut
1dfa0 75 72 65 2e 20 53 6f 2c 20 6a 75 73 74 0a 20 20  ure. So, just.  
1dfb0 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 69 73 20  ** in case this 
1dfc0 68 61 73 20 68 61 70 70 65 6e 65 64 2c 20 63 6c  has happened, cl
1dfd0 65 61 72 20 74 68 65 20 63 68 61 6e 67 65 43 6f  ear the changeCo
1dfe0 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 6e 6f 77  untDone flag now
1dff0 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
1e000 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
1e010 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
1e020 69 6c 65 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d  ile;..  if( rc==
1e030 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1e040 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65   zMaster = pPage
1e050 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20  r->pTmpSpace;.  
1e060 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65    rc = readMaste
1e070 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  rJournal(pPager-
1e080 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70  >jfd, zMaster, p
1e090 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50  Pager->pVfs->mxP
1e0a0 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20  athname+1);.    
1e0b0 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
1e0c0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20  LITE_OK );.  }. 
1e0d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1e0e0 4f 4b 0a 20 20 20 26 26 20 28 70 50 61 67 65 72  OK.   && (pPager
1e0f0 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
1e100 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20  WRITER_DBMOD || 
1e110 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
1e120 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20 29 7b  PAGER_OPEN).  ){
1e130 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1e140 33 50 61 67 65 72 53 79 6e 63 28 70 50 61 67 65  3PagerSync(pPage
1e150 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  r, 0);.  }.  if(
1e160 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1e170 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
1e180 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
1e190 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  (pPager, zMaster
1e1a0 5b 30 5d 21 3d 27 5c 30 27 2c 20 30 29 3b 0a 20  [0]!='\0', 0);. 
1e1b0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
1e1c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
1e1d0 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
1e1e0 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72  TE_OK && zMaster
1e1f0 5b 30 5d 20 26 26 20 72 65 73 20 29 7b 0a 20 20  [0] && res ){.  
1e200 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61    /* If there wa
1e210 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  s a master journ
1e220 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74  al and this rout
1e230 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  ine will return 
1e240 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20  success,.    ** 
1e250 73 65 65 20 69 66 20 69 74 20 69 73 20 70 6f 73  see if it is pos
1e260 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20  sible to delete 
1e270 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
1e280 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  al..    */.    r
1e290 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73  c = pager_delmas
1e2a0 74 65 72 28 70 50 61 67 65 72 2c 20 7a 4d 61 73  ter(pPager, zMas
1e2b0 74 65 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61  ter);.    testca
1e2c0 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
1e2d0 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  K );.  }.  if( i
1e2e0 73 48 6f 74 20 26 26 20 6e 50 6c 61 79 62 61 63  sHot && nPlaybac
1e2f0 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  k ){.    sqlite3
1e300 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 54 49  _log(SQLITE_NOTI
1e310 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f 4c 4c 42  CE_RECOVER_ROLLB
1e320 41 43 4b 2c 20 22 72 65 63 6f 76 65 72 65 64 20  ACK, "recovered 
1e330 25 64 20 70 61 67 65 73 20 66 72 6f 6d 20 25 73  %d pages from %s
1e340 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1e350 20 20 20 6e 50 6c 61 79 62 61 63 6b 2c 20 70 50     nPlayback, pP
1e360 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b  ager->zJournal);
1e370 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50  .  }..  /* The P
1e380 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20  ager.sectorSize 
1e390 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76  variable may hav
1e3a0 65 20 62 65 65 6e 20 75 70 64 61 74 65 64 20 77  e been updated w
1e3b0 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a  hile rolling.  *
1e3c0 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c  * back a journal
1e3d0 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
1e3e0 6f 63 65 73 73 20 77 69 74 68 20 61 20 64 69 66  ocess with a dif
1e3f0 66 65 72 65 6e 74 20 73 65 63 74 6f 72 20 73 69  ferent sector si
1e400 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52  ze.  ** value. R
1e410 65 73 65 74 20 69 74 20 74 6f 20 74 68 65 20 63  eset it to the c
1e420 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72  orrect value for
1e430 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 20   this process.. 
1e440 20 2a 2f 0a 20 20 73 65 74 53 65 63 74 6f 72 53   */.  setSectorS
1e450 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ize(pPager);.  r
1e460 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
1e470 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f 6e  .** Read the con
1e480 74 65 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50  tent for page pP
1e490 67 20 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74  g out of the dat
1e4a0 61 62 61 73 65 20 66 69 6c 65 20 28 6f 72 20 6f  abase file (or o
1e4b0 75 74 20 6f 66 0a 2a 2a 20 74 68 65 20 57 41 4c  ut of.** the WAL
1e4c0 20 69 66 20 74 68 61 74 20 69 73 20 77 68 65 72   if that is wher
1e4d0 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  e the most recen
1e4e0 74 20 63 6f 70 79 20 69 66 20 66 6f 75 6e 64 29  t copy if found)
1e4f0 20 69 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70   into .** pPg->p
1e500 44 61 74 61 2e 20 41 20 73 68 61 72 65 64 20 6c  Data. A shared l
1e510 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d  ock or greater m
1e520 75 73 74 20 62 65 20 68 65 6c 64 20 6f 6e 20 74  ust be held on t
1e530 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  he database.** f
1e540 69 6c 65 20 62 65 66 6f 72 65 20 74 68 69 73 20  ile before this 
1e550 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1e560 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67  ed..**.** If pag
1e570 65 20 31 20 69 73 20 72 65 61 64 2c 20 74 68 65  e 1 is read, the
1e580 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50  n the value of P
1e590 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b  ager.dbFileVers[
1e5a0 5d 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 74  ] is set to.** t
1e5b0 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
1e5c0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
1e5d0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  file..**.** If a
1e5e0 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
1e5f0 73 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65  s, then the IO e
1e600 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
1e610 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
1e620 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  ** Otherwise, SQ
1e630 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1e640 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
1e650 6e 74 20 72 65 61 64 44 62 50 61 67 65 28 50 67  nt readDbPage(Pg
1e660 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
1e670 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
1e680 2d 3e 70 50 61 67 65 72 3b 20 2f 2a 20 50 61 67  ->pPager; /* Pag
1e690 65 72 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69  er object associ
1e6a0 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20 70  ated with page p
1e6b0 50 67 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  Pg */.  int rc =
1e6c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
1e6d0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
1e6e0 6f 64 65 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ode */..#ifndef 
1e6f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
1e700 20 20 75 33 32 20 69 46 72 61 6d 65 20 3d 20 30    u32 iFrame = 0
1e710 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1e720 2a 20 46 72 61 6d 65 20 6f 66 20 57 41 4c 20 63  * Frame of WAL c
1e730 6f 6e 74 61 69 6e 69 6e 67 20 70 67 6e 6f 20 2a  ontaining pgno *
1e740 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
1e750 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
1e760 45 52 5f 52 45 41 44 45 52 20 26 26 20 21 4d 45  ER_READER && !ME
1e770 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MDB );.  assert(
1e780 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1e790 66 64 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 61  fd) );..  if( pa
1e7a0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
1e7b0 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ) ){.    rc = sq
1e7c0 6c 69 74 65 33 57 61 6c 46 69 6e 64 46 72 61 6d  lite3WalFindFram
1e7d0 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
1e7e0 70 50 67 2d 3e 70 67 6e 6f 2c 20 26 69 46 72 61  pPg->pgno, &iFra
1e7f0 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  me);.    if( rc 
1e800 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
1e810 0a 20 20 69 66 28 20 69 46 72 61 6d 65 20 29 7b  .  if( iFrame ){
1e820 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1e830 33 57 61 6c 52 65 61 64 46 72 61 6d 65 28 70 50  3WalReadFrame(pP
1e840 61 67 65 72 2d 3e 70 57 61 6c 2c 20 69 46 72 61  ager->pWal, iFra
1e850 6d 65 2c 70 50 61 67 65 72 2d 3e 70 61 67 65 53  me,pPager->pageS
1e860 69 7a 65 2c 70 50 67 2d 3e 70 44 61 74 61 29 3b  ize,pPg->pData);
1e870 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a  .  }else.#endif.
1e880 20 20 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54    {.#ifdef SQLIT
1e890 45 5f 53 45 52 56 45 52 5f 45 44 49 54 49 4f 4e  E_SERVER_EDITION
1e8a0 0a 20 20 20 20 75 38 20 2a 70 44 61 74 61 20 3d  .    u8 *pData =
1e8b0 20 30 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65   0;.    if( page
1e8c0 72 49 73 53 65 72 76 65 72 28 70 50 61 67 65 72  rIsServer(pPager
1e8d0 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
1e8e0 65 33 53 65 72 76 65 72 52 65 61 64 50 61 67 65  e3ServerReadPage
1e8f0 28 70 50 61 67 65 72 2d 3e 70 53 65 72 76 65 72  (pPager->pServer
1e900 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 26 70 44  , pPg->pgno, &pD
1e910 61 74 61 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ata);.      if( 
1e920 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20  pData ){.       
1e930 20 6d 65 6d 63 70 79 28 70 50 67 2d 3e 70 44 61   memcpy(pPg->pDa
1e940 74 61 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65  ta, pData, pPage
1e950 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
1e960 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1e970 69 66 28 20 70 44 61 74 61 3d 3d 30 20 29 7b 0a  if( pData==0 ){.
1e980 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 36 34  #endif.      i64
1e990 20 69 4f 66 66 73 65 74 20 3d 20 28 70 50 67 2d   iOffset = (pPg-
1e9a0 3e 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  >pgno-1)*(i64)pP
1e9b0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
1e9c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1e9d0 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
1e9e0 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c  >fd, pPg->pData,
1e9f0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1ea00 65 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20  e, iOffset);.   
1ea10 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1ea20 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
1ea30 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  AD ){.        rc
1ea40 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1ea50 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
1ea60 49 54 45 5f 53 45 52 56 45 52 5f 45 44 49 54 49  ITE_SERVER_EDITI
1ea70 4f 4e 0a 20 20 20 20 20 20 69 66 28 20 70 61 67  ON.      if( pag
1ea80 65 72 49 73 53 65 72 76 65 72 28 70 50 61 67 65  erIsServer(pPage
1ea90 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  r) ){.        sq
1eaa0 6c 69 74 65 33 53 65 72 76 65 72 45 6e 64 52 65  lite3ServerEndRe
1eab0 61 64 50 61 67 65 28 70 50 61 67 65 72 2d 3e 70  adPage(pPager->p
1eac0 53 65 72 76 65 72 2c 20 70 50 67 2d 3e 70 67 6e  Server, pPg->pgn
1ead0 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  o);.      }.    
1eae0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 7d 0a 0a 20  }.#endif..  }.. 
1eaf0 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d   if( pPg->pgno==
1eb00 31 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 20  1 ){.    if( rc 
1eb10 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
1eb20 68 65 20 72 65 61 64 20 69 73 20 75 6e 73 75 63  he read is unsuc
1eb30 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65  cessful, set the
1eb40 20 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 74 6f   dbFileVers[] to
1eb50 20 73 6f 6d 65 74 68 69 6e 67 0a 20 20 20 20 20   something.     
1eb60 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 6e 65   ** that will ne
1eb70 76 65 72 20 62 65 20 61 20 76 61 6c 69 64 20 66  ver be a valid f
1eb80 69 6c 65 20 76 65 72 73 69 6f 6e 2e 20 20 64 62  ile version.  db
1eb90 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 61 20  FileVers[] is a 
1eba0 63 6f 70 79 0a 20 20 20 20 20 20 2a 2a 20 6f 66  copy.      ** of
1ebb0 20 62 79 74 65 73 20 32 34 2e 2e 33 39 20 6f 66   bytes 24..39 of
1ebc0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
1ebd0 42 79 74 65 73 20 32 38 2e 2e 33 31 20 73 68 6f  Bytes 28..31 sho
1ebe0 75 6c 64 20 61 6c 77 61 79 73 20 62 65 0a 20 20  uld always be.  
1ebf0 20 20 20 20 2a 2a 20 7a 65 72 6f 20 6f 72 20 74      ** zero or t
1ec00 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
1ec10 61 74 61 62 61 73 65 20 69 6e 20 70 61 67 65 2e  atabase in page.
1ec20 20 42 79 74 65 73 20 33 32 2e 2e 33 35 20 61 6e   Bytes 32..35 an
1ec30 64 20 33 35 2e 2e 33 39 0a 20 20 20 20 20 20 2a  d 35..39.      *
1ec40 2a 20 73 68 6f 75 6c 64 20 62 65 20 70 61 67 65  * should be page
1ec50 20 6e 75 6d 62 65 72 73 20 77 68 69 63 68 20 61   numbers which a
1ec60 72 65 20 6e 65 76 65 72 20 30 78 66 66 66 66 66  re never 0xfffff
1ec70 66 66 66 2e 20 20 53 6f 20 66 69 6c 6c 69 6e 67  fff.  So filling
1ec80 0a 20 20 20 20 20 20 2a 2a 20 70 50 61 67 65 72  .      ** pPager
1ec90 2d 3e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 77  ->dbFileVers[] w
1eca0 69 74 68 20 61 6c 6c 20 30 78 66 66 20 62 79 74  ith all 0xff byt
1ecb0 65 73 20 73 68 6f 75 6c 64 20 73 75 66 66 69 63  es should suffic
1ecc0 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
1ecd0 20 20 2a 2a 20 46 6f 72 20 61 6e 20 65 6e 63 72    ** For an encr
1ece0 79 70 74 65 64 20 64 61 74 61 62 61 73 65 2c 20  ypted database, 
1ecf0 74 68 65 20 73 69 74 75 61 74 69 6f 6e 20 69 73  the situation is
1ed00 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 3a 20 20   more complex:  
1ed10 62 79 74 65 73 0a 20 20 20 20 20 20 2a 2a 20 32  bytes.      ** 2
1ed20 34 2e 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74  4..39 of the dat
1ed30 61 62 61 73 65 20 61 72 65 20 77 68 69 74 65 20  abase are white 
1ed40 6e 6f 69 73 65 2e 20 20 42 75 74 20 74 68 65 20  noise.  But the 
1ed50 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 0a 20  probability of. 
1ed60 20 20 20 20 20 2a 2a 20 77 68 69 74 65 20 6e 6f       ** white no
1ed70 69 73 65 20 65 71 75 61 6c 69 6e 67 20 31 36 20  ise equaling 16 
1ed80 62 79 74 65 73 20 6f 66 20 30 78 66 66 20 69 73  bytes of 0xff is
1ed90 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61   vanishingly sma
1eda0 6c 6c 20 73 6f 0a 20 20 20 20 20 20 2a 2a 20 77  ll so.      ** w
1edb0 65 20 73 68 6f 75 6c 64 20 73 74 69 6c 6c 20 62  e should still b
1edc0 65 20 6f 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  e ok..      */. 
1edd0 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67       memset(pPag
1ede0 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
1edf0 30 78 66 66 2c 20 73 69 7a 65 6f 66 28 70 50 61  0xff, sizeof(pPa
1ee00 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
1ee10 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1ee20 20 20 20 20 75 38 20 2a 64 62 46 69 6c 65 56 65      u8 *dbFileVe
1ee30 72 73 20 3d 20 26 28 28 75 38 2a 29 70 50 67 2d  rs = &((u8*)pPg-
1ee40 3e 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20  >pData)[24];.   
1ee50 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
1ee60 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64  r->dbFileVers, d
1ee70 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f  bFileVers, sizeo
1ee80 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
1ee90 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20  Vers));.    }.  
1eea0 7d 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67 65  }.  CODEC1(pPage
1eeb0 72 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70  r, pPg->pData, p
1eec0 50 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72 63 20  Pg->pgno, 3, rc 
1eed0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
1eee0 4b 50 54 29 3b 0a 0a 20 20 50 41 47 45 52 5f 49  KPT);..  PAGER_I
1eef0 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
1ef00 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b  r_readdb_count);
1ef10 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50  .  PAGER_INCR(pP
1ef20 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20  ager->nRead);.  
1ef30 49 4f 54 52 41 43 45 28 28 22 50 47 49 4e 20 25  IOTRACE(("PGIN %
1ef40 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
1ef50 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20   pPg->pgno));.  
1ef60 50 41 47 45 52 54 52 41 43 45 28 28 22 46 45 54  PAGERTRACE(("FET
1ef70 43 48 20 25 64 20 70 61 67 65 20 25 64 20 68 61  CH %d page %d ha
1ef80 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20  sh(%08x)\n",.   
1ef90 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
1efa0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
1efb0 2d 3e 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61  ->pgno, pager_pa
1efc0 67 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a  gehash(pPg)));..
1efd0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1efe0 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65  /*.** Update the
1eff0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63 68   value of the ch
1f000 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20  ange-counter at 
1f010 6f 66 66 73 65 74 73 20 32 34 20 61 6e 64 20 39  offsets 24 and 9
1f020 32 20 69 6e 0a 2a 2a 20 74 68 65 20 68 65 61 64  2 in.** the head
1f030 65 72 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74  er and the sqlit
1f040 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72  e version number
1f050 20 61 74 20 6f 66 66 73 65 74 20 39 36 2e 0a 2a   at offset 96..*
1f060 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20  *.** This is an 
1f070 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 75 70  unconditional up
1f080 64 61 74 65 2e 20 20 53 65 65 20 61 6c 73 6f 20  date.  See also 
1f090 74 68 65 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  the pager_incr_c
1f0a0 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 0a 2a  hangecounter().*
1f0b0 2a 20 72 6f 75 74 69 6e 65 20 77 68 69 63 68 20  * routine which 
1f0c0 6f 6e 6c 79 20 75 70 64 61 74 65 73 20 74 68 65  only updates the
1f0d0 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
1f0e0 69 66 20 74 68 65 20 75 70 64 61 74 65 20 69 73  if the update is
1f0f0 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6e 65 65   actually.** nee
1f100 64 65 64 2c 20 61 73 20 64 65 74 65 72 6d 69 6e  ded, as determin
1f110 65 64 20 62 79 20 74 68 65 20 70 50 61 67 65 72  ed by the pPager
1f120 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
1f130 65 20 73 74 61 74 65 20 76 61 72 69 61 62 6c 65  e state variable
1f140 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1f150 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61   pager_write_cha
1f160 6e 67 65 63 6f 75 6e 74 65 72 28 50 67 48 64 72  ngecounter(PgHdr
1f170 20 2a 70 50 67 29 7b 0a 20 20 75 33 32 20 63 68   *pPg){.  u32 ch
1f180 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 0a 20  ange_counter;.. 
1f190 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68   /* Increment th
1f1a0 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61  e value just rea
1f1b0 64 20 61 6e 64 20 77 72 69 74 65 20 69 74 20 62  d and write it b
1f1c0 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20  ack to byte 24. 
1f1d0 2a 2f 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e  */.  change_coun
1f1e0 74 65 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ter = sqlite3Get
1f1f0 34 62 79 74 65 28 28 75 38 2a 29 70 50 67 2d 3e  4byte((u8*)pPg->
1f200 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1f210 72 73 29 2b 31 3b 0a 20 20 70 75 74 33 32 62 69  rs)+1;.  put32bi
1f220 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e  ts(((char*)pPg->
1f230 70 44 61 74 61 29 2b 32 34 2c 20 63 68 61 6e 67  pData)+24, chang
1f240 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 2f  e_counter);..  /
1f250 2a 20 41 6c 73 6f 20 73 74 6f 72 65 20 74 68 65  * Also store the
1f260 20 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20   SQLite version 
1f270 6e 75 6d 62 65 72 20 69 6e 20 62 79 74 65 73 20  number in bytes 
1f280 39 36 2e 2e 39 39 20 61 6e 64 20 69 6e 0a 20 20  96..99 and in.  
1f290 2a 2a 20 62 79 74 65 73 20 39 32 2e 2e 39 35 20  ** bytes 92..95 
1f2a0 73 74 6f 72 65 20 74 68 65 20 63 68 61 6e 67 65  store the change
1f2b0 20 63 6f 75 6e 74 65 72 20 66 6f 72 20 77 68 69   counter for whi
1f2c0 63 68 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6e  ch the version n
1f2d0 75 6d 62 65 72 0a 20 20 2a 2a 20 69 73 20 76 61  umber.  ** is va
1f2e0 6c 69 64 2e 20 2a 2f 0a 20 20 70 75 74 33 32 62  lid. */.  put32b
1f2f0 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d  its(((char*)pPg-
1f300 3e 70 44 61 74 61 29 2b 39 32 2c 20 63 68 61 6e  >pData)+92, chan
1f310 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 20 20 70  ge_counter);.  p
1f320 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a  ut32bits(((char*
1f330 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 39 36 2c  )pPg->pData)+96,
1f340 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f   SQLITE_VERSION_
1f350 4e 55 4d 42 45 52 29 3b 0a 7d 0a 0a 23 69 66 6e  NUMBER);.}..#ifn
1f360 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1f370 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  WAL./*.** This f
1f380 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b  unction is invok
1f390 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ed once for each
1f3a0 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20 61   page that has a
1f3b0 6c 72 65 61 64 79 20 62 65 65 6e 20 0a 2a 2a 20  lready been .** 
1f3c0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1f3d0 20 6c 6f 67 20 66 69 6c 65 20 77 68 65 6e 20 61   log file when a
1f3e0 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e   WAL transaction
1f3f0 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
1f400 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 69 50  .** Parameter iP
1f410 67 20 69 73 20 74 68 65 20 70 61 67 65 20 6e 75  g is the page nu
1f420 6d 62 65 72 20 6f 66 20 73 61 69 64 20 70 61 67  mber of said pag
1f430 65 2e 20 54 68 65 20 70 43 74 78 20 61 72 67 75  e. The pCtx argu
1f440 6d 65 6e 74 20 0a 2a 2a 20 69 73 20 61 63 74 75  ment .** is actu
1f450 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74  ally a pointer t
1f460 6f 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  o the Pager stru
1f470 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  cture..**.** If 
1f480 70 61 67 65 20 69 50 67 20 69 73 20 70 72 65 73  page iPg is pres
1f490 65 6e 74 20 69 6e 20 74 68 65 20 63 61 63 68 65  ent in the cache
1f4a0 2c 20 61 6e 64 20 68 61 73 20 6e 6f 20 6f 75 74  , and has no out
1f4b0 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
1f4c0 63 65 73 2c 0a 2a 2a 20 69 74 20 69 73 20 64 69  ces,.** it is di
1f4d0 73 63 61 72 64 65 64 2e 20 4f 74 68 65 72 77 69  scarded. Otherwi
1f4e0 73 65 2c 20 69 66 20 74 68 65 72 65 20 61 72 65  se, if there are
1f4f0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74   one or more out
1f500 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 72 65 66 65  standing.** refe
1f510 72 65 6e 63 65 73 2c 20 74 68 65 20 70 61 67 65  rences, the page
1f520 20 63 6f 6e 74 65 6e 74 20 69 73 20 72 65 6c 6f   content is relo
1f530 61 64 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61  aded from the da
1f540 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 0a 2a  tabase. If the.*
1f550 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 6c  * attempt to rel
1f560 6f 61 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  oad content from
1f570 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1f580 20 72 65 71 75 69 72 65 64 20 61 6e 64 20 66 61   required and fa
1f590 69 6c 73 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20  ils, .** return 
1f5a0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
1f5b0 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  code. Otherwise,
1f5c0 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
1f5d0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55  tatic int pagerU
1f5e0 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64  ndoCallback(void
1f5f0 20 2a 70 43 74 78 2c 20 50 67 6e 6f 20 69 50 67   *pCtx, Pgno iPg
1f600 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1f610 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72  LITE_OK;.  Pager
1f620 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67 65   *pPager = (Page
1f630 72 20 2a 29 70 43 74 78 3b 0a 20 20 50 67 48 64  r *)pCtx;.  PgHd
1f640 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65 72  r *pPg;..  asser
1f650 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  t( pagerUseWal(p
1f660 50 61 67 65 72 29 20 29 3b 0a 20 20 70 50 67 20  Pager) );.  pPg 
1f670 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  = sqlite3PagerLo
1f680 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 69 50 67  okup(pPager, iPg
1f690 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a  );.  if( pPg ){.
1f6a0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
1f6b0 63 61 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e  cachePageRefcoun
1f6c0 74 28 70 50 67 29 3d 3d 31 20 29 7b 0a 20 20 20  t(pPg)==1 ){.   
1f6d0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
1f6e0 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 20 20 7d  Drop(pPg);.    }
1f6f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
1f700 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67 29   readDbPage(pPg)
1f710 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
1f720 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1f730 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65       pPager->xRe
1f740 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20  initer(pPg);.   
1f750 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1f760 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e  e3PagerUnrefNotN
1f770 75 6c 6c 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  ull(pPg);.    }.
1f780 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c    }..  /* Normal
1f790 6c 79 2c 20 69 66 20 61 20 74 72 61 6e 73 61 63  ly, if a transac
1f7a0 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
1f7b0 61 63 6b 2c 20 61 6e 79 20 62 61 63 6b 75 70 20  ack, any backup 
1f7c0 70 72 6f 63 65 73 73 65 73 20 61 72 65 0a 20 20  processes are.  
1f7d0 2a 2a 20 75 70 64 61 74 65 64 20 61 73 20 64 61  ** updated as da
1f7e0 74 61 20 69 73 20 63 6f 70 69 65 64 20 6f 75 74  ta is copied out
1f7f0 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   of the rollback
1f800 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 6e 74   journal and int
1f810 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  o the.  ** datab
1f820 61 73 65 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  ase. This is not
1f830 20 67 65 6e 65 72 61 6c 6c 79 20 70 6f 73 73 69   generally possi
1f840 62 6c 65 20 77 69 74 68 20 61 20 57 41 4c 20 64  ble with a WAL d
1f850 61 74 61 62 61 73 65 2c 20 61 73 0a 20 20 2a 2a  atabase, as.  **
1f860 20 72 6f 6c 6c 62 61 63 6b 20 69 6e 76 6f 6c 76   rollback involv
1f870 65 73 20 73 69 6d 70 6c 79 20 74 72 75 6e 63 61  es simply trunca
1f880 74 69 6e 67 20 74 68 65 20 6c 6f 67 20 66 69 6c  ting the log fil
1f890 65 2e 20 54 68 65 72 65 66 6f 72 65 2c 20 69 66  e. Therefore, if
1f8a0 20 6f 6e 65 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72   one.  ** or mor
1f8b0 65 20 66 72 61 6d 65 73 20 68 61 76 65 20 61 6c  e frames have al
1f8c0 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
1f8d0 65 6e 20 74 6f 20 74 68 65 20 6c 6f 67 20 28 61  en to the log (a
1f8e0 6e 64 20 74 68 65 72 65 66 6f 72 65 20 0a 20 20  nd therefore .  
1f8f0 2a 2a 20 61 6c 73 6f 20 63 6f 70 69 65 64 20 69  ** also copied i
1f900 6e 74 6f 20 74 68 65 20 62 61 63 6b 75 70 20 64  nto the backup d
1f910 61 74 61 62 61 73 65 73 29 20 61 73 20 70 61 72  atabases) as par
1f920 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61  t of this transa
1f930 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65 20  ction,.  ** the 
1f940 62 61 63 6b 75 70 73 20 6d 75 73 74 20 62 65 20  backups must be 
1f950 72 65 73 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a  restarted..  */.
1f960 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52    sqlite3BackupR
1f970 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70  estart(pPager->p
1f980 42 61 63 6b 75 70 29 3b 0a 0a 20 20 72 65 74 75  Backup);..  retu
1f990 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1f9a0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1f9b0 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62   called to rollb
1f9c0 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ack a transactio
1f9d0 6e 20 6f 6e 20 61 20 57 41 4c 20 64 61 74 61 62  n on a WAL datab
1f9e0 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ase..*/.static i
1f9f0 6e 74 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b  nt pagerRollback
1fa00 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  Wal(Pager *pPage
1fa10 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
1fa20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa30 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1fa40 43 6f 64 65 20 2a 2f 0a 20 20 50 67 48 64 72 20  Code */.  PgHdr 
1fa50 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  *pList;         
1fa60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
1fa70 74 20 6f 66 20 64 69 72 74 79 20 70 61 67 65 73  t of dirty pages
1fa80 20 74 6f 20 72 65 76 65 72 74 20 2a 2f 0a 0a 20   to revert */.. 
1fa90 20 2f 2a 20 46 6f 72 20 61 6c 6c 20 70 61 67 65   /* For all page
1faa0 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 74  s in the cache t
1fab0 68 61 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c  hat are currentl
1fac0 79 20 64 69 72 74 79 20 6f 72 20 68 61 76 65 20  y dirty or have 
1fad0 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 62 65 65  already.  ** bee
1fae0 6e 20 77 72 69 74 74 65 6e 20 28 62 75 74 20 6e  n written (but n
1faf0 6f 74 20 63 6f 6d 6d 69 74 74 65 64 29 20 74 6f  ot committed) to
1fb00 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2c 20 64   the log file, d
1fb10 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 20 20  o one of the .  
1fb20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20  ** following:.  
1fb30 2a 2a 0a 20 20 2a 2a 20 20 20 2b 20 44 69 73 63  **.  **   + Disc
1fb40 61 72 64 20 74 68 65 20 63 61 63 68 65 64 20 70  ard the cached p
1fb50 61 67 65 20 28 69 66 20 72 65 66 63 6f 75 6e 74  age (if refcount
1fb60 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 20 20  ==0), or.  **   
1fb70 2b 20 52 65 6c 6f 61 64 20 70 61 67 65 20 63 6f  + Reload page co
1fb80 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64  ntent from the d
1fb90 61 74 61 62 61 73 65 20 28 69 66 20 72 65 66 63  atabase (if refc
1fba0 6f 75 6e 74 3e 30 29 2e 0a 20 20 2a 2f 0a 20 20  ount>0)..  */.  
1fbb0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
1fbc0 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
1fbd0 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ize;.  rc = sqli
1fbe0 74 65 33 57 61 6c 55 6e 64 6f 28 70 50 61 67 65  te3WalUndo(pPage
1fbf0 72 2d 3e 70 57 61 6c 2c 20 70 61 67 65 72 55 6e  r->pWal, pagerUn
1fc00 64 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69  doCallback, (voi
1fc10 64 20 2a 29 70 50 61 67 65 72 29 3b 0a 20 20 70  d *)pPager);.  p
1fc20 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63  List = sqlite3Pc
1fc30 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50  acheDirtyList(pP
1fc40 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
1fc50 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 26    while( pList &
1fc60 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
1fc70 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 4e  ){.    PgHdr *pN
1fc80 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69  ext = pList->pDi
1fc90 72 74 79 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  rty;.    rc = pa
1fca0 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28  gerUndoCallback(
1fcb0 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20  (void *)pPager, 
1fcc0 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pList->pgno);.  
1fcd0 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b    pList = pNext;
1fce0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
1fcf0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
1fd00 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 77   function is a w
1fd10 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71  rapper around sq
1fd20 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28 29  lite3WalFrames()
1fd30 2e 20 41 73 20 77 65 6c 6c 20 61 73 20 6c 6f 67  . As well as log
1fd40 67 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  ging.** the cont
1fd50 65 6e 74 73 20 6f 66 20 74 68 65 20 6c 69 73 74  ents of the list
1fd60 20 6f 66 20 70 61 67 65 73 20 68 65 61 64 65 64   of pages headed
1fd70 20 62 79 20 70 4c 69 73 74 20 28 63 6f 6e 6e 65   by pList (conne
1fd80 63 74 65 64 20 62 79 20 70 44 69 72 74 79 29 2c  cted by pDirty),
1fd90 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
1fda0 6e 20 6e 6f 74 69 66 69 65 73 20 61 6e 79 20 61  n notifies any a
1fdb0 63 74 69 76 65 20 62 61 63 6b 75 70 20 70 72 6f  ctive backup pro
1fdc0 63 65 73 73 65 73 20 74 68 61 74 20 74 68 65 20  cesses that the 
1fdd0 70 61 67 65 73 20 68 61 76 65 0a 2a 2a 20 63 68  pages have.** ch
1fde0 61 6e 67 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  anged. .**.** Th
1fdf0 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  e list of pages 
1fe00 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68 69 73  passed into this
1fe10 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6c 77 61   routine is alwa
1fe20 79 73 20 73 6f 72 74 65 64 20 62 79 20 70 61 67  ys sorted by pag
1fe30 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 48 65 6e  e number..** Hen
1fe40 63 65 2c 20 69 66 20 70 61 67 65 20 31 20 61 70  ce, if page 1 ap
1fe50 70 65 61 72 73 20 61 6e 79 77 68 65 72 65 20 6f  pears anywhere o
1fe60 6e 20 74 68 65 20 6c 69 73 74 2c 20 69 74 20 77  n the list, it w
1fe70 69 6c 6c 20 62 65 20 74 68 65 20 66 69 72 73 74  ill be the first
1fe80 20 70 61 67 65 2e 0a 2a 2f 20 0a 73 74 61 74 69   page..*/ .stati
1fe90 63 20 69 6e 74 20 70 61 67 65 72 57 61 6c 46 72  c int pagerWalFr
1fea0 61 6d 65 73 28 0a 20 20 50 61 67 65 72 20 2a 70  ames(.  Pager *p
1feb0 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
1fec0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
1fed0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67 48   object */.  PgH
1fee0 64 72 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  dr *pList,      
1fef0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ff00 4c 69 73 74 20 6f 66 20 66 72 61 6d 65 73 20 74  List of frames t
1ff10 6f 20 6c 6f 67 20 2a 2f 0a 20 20 50 67 6e 6f 20  o log */.  Pgno 
1ff20 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20  nTruncate,      
1ff30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
1ff40 74 61 62 61 73 65 20 73 69 7a 65 20 61 66 74 65  tabase size afte
1ff50 72 20 74 68 69 73 20 63 6f 6d 6d 69 74 20 2a 2f  r this commit */
1ff60 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20  .  int isCommit 
1ff70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff80 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
1ff90 69 73 20 69 73 20 61 20 63 6f 6d 6d 69 74 20 2a  is is a commit *
1ffa0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
1ffb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ffc0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1ffd0 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   code */.  int n
1ffe0 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
1fff0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
20000 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
20010 20 70 4c 69 73 74 20 2a 2f 0a 20 20 50 67 48 64   pList */.  PgHd
20020 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  r *p;           
20030 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
20040 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
20050 70 61 67 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65  pages */..  asse
20060 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c  rt( pPager->pWal
20070 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c   );.  assert( pL
20080 69 73 74 20 29 3b 0a 23 69 66 64 65 66 20 53 51  ist );.#ifdef SQ
20090 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
200a0 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
200b0 70 61 67 65 20 6c 69 73 74 20 69 73 20 69 6e 20  page list is in 
200c0 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  accending order 
200d0 2a 2f 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74  */.  for(p=pList
200e0 3b 20 70 20 26 26 20 70 2d 3e 70 44 69 72 74 79  ; p && p->pDirty
200f0 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a  ; p=p->pDirty){.
20100 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
20110 67 6e 6f 20 3c 20 70 2d 3e 70 44 69 72 74 79 2d  gno < p->pDirty-
20120 3e 70 67 6e 6f 20 29 3b 0a 20 20 7d 0a 23 65 6e  >pgno );.  }.#en
20130 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
20140 4c 69 73 74 2d 3e 70 44 69 72 74 79 3d 3d 30 20  List->pDirty==0 
20150 7c 7c 20 69 73 43 6f 6d 6d 69 74 20 29 3b 0a 20  || isCommit );. 
20160 20 69 66 28 20 69 73 43 6f 6d 6d 69 74 20 29 7b   if( isCommit ){
20170 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 57 41 4c  .    /* If a WAL
20180 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
20190 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2c  being committed,
201a0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69   there is no poi
201b0 6e 74 20 69 6e 20 77 72 69 74 69 6e 67 0a 20 20  nt in writing.  
201c0 20 20 2a 2a 20 61 6e 79 20 70 61 67 65 73 20 77    ** any pages w
201d0 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73  ith page numbers
201e0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6e 54   greater than nT
201f0 72 75 6e 63 61 74 65 20 69 6e 74 6f 20 74 68 65  runcate into the
20200 20 57 41 4c 20 66 69 6c 65 2e 0a 20 20 20 20 2a   WAL file..    *
20210 2a 20 54 68 65 79 20 77 69 6c 6c 20 6e 65 76 65  * They will neve
20220 72 20 62 65 20 72 65 61 64 20 62 79 20 61 6e 79  r be read by any
20230 20 63 6c 69 65 6e 74 2e 20 53 6f 20 72 65 6d 6f   client. So remo
20240 76 65 20 74 68 65 6d 20 66 72 6f 6d 20 74 68 65  ve them from the
20250 20 70 44 69 72 74 79 0a 20 20 20 20 2a 2a 20 6c   pDirty.    ** l
20260 69 73 74 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20  ist here. */.   
20270 20 50 67 48 64 72 20 2a 2a 70 70 4e 65 78 74 20   PgHdr **ppNext 
20280 3d 20 26 70 4c 69 73 74 3b 0a 20 20 20 20 6e 4c  = &pList;.    nL
20290 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  ist = 0;.    for
202a0 28 70 3d 70 4c 69 73 74 3b 20 28 2a 70 70 4e 65  (p=pList; (*ppNe
202b0 78 74 20 3d 20 70 29 21 3d 30 3b 20 70 3d 70 2d  xt = p)!=0; p=p-
202c0 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20 20  >pDirty){.      
202d0 69 66 28 20 70 2d 3e 70 67 6e 6f 3c 3d 6e 54 72  if( p->pgno<=nTr
202e0 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20 20 20  uncate ){.      
202f0 20 20 70 70 4e 65 78 74 20 3d 20 26 70 2d 3e 70    ppNext = &p->p
20300 44 69 72 74 79 3b 0a 20 20 20 20 20 20 20 20 6e  Dirty;.        n
20310 4c 69 73 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  List++;.      }.
20320 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
20330 28 20 70 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c  ( pList );.  }el
20340 73 65 7b 0a 20 20 20 20 6e 4c 69 73 74 20 3d 20  se{.    nList = 
20350 31 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  1;.  }.  pPager-
20360 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41  >aStat[PAGER_STA
20370 54 5f 57 52 49 54 45 5d 20 2b 3d 20 6e 4c 69 73  T_WRITE] += nLis
20380 74 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 2d  t;..  if( pList-
20390 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72  >pgno==1 ) pager
203a0 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75  _write_changecou
203b0 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a 20 20 72  nter(pList);.  r
203c0 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 72  c = sqlite3WalFr
203d0 61 6d 65 73 28 70 50 61 67 65 72 2d 3e 70 57 61  ames(pPager->pWa
203e0 6c 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65 72  l, .      pPager
203f0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 4c 69 73  ->pageSize, pLis
20400 74 2c 20 6e 54 72 75 6e 63 61 74 65 2c 20 69 73  t, nTruncate, is
20410 43 6f 6d 6d 69 74 2c 20 70 50 61 67 65 72 2d 3e  Commit, pPager->
20420 77 61 6c 53 79 6e 63 46 6c 61 67 73 0a 20 20 29  walSyncFlags.  )
20430 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
20440 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
20450 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20  >pBackup ){.    
20460 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20  for(p=pList; p; 
20470 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20  p=p->pDirty){.  
20480 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75      sqlite3Backu
20490 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e  pUpdate(pPager->
204a0 70 42 61 63 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f  pBackup, p->pgno
204b0 2c 20 28 75 38 20 2a 29 70 2d 3e 70 44 61 74 61  , (u8 *)p->pData
204c0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69  );.    }.  }..#i
204d0 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
204e0 4b 5f 50 41 47 45 53 0a 20 20 70 4c 69 73 74 20  K_PAGES.  pList 
204f0 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44  = sqlite3PcacheD
20500 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d  irtyList(pPager-
20510 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 66 6f 72  >pPCache);.  for
20520 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70  (p=pList; p; p=p
20530 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 70  ->pDirty){.    p
20540 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
20550 68 28 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  h(p);.  }.#endif
20560 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
20570 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20  ../*.** Begin a 
20580 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
20590 20 6f 6e 20 74 68 65 20 57 41 4c 2e 0a 2a 2a 0a   on the WAL..**.
205a0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
205b0 75 73 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65  used to be calle
205c0 64 20 22 70 61 67 65 72 4f 70 65 6e 53 6e 61 70  d "pagerOpenSnap
205d0 73 68 6f 74 28 29 22 20 62 65 63 61 75 73 65 20  shot()" because 
205e0 69 74 20 65 73 73 65 6e 74 69 61 6c 6c 79 0a 2a  it essentially.*
205f0 2a 20 6d 61 6b 65 73 20 61 20 73 6e 61 70 73 68  * makes a snapsh
20600 6f 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ot of the databa
20610 73 65 20 61 74 20 74 68 65 20 63 75 72 72 65 6e  se at the curren
20620 74 20 70 6f 69 6e 74 20 69 6e 20 74 69 6d 65 20  t point in time 
20630 61 6e 64 20 70 72 65 73 65 72 76 65 73 0a 2a 2a  and preserves.**
20640 20 74 68 61 74 20 73 6e 61 70 73 68 6f 74 20 66   that snapshot f
20650 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 72 65  or use by the re
20660 61 64 65 72 20 69 6e 20 73 70 69 74 65 20 6f 66  ader in spite of
20670 20 63 6f 6e 63 75 72 72 65 6e 74 6c 79 20 63 68   concurrently ch
20680 61 6e 67 65 73 20 62 79 0a 2a 2a 20 6f 74 68 65  anges by.** othe
20690 72 20 77 72 69 74 65 72 73 20 6f 72 20 63 68 65  r writers or che
206a0 63 6b 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73  ckpointers..*/.s
206b0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 42  tatic int pagerB
206c0 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74  eginReadTransact
206d0 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  ion(Pager *pPage
206e0 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
206f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20700 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
20710 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63 68  code */.  int ch
20720 61 6e 67 65 64 20 3d 20 30 3b 20 20 20 20 20 20  anged = 0;      
20730 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
20740 65 20 69 66 20 63 61 63 68 65 20 6d 75 73 74 20  e if cache must 
20750 62 65 20 72 65 73 65 74 20 2a 2f 0a 0a 20 20 61  be reset */..  a
20760 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57  ssert( pagerUseW
20770 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
20780 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
20790 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
207a0 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  EN || pPager->eS
207b0 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
207c0 45 52 20 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69  ER );..  /* sqli
207d0 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61  te3WalEndReadTra
207e0 6e 73 61 63 74 69 6f 6e 28 29 20 77 61 73 20 6e  nsaction() was n
207f0 6f 74 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68  ot called for th
20800 65 20 70 72 65 76 69 6f 75 73 0a 20 20 2a 2a 20  e previous.  ** 
20810 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 6c  transaction in l
20820 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c  ocking_mode=EXCL
20830 55 53 49 56 45 2e 20 20 53 6f 20 63 61 6c 6c 20  USIVE.  So call 
20840 69 74 20 6e 6f 77 2e 20 20 49 66 20 77 65 0a 20  it now.  If we. 
20850 20 2a 2a 20 61 72 65 20 69 6e 20 6c 6f 63 6b 69   ** are in locki
20860 6e 67 5f 6d 6f 64 65 3d 4e 4f 52 4d 41 4c 20 61  ng_mode=NORMAL a
20870 6e 64 20 45 6e 64 52 65 61 64 28 29 20 77 61 73  nd EndRead() was
20880 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c   previously call
20890 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20 64 75 70  ed,.  ** the dup
208a0 6c 69 63 61 74 65 20 63 61 6c 6c 20 69 73 20 68  licate call is h
208b0 61 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  armless..  */.  
208c0 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61  sqlite3WalEndRea
208d0 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  dTransaction(pPa
208e0 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 72  ger->pWal);..  r
208f0 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65  c = sqlite3WalBe
20900 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69  ginReadTransacti
20910 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  on(pPager->pWal,
20920 20 26 63 68 61 6e 67 65 64 29 3b 0a 20 20 69 66   &changed);.  if
20930 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
20940 7c 7c 20 63 68 61 6e 67 65 64 20 29 7b 0a 20 20  || changed ){.  
20950 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
20960 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 55  ager);.    if( U
20970 53 45 46 45 54 43 48 28 70 50 61 67 65 72 29 20  SEFETCH(pPager) 
20980 29 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74  ) sqlite3OsUnfet
20990 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30  ch(pPager->fd, 0
209a0 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  , 0);.  }..  ret
209b0 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
209c0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
209d0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
209e0 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 74  as part of the t
209f0 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 50  ransition from P
20a00 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 74 6f 20  AGER_OPEN.** to 
20a10 50 41 47 45 52 5f 52 45 41 44 45 52 20 73 74 61  PAGER_READER sta
20a20 74 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  te to determine 
20a30 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
20a40 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a  database file.**
20a50 20 69 6e 20 70 61 67 65 73 20 28 61 73 73 75 6d   in pages (assum
20a60 69 6e 67 20 74 68 65 20 70 61 67 65 20 73 69 7a  ing the page siz
20a70 65 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72  e currently stor
20a80 65 64 20 69 6e 20 50 61 67 65 72 2e 70 61 67 65  ed in Pager.page
20a90 53 69 7a 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  Size)..**.** If 
20aa0 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
20ab0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
20ac0 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 73  turned and the s
20ad0 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
20ae0 61 73 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20  ase.** in pages 
20af0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 6e  is stored in *pn
20b00 50 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  Page. Otherwise,
20b10 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28   an error code (
20b20 70 65 72 68 61 70 73 0a 2a 2a 20 53 51 4c 49 54  perhaps.** SQLIT
20b30 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 29 20 69  E_IOERR_FSTAT) i
20b40 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
20b50 70 6e 50 61 67 65 20 69 73 20 6c 65 66 74 20 75  pnPage is left u
20b60 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 73 74  nmodified..*/.st
20b70 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 61  atic int pagerPa
20b80 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  gecount(Pager *p
20b90 50 61 67 65 72 2c 20 50 67 6e 6f 20 2a 70 6e 50  Pager, Pgno *pnP
20ba0 61 67 65 29 7b 0a 20 20 50 67 6e 6f 20 6e 50 61  age){.  Pgno nPa
20bb0 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
20bc0 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
20bd0 20 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20 2a   to return via *
20be0 70 6e 50 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20  pnPage */..  /* 
20bf0 51 75 65 72 79 20 74 68 65 20 57 41 4c 20 73 75  Query the WAL su
20c00 62 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65  b-system for the
20c10 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 2e 20   database size. 
20c20 54 68 65 20 57 61 6c 44 62 73 69 7a 65 28 29 0a  The WalDbsize().
20c30 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65    ** function re
20c40 74 75 72 6e 73 20 7a 65 72 6f 20 69 66 20 74 68  turns zero if th
20c50 65 20 57 41 4c 20 69 73 20 6e 6f 74 20 6f 70 65  e WAL is not ope
20c60 6e 20 28 69 2e 65 2e 20 50 61 67 65 72 2e 70 57  n (i.e. Pager.pW
20c70 61 6c 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20  al==0), or.  ** 
20c80 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
20c90 73 69 7a 65 20 69 73 20 6e 6f 74 20 61 76 61 69  size is not avai
20ca0 6c 61 62 6c 65 2e 20 54 68 65 20 64 61 74 61 62  lable. The datab
20cb0 61 73 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a  ase size is not.
20cc0 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66    ** available f
20cd0 72 6f 6d 20 74 68 65 20 57 41 4c 20 73 75 62 2d  rom the WAL sub-
20ce0 73 79 73 74 65 6d 20 69 66 20 74 68 65 20 6c 6f  system if the lo
20cf0 67 20 66 69 6c 65 20 69 73 20 65 6d 70 74 79 20  g file is empty 
20d00 6f 72 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73  or.  ** contains
20d10 20 6e 6f 20 76 61 6c 69 64 20 63 6f 6d 6d 69 74   no valid commit
20d20 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ted transactions
20d30 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
20d40 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
20d50 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20  =PAGER_OPEN );. 
20d60 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
20d70 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c  >eLock>=SHARED_L
20d80 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
20d90 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
20da0 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fd) );.  assert(
20db0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
20dc0 65 3d 3d 30 20 29 3b 0a 20 20 6e 50 61 67 65 20  e==0 );.  nPage 
20dd0 3d 20 73 71 6c 69 74 65 33 57 61 6c 44 62 73 69  = sqlite3WalDbsi
20de0 7a 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29  ze(pPager->pWal)
20df0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e  ;..  /* If the n
20e00 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
20e10 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
20e20 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  s not available 
20e30 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 57 41  from the.  ** WA
20e40 4c 20 73 75 62 2d 73 79 73 74 65 6d 2c 20 64 65  L sub-system, de
20e50 74 65 72 6d 69 6e 65 20 74 68 65 20 70 61 67 65  termine the page
20e60 20 63 6f 75 6e 74 20 62 61 73 65 64 20 6f 6e 20   count based on 
20e70 74 68 65 20 73 69 7a 65 20 6f 66 0a 20 20 2a 2a  the size of.  **
20e80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
20e90 6c 65 2e 20 20 49 66 20 74 68 65 20 73 69 7a 65  le.  If the size
20ea0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
20eb0 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 6e 0a   file is not an.
20ec0 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 6d 75 6c    ** integer mul
20ed0 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67  tiple of the pag
20ee0 65 2d 73 69 7a 65 2c 20 72 6f 75 6e 64 20 75 70  e-size, round up
20ef0 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a   the result..  *
20f00 2f 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30  /.  if( nPage==0
20f10 20 26 26 20 41 4c 57 41 59 53 28 69 73 4f 70 65   && ALWAYS(isOpe
20f20 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 29 20 29  n(pPager->fd)) )
20f30 7b 0a 20 20 20 20 69 36 34 20 6e 20 3d 20 30 3b  {.    i64 n = 0;
20f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f50 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64      /* Size of d
20f60 62 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20  b file in bytes 
20f70 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  */.    int rc = 
20f80 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
20f90 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e  e(pPager->fd, &n
20fa0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
20fb0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20fc0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
20fd0 20 7d 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 28   }.    nPage = (
20fe0 50 67 6e 6f 29 28 28 6e 2b 70 50 61 67 65 72 2d  Pgno)((n+pPager-
20ff0 3e 70 61 67 65 53 69 7a 65 2d 31 29 20 2f 20 70  >pageSize-1) / p
21000 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
21010 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
21020 68 65 20 63 75 72 72 65 6e 74 20 6e 75 6d 62 65  he current numbe
21030 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
21040 65 20 66 69 6c 65 20 69 73 20 67 72 65 61 74 65  e file is greate
21050 72 20 74 68 61 6e 20 74 68 65 0a 20 20 2a 2a 20  r than the.  ** 
21060 63 6f 6e 66 69 67 75 72 65 64 20 6d 61 78 69 6d  configured maxim
21070 75 6d 20 70 61 67 65 72 20 6e 75 6d 62 65 72 2c  um pager number,
21080 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 61 6c   increase the al
21090 6c 6f 77 65 64 20 6c 69 6d 69 74 20 73 6f 0a 20  lowed limit so. 
210a0 20 2a 2a 20 74 68 61 74 20 74 68 65 20 66 69 6c   ** that the fil
210b0 65 20 63 61 6e 20 62 65 20 72 65 61 64 2e 0a 20  e can be read.. 
210c0 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65 3e   */.  if( nPage>
210d0 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29  pPager->mxPgno )
210e0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78  {.    pPager->mx
210f0 50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e 50 61  Pgno = (Pgno)nPa
21100 67 65 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6e 50 61  ge;.  }..  *pnPa
21110 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65  ge = nPage;.  re
21120 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
21130 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
21140 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a  E_OMIT_WAL./*.**
21150 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 2a 2d   Check if the *-
21160 77 61 6c 20 66 69 6c 65 20 74 68 61 74 20 63 6f  wal file that co
21170 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65  rresponds to the
21180 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64   database opened
21190 20 62 79 20 70 50 61 67 65 72 0a 2a 2a 20 65 78   by pPager.** ex
211a0 69 73 74 73 20 69 66 20 74 68 65 20 64 61 74 61  ists if the data
211b0 62 61 73 65 20 69 73 20 6e 6f 74 20 65 6d 70 79  base is not empy
211c0 2c 20 6f 72 20 76 65 72 69 66 79 20 74 68 61 74  , or verify that
211d0 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20   the *-wal file 
211e0 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 69 73  does.** not exis
211f0 74 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20 69  t (by deleting i
21200 74 29 20 69 66 20 74 68 65 20 64 61 74 61 62 61  t) if the databa
21210 73 65 20 66 69 6c 65 20 69 73 20 65 6d 70 74 79  se file is empty
21220 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64  ..**.** If the d
21230 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 65  atabase is not e
21240 6d 70 74 79 20 61 6e 64 20 74 68 65 20 2a 2d 77  mpty and the *-w
21250 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  al file exists, 
21260 6f 70 65 6e 20 74 68 65 20 70 61 67 65 72 0a 2a  open the pager.*
21270 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 20  * in WAL mode.  
21280 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
21290 69 73 20 65 6d 70 74 79 20 6f 72 20 69 66 20 6e  is empty or if n
212a0 6f 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78 69  o *-wal file exi
212b0 73 74 73 20 61 6e 64 0a 2a 2a 20 69 66 20 6e 6f  sts and.** if no
212c0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6d   error occurs, m
212d0 61 6b 65 20 73 75 72 65 20 50 61 67 65 72 2e 6a  ake sure Pager.j
212e0 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 20 6e 6f  ournalMode is no
212f0 74 20 73 65 74 20 74 6f 0a 2a 2a 20 50 41 47 45  t set to.** PAGE
21300 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
21310 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  L..**.** Return 
21320 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 61 6e 20  SQLITE_OK or an 
21330 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  error code..**.*
21340 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  * The caller mus
21350 74 20 68 6f 6c 64 20 61 20 53 48 41 52 45 44 20  t hold a SHARED 
21360 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
21370 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 61 6c  base file to cal
21380 6c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  l this.** functi
21390 6f 6e 2e 20 42 65 63 61 75 73 65 20 61 6e 20 45  on. Because an E
213a0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
213b0 20 74 68 65 20 64 62 20 66 69 6c 65 20 69 73 20   the db file is 
213c0 72 65 71 75 69 72 65 64 20 74 6f 20 64 65 6c 65  required to dele
213d0 74 65 20 0a 2a 2a 20 61 20 57 41 4c 20 6f 6e 20  te .** a WAL on 
213e0 61 20 6e 6f 6e 65 2d 65 6d 70 74 79 20 64 61 74  a none-empty dat
213f0 61 62 61 73 65 2c 20 74 68 69 73 20 65 6e 73 75  abase, this ensu
21400 72 65 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20  res there is no 
21410 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 0a  race condition .
21420 2a 2a 20 62 65 74 77 65 65 6e 20 74 68 65 20 78  ** between the x
21430 41 63 63 65 73 73 28 29 20 62 65 6c 6f 77 20 61  Access() below a
21440 6e 64 20 61 6e 20 78 44 65 6c 65 74 65 28 29 20  nd an xDelete() 
21450 62 65 69 6e 67 20 65 78 65 63 75 74 65 64 20 62  being executed b
21460 79 20 73 6f 6d 65 20 0a 2a 2a 20 6f 74 68 65 72  y some .** other
21470 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
21480 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
21490 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74  OpenWalIfPresent
214a0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
214b0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
214c0 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
214d0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
214e0 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20  =PAGER_OPEN );. 
214f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
21500 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c  >eLock>=SHARED_L
21510 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 21 70  OCK );..  if( !p
21520 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
21530 29 7b 0a 20 20 20 20 69 6e 74 20 69 73 57 61 6c  ){.    int isWal
21540 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21550 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
21560 57 41 4c 20 66 69 6c 65 20 65 78 69 73 74 73 20  WAL file exists 
21570 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
21580 74 65 33 4f 73 41 63 63 65 73 73 28 0a 20 20 20  te3OsAccess(.   
21590 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 56 66       pPager->pVf
215a0 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c  s, pPager->zWal,
215b0 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
215c0 58 49 53 54 53 2c 20 26 69 73 57 61 6c 0a 20 20  XISTS, &isWal.  
215d0 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d    );.    if( rc=
215e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
215f0 20 20 20 20 69 66 28 20 69 73 57 61 6c 20 29 7b      if( isWal ){
21600 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 6e 50  .        Pgno nP
21610 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
21620 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
21630 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
21640 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ile */..        
21650 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  rc = pagerPageco
21660 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61  unt(pPager, &nPa
21670 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
21680 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
21690 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 50 61  .        if( nPa
216a0 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ge==0 ){.       
216b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
216c0 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
216d0 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57  pVfs, pPager->zW
216e0 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  al, 0);.        
216f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
21700 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74   testcase( sqlit
21710 65 33 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e  e3PcachePagecoun
21720 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
21730 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  e)==0 );.       
21740 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
21750 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 50 61 67  agerOpenWal(pPag
21760 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  er, 0);.        
21770 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
21780 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
21790 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
217a0 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b 0a  RNALMODE_WAL ){.
217b0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
217c0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41  journalMode = PA
217d0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
217e0 44 45 4c 45 54 45 3b 0a 20 20 20 20 20 20 7d 0a  DELETE;.      }.
217f0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
21800 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn rc;.}.#endif.
21810 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20  ./*.** Playback 
21820 73 61 76 65 70 6f 69 6e 74 20 70 53 61 76 65 70  savepoint pSavep
21830 6f 69 6e 74 2e 20 4f 72 2c 20 69 66 20 70 53 61  oint. Or, if pSa
21840 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20 74  vepoint==NULL, t
21850 68 65 6e 20 70 6c 61 79 62 61 63 6b 0a 2a 2a 20  hen playback.** 
21860 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65  the entire maste
21870 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
21880 54 68 65 20 63 61 73 65 20 70 53 61 76 65 70 6f  The case pSavepo
21890 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75 72 73  int==NULL occurs
218a0 20 77 68 65 6e 20 0a 2a 2a 20 61 20 52 4f 4c 4c   when .** a ROLL
218b0 42 41 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e 64 20  BACK TO command 
218c0 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 61 20  is invoked on a 
218d0 53 41 56 45 50 4f 49 4e 54 20 74 68 61 74 20 69  SAVEPOINT that i
218e0 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
218f0 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a  .** savepoint..*
21900 2a 0a 2a 2a 20 57 68 65 6e 20 70 53 61 76 65 70  *.** When pSavep
21910 6f 69 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  oint is not NULL
21920 20 28 6d 65 61 6e 69 6e 67 20 61 20 6e 6f 6e 2d   (meaning a non-
21930 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65  transaction save
21940 70 6f 69 6e 74 20 69 73 20 0a 2a 2a 20 62 65 69  point is .** bei
21950 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2c  ng rolled back),
21960 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61   then the rollba
21970 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 75  ck consists of u
21980 70 20 74 6f 20 74 68 72 65 65 20 73 74 61 67 65  p to three stage
21990 73 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d 65 64 20  s,.** performed 
219a0 69 6e 20 74 68 65 20 6f 72 64 65 72 20 73 70 65  in the order spe
219b0 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20  cified:.**.**   
219c0 2a 20 50 61 67 65 73 20 61 72 65 20 70 6c 61 79  * Pages are play
219d0 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  ed back from the
219e0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74   main journal st
219f0 61 72 74 69 6e 67 20 61 74 20 62 79 74 65 0a 2a  arting at byte.*
21a00 2a 20 20 20 20 20 6f 66 66 73 65 74 20 50 61 67  *     offset Pag
21a10 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66  erSavepoint.iOff
21a20 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69  set and continui
21a30 6e 67 20 74 6f 20 0a 2a 2a 20 20 20 20 20 50 61  ng to .**     Pa
21a40 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64  gerSavepoint.iHd
21a50 72 4f 66 66 73 65 74 2c 20 6f 72 20 74 6f 20 74  rOffset, or to t
21a60 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61  he end of the ma
21a70 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  in journal.**   
21a80 20 20 66 69 6c 65 20 69 66 20 50 61 67 65 72 53    file if PagerS
21a90 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
21aa0 73 65 74 20 69 73 20 7a 65 72 6f 2e 0a 2a 2a 0a  set is zero..**.
21ab0 2a 2a 20 20 20 2a 20 49 66 20 50 61 67 65 72 53  **   * If PagerS
21ac0 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
21ad0 73 65 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c  set is not zero,
21ae0 20 74 68 65 6e 20 70 61 67 65 73 20 61 72 65 20   then pages are 
21af0 70 6c 61 79 65 64 0a 2a 2a 20 20 20 20 20 62 61  played.**     ba
21b00 63 6b 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d  ck starting from
21b10 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
21b20 64 65 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  der immediately 
21b30 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 20 20  following .**   
21b40 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
21b50 2e 69 48 64 72 4f 66 66 73 65 74 20 74 6f 20 74  .iHdrOffset to t
21b60 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61  he end of the ma
21b70 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  in journal file.
21b80 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73  .**.**   * Pages
21b90 20 61 72 65 20 74 68 65 6e 20 70 6c 61 79 65 64   are then played
21ba0 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 73   back from the s
21bb0 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ub-journal file,
21bc0 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 20 20 20   starting.**    
21bd0 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72 53   with the PagerS
21be0 61 76 65 70 6f 69 6e 74 2e 69 53 75 62 52 65 63  avepoint.iSubRec
21bf0 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
21c00 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a  to the end of.**
21c10 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c       the journal
21c20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 72   file..**.** Thr
21c30 6f 75 67 68 6f 75 74 20 74 68 65 20 72 6f 6c 6c  oughout the roll
21c40 62 61 63 6b 20 70 72 6f 63 65 73 73 2c 20 65 61  back process, ea
21c50 63 68 20 74 69 6d 65 20 61 20 70 61 67 65 20 69  ch time a page i
21c60 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74  s rolled back, t
21c70 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  he.** correspond
21c80 69 6e 67 20 62 69 74 20 69 73 20 73 65 74 20 69  ing bit is set i
21c90 6e 20 61 20 62 69 74 76 65 63 20 73 74 72 75 63  n a bitvec struc
21ca0 74 75 72 65 20 28 76 61 72 69 61 62 6c 65 20 70  ture (variable p
21cb0 44 6f 6e 65 20 69 6e 20 74 68 65 0a 2a 2a 20 69  Done in the.** i
21cc0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 62 65  mplementation be
21cd0 6c 6f 77 29 2e 20 54 68 69 73 20 69 73 20 75 73  low). This is us
21ce0 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  ed to ensure tha
21cf0 74 20 61 20 70 61 67 65 20 69 73 20 6f 6e 6c 79  t a page is only
21d00 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  .** rolled back 
21d10 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69  the first time i
21d20 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  t is encountered
21d30 20 69 6e 20 65 69 74 68 65 72 20 6a 6f 75 72 6e   in either journ
21d40 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53 61  al..**.** If pSa
21d50 76 65 70 6f 69 6e 74 20 69 73 20 4e 55 4c 4c 2c  vepoint is NULL,
21d60 20 74 68 65 6e 20 70 61 67 65 73 20 61 72 65 20   then pages are 
21d70 6f 6e 6c 79 20 70 6c 61 79 65 64 20 62 61 63 6b  only played back
21d80 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 0a 2a   from the main.*
21d90 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  * journal file. 
21da0 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  There is no need
21db0 20 66 6f 72 20 61 20 62 69 74 76 65 63 20 69 6e   for a bitvec in
21dc0 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
21dd0 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65  * In either case
21de0 2c 20 62 65 66 6f 72 65 20 70 6c 61 79 62 61 63  , before playbac
21df0 6b 20 63 6f 6d 6d 65 6e 63 65 73 20 74 68 65 20  k commences the 
21e00 50 61 67 65 72 2e 64 62 53 69 7a 65 20 76 61 72  Pager.dbSize var
21e10 69 61 62 6c 65 0a 2a 2a 20 69 73 20 72 65 73 65  iable.** is rese
21e20 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 74  t to the value t
21e30 68 61 74 20 69 74 20 68 65 6c 64 20 61 74 20 74  hat it held at t
21e40 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
21e50 73 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 28 6f  savepoint .** (o
21e60 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20  r transaction). 
21e70 4e 6f 20 70 61 67 65 20 77 69 74 68 20 61 20 70  No page with a p
21e80 61 67 65 2d 6e 75 6d 62 65 72 20 67 72 65 61 74  age-number great
21e90 65 72 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c  er than this val
21ea0 75 65 0a 2a 2a 20 69 73 20 70 6c 61 79 65 64 20  ue.** is played 
21eb0 62 61 63 6b 2e 20 49 66 20 6f 6e 65 20 69 73 20  back. If one is 
21ec0 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74 20 69  encountered it i
21ed0 73 20 73 69 6d 70 6c 79 20 73 6b 69 70 70 65 64  s simply skipped
21ee0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
21ef0 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76  pagerPlaybackSav
21f00 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50  epoint(Pager *pP
21f10 61 67 65 72 2c 20 50 61 67 65 72 53 61 76 65 70  ager, PagerSavep
21f20 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e 74  oint *pSavepoint
21f30 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20  ){.  i64 szJ;   
21f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21f50 20 45 66 66 65 63 74 69 76 65 20 73 69 7a 65 20   Effective size 
21f60 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
21f70 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64  nal */.  i64 iHd
21f80 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  rOff;           
21f90 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66 69 72 73    /* End of firs
21fa0 74 20 73 65 67 6d 65 6e 74 20 6f 66 20 6d 61 69  t segment of mai
21fb0 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64  n-journal record
21fc0 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  s */.  int rc = 
21fd0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
21fe0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
21ff0 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e  /.  Bitvec *pDon
22000 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  e = 0;       /* 
22010 42 69 74 76 65 63 20 74 6f 20 65 6e 73 75 72 65  Bitvec to ensure
22020 20 70 61 67 65 73 20 70 6c 61 79 65 64 20 62 61   pages played ba
22030 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a  ck only once */.
22040 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
22050 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
22060 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65  _ERROR );.  asse
22070 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
22080 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
22090 5f 4c 4f 43 4b 45 44 20 29 3b 0a 0a 20 20 2f 2a  _LOCKED );..  /*
220a0 20 41 6c 6c 6f 63 61 74 65 20 61 20 62 69 74 76   Allocate a bitv
220b0 65 63 20 74 6f 20 75 73 65 20 74 6f 20 73 74 6f  ec to use to sto
220c0 72 65 20 74 68 65 20 73 65 74 20 6f 66 20 70 61  re the set of pa
220d0 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ges rolled back 
220e0 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f  */.  if( pSavepo
220f0 69 6e 74 20 29 7b 0a 20 20 20 20 70 44 6f 6e 65  int ){.    pDone
22100 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
22110 43 72 65 61 74 65 28 70 53 61 76 65 70 6f 69 6e  Create(pSavepoin
22120 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20 20 20 69  t->nOrig);.    i
22130 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a 20 20 20  f( !pDone ){.   
22140 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
22150 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
22160 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74   }.  }..  /* Set
22170 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
22180 7a 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 76  ze back to the v
22190 61 6c 75 65 20 69 74 20 77 61 73 20 62 65 66 6f  alue it was befo
221a0 72 65 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  re the savepoint
221b0 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 76   .  ** being rev
221c0 65 72 74 65 64 20 77 61 73 20 6f 70 65 6e 65 64  erted was opened
221d0 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
221e0 3e 64 62 53 69 7a 65 20 3d 20 70 53 61 76 65 70  >dbSize = pSavep
221f0 6f 69 6e 74 20 3f 20 70 53 61 76 65 70 6f 69 6e  oint ? pSavepoin
22200 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50 61 67 65  t->nOrig : pPage
22210 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20  r->dbOrigSize;. 
22220 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
22230 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65  ountDone = pPage
22240 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20  r->tempFile;..  
22250 69 66 28 20 21 70 53 61 76 65 70 6f 69 6e 74 20  if( !pSavepoint 
22260 26 26 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  && pagerUseWal(p
22270 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65  Pager) ){.    re
22280 74 75 72 6e 20 70 61 67 65 72 52 6f 6c 6c 62 61  turn pagerRollba
22290 63 6b 57 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  ckWal(pPager);. 
222a0 20 7d 0a 0a 20 20 2f 2a 20 55 73 65 20 70 50 61   }..  /* Use pPa
222b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
222c0 61 73 20 74 68 65 20 65 66 66 65 63 74 69 76 65  as the effective
222d0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69   size of the mai
222e0 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  n rollback.  ** 
222f0 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 61 63  journal.  The ac
22300 74 75 61 6c 20 66 69 6c 65 20 6d 69 67 68 74 20  tual file might 
22310 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  be larger than t
22320 68 69 73 20 69 6e 0a 20 20 2a 2a 20 50 41 47 45  his in.  ** PAGE
22330 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  R_JOURNALMODE_TR
22340 55 4e 43 41 54 45 20 6f 72 20 50 41 47 45 52 5f  UNCATE or PAGER_
22350 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
22360 49 53 54 2e 20 20 42 75 74 20 61 6e 79 74 68 69  IST.  But anythi
22370 6e 67 0a 20 20 2a 2a 20 70 61 73 74 20 70 50 61  ng.  ** past pPa
22380 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
22390 69 73 20 6f 66 66 2d 6c 69 6d 69 74 73 20 74 6f  is off-limits to
223a0 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20   us..  */.  szJ 
223b0 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
223c0 6c 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20  lOff;.  assert( 
223d0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
223e0 65 72 29 3d 3d 30 20 7c 7c 20 73 7a 4a 3d 3d 30  er)==0 || szJ==0
223f0 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20   );..  /* Begin 
22400 62 79 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  by rolling back 
22410 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65  records from the
22420 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74   main journal st
22430 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 50  arting at.  ** P
22440 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f  agerSavepoint.iO
22450 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e  ffset and contin
22460 75 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 78 74  uing to the next
22470 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
22480 0a 20 20 2a 2a 20 54 68 65 72 65 20 6d 69 67 68  .  ** There migh
22490 74 20 62 65 20 72 65 63 6f 72 64 73 20 69 6e 20  t be records in 
224a0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
224b0 20 74 68 61 74 20 68 61 76 65 20 61 20 70 61 67   that have a pag
224c0 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 67 72  e number.  ** gr
224d0 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63  eater than the c
224e0 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20  urrent database 
224f0 73 69 7a 65 20 28 70 50 61 67 65 72 2d 3e 64 62  size (pPager->db
22500 53 69 7a 65 29 20 62 75 74 20 74 68 6f 73 65 0a  Size) but those.
22510 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69    ** will be ski
22520 70 70 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  pped automatical
22530 6c 79 2e 20 20 50 61 67 65 73 20 61 72 65 20 61  ly.  Pages are a
22540 64 64 65 64 20 74 6f 20 70 44 6f 6e 65 20 61 73  dded to pDone as
22550 20 74 68 65 79 0a 20 20 2a 2a 20 61 72 65 20 70   they.  ** are p
22560 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f  layed back..  */
22570 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e  .  if( pSavepoin
22580 74 20 26 26 20 21 70 61 67 65 72 55 73 65 57 61  t && !pagerUseWa
22590 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
225a0 20 69 48 64 72 4f 66 66 20 3d 20 70 53 61 76 65   iHdrOff = pSave
225b0 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65  point->iHdrOffse
225c0 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  t ? pSavepoint->
225d0 69 48 64 72 4f 66 66 73 65 74 20 3a 20 73 7a 4a  iHdrOffset : szJ
225e0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
225f0 75 72 6e 61 6c 4f 66 66 20 3d 20 70 53 61 76 65  urnalOff = pSave
22600 70 6f 69 6e 74 2d 3e 69 4f 66 66 73 65 74 3b 0a  point->iOffset;.
22610 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53      while( rc==S
22620 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
22630 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69  er->journalOff<i
22640 48 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 20 20  HdrOff ){.      
22650 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
22660 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
22670 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f  ger, &pPager->jo
22680 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c  urnalOff, pDone,
22690 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20   1, 1);.    }.  
226a0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
226b0 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d  LITE_DONE );.  }
226c0 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
226d0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
226e0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 74  ;.  }..  /* Cont
226f0 69 6e 75 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63  inue rolling bac
22700 6b 20 72 65 63 6f 72 64 73 20 6f 75 74 20 6f 66  k records out of
22710 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
22720 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20  l starting at.  
22730 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75  ** the first jou
22740 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 65 6e  rnal header seen
22750 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
22760 75 6e 74 69 6c 20 74 68 65 20 65 66 66 65 63 74  until the effect
22770 69 76 65 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20  ive end.  ** of 
22780 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
22790 20 66 69 6c 65 2e 20 20 43 6f 6e 74 69 6e 75 65   file.  Continue
227a0 20 74 6f 20 73 6b 69 70 20 6f 75 74 2d 6f 66 2d   to skip out-of-
227b0 72 61 6e 67 65 20 70 61 67 65 73 20 61 6e 64 0a  range pages and.
227c0 20 20 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61 64    ** continue ad
227d0 64 69 6e 67 20 70 61 67 65 73 20 72 6f 6c 6c 65  ding pages rolle
227e0 64 20 62 61 63 6b 20 74 6f 20 70 44 6f 6e 65 2e  d back to pDone.
227f0 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 72  .  */.  while( r
22800 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
22810 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
22820 66 66 3c 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33  ff<szJ ){.    u3
22830 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  2 ii;           
22840 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
22850 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 4a 52 65   */.    u32 nJRe
22860 63 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75  c = 0;     /* Nu
22870 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20  mber of Journal 
22880 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75  Records */.    u
22890 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63  32 dummy;.    rc
228a0 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   = readJournalHd
228b0 72 28 70 50 61 67 65 72 2c 20 30 2c 20 73 7a 4a  r(pPager, 0, szJ
228c0 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79  , &nJRec, &dummy
228d0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
228e0 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
228f0 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ;..    /*.    **
22900 20 54 68 65 20 22 70 50 61 67 65 72 2d 3e 6a 6f   The "pPager->jo
22910 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
22920 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
22930 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
22940 4f 66 66 22 0a 20 20 20 20 2a 2a 20 74 65 73 74  Off".    ** test
22950 20 69 73 20 72 65 6c 61 74 65 64 20 74 6f 20 74   is related to t
22960 69 63 6b 65 74 20 23 32 35 36 35 2e 20 20 53 65  icket #2565.  Se
22970 65 20 74 68 65 20 64 69 73 63 75 73 73 69 6f 6e  e the discussion
22980 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70   in the.    ** p
22990 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20  ager_playback() 
229a0 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 64 64  function for add
229b0 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
229c0 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
229d0 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 0a 20 20  if( nJRec==0 .  
229e0 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f     && pPager->jo
229f0 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
22a00 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
22a10 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
22a20 4f 66 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Off.    ){.     
22a30 20 6e 4a 52 65 63 20 3d 20 28 75 33 32 29 28 28   nJRec = (u32)((
22a40 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ - pPager->jo
22a50 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e 41  urnalOff)/JOURNA
22a60 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
22a70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
22a80 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  ii=0; rc==SQLITE
22a90 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65 63 20  _OK && ii<nJRec 
22aa0 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
22ab0 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29  alOff<szJ; ii++)
22ac0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
22ad0 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
22ae0 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50  page(pPager, &pP
22af0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
22b00 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a  , pDone, 1, 1);.
22b10 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
22b20 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
22b30 45 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  E );.  }.  asser
22b40 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
22b50 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
22b60 6e 61 6c 4f 66 66 3e 3d 73 7a 4a 20 29 3b 0a 0a  nalOff>=szJ );..
22b70 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 20 72    /* Finally,  r
22b80 6f 6c 6c 62 61 63 6b 20 70 61 67 65 73 20 66 72  ollback pages fr
22b90 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
22ba0 61 6c 2e 20 20 50 61 67 65 20 74 68 61 74 20 77  al.  Page that w
22bb0 65 72 65 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75  ere.  ** previou
22bc0 73 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  sly rolled back 
22bd0 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  out of the main 
22be0 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61 72 65  journal (and are
22bf0 20 68 65 6e 63 65 20 69 6e 20 70 44 6f 6e 65 29   hence in pDone)
22c00 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b  .  ** will be sk
22c10 69 70 70 65 64 2e 20 20 4f 75 74 2d 6f 66 2d 72  ipped.  Out-of-r
22c20 61 6e 67 65 20 70 61 67 65 73 20 61 72 65 20 61  ange pages are a
22c30 6c 73 6f 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a  lso skipped..  *
22c40 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69  /.  if( pSavepoi
22c50 6e 74 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69  nt ){.    u32 ii
22c60 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
22c70 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
22c80 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
22c90 20 28 69 36 34 29 70 53 61 76 65 70 6f 69 6e 74   (i64)pSavepoint
22ca0 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b 70 50 61  ->iSubRec*(4+pPa
22cb0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
22cc0 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73  .    if( pagerUs
22cd0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
22ce0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
22cf0 65 33 57 61 6c 53 61 76 65 70 6f 69 6e 74 55 6e  e3WalSavepointUn
22d00 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  do(pPager->pWal,
22d10 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 61 57 61   pSavepoint->aWa
22d20 6c 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  lData);.    }.  
22d30 20 20 66 6f 72 28 69 69 3d 70 53 61 76 65 70 6f    for(ii=pSavepo
22d40 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20 72 63  int->iSubRec; rc
22d50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
22d60 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65  i<pPager->nSubRe
22d70 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  c; ii++){.      
22d80 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3d 3d  assert( offset==
22d90 28 69 36 34 29 69 69 2a 28 34 2b 70 50 61 67 65  (i64)ii*(4+pPage
22da0 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 3b 0a  r->pageSize) );.
22db0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
22dc0 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
22dd0 67 65 28 70 50 61 67 65 72 2c 20 26 6f 66 66 73  ge(pPager, &offs
22de0 65 74 2c 20 70 44 6f 6e 65 2c 20 30 2c 20 31 29  et, pDone, 0, 1)
22df0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
22e00 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
22e10 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71  ONE );.  }..  sq
22e20 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
22e30 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20 69 66 28  oy(pDone);.  if(
22e40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
22e50 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
22e60 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
22e70 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
22e80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
22e90 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  e the maximum nu
22ea0 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72  mber of in-memor
22eb0 79 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65  y pages that are
22ec0 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 62 65 66 6f   allowed.** befo
22ed0 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  re attempting to
22ee0 20 72 65 63 79 63 6c 65 20 63 6c 65 61 6e 20 61   recycle clean a
22ef0 6e 64 20 75 6e 75 73 65 64 20 70 61 67 65 73 2e  nd unused pages.
22f00 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
22f10 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a  PagerSetCachesiz
22f20 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
22f30 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
22f40 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74  sqlite3PcacheSet
22f50 43 61 63 68 65 73 69 7a 65 28 70 50 61 67 65 72  Cachesize(pPager
22f60 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50 61 67  ->pPCache, mxPag
22f70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  e);.}../*.** Cha
22f80 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  nge the maximum 
22f90 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d  number of in-mem
22fa0 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61  ory pages that a
22fb0 72 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 62 65  re allowed.** be
22fc0 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20  fore attempting 
22fd0 74 6f 20 73 70 69 6c 6c 20 70 61 67 65 73 20 74  to spill pages t
22fe0 6f 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e  o journal..*/.in
22ff0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  t sqlite3PagerSe
23000 74 53 70 69 6c 6c 73 69 7a 65 28 50 61 67 65 72  tSpillsize(Pager
23010 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78   *pPager, int mx
23020 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20  Page){.  return 
23030 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74  sqlite3PcacheSet
23040 53 70 69 6c 6c 73 69 7a 65 28 70 50 61 67 65 72  Spillsize(pPager
23050 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50 61 67  ->pPCache, mxPag
23060 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76  e);.}../*.** Inv
23070 6f 6b 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  oke SQLITE_FCNTL
23080 5f 4d 4d 41 50 5f 53 49 5a 45 20 62 61 73 65 64  _MMAP_SIZE based
23090 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
230a0 76 61 6c 75 65 20 6f 66 20 73 7a 4d 6d 61 70 2e  value of szMmap.
230b0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
230c0 70 61 67 65 72 46 69 78 4d 61 70 6c 69 6d 69 74  pagerFixMaplimit
230d0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
230e0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
230f0 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 73 71  MMAP_SIZE>0.  sq
23100 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 3d  lite3_file *fd =
23110 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a 20 20 69   pPager->fd;.  i
23120 66 28 20 69 73 4f 70 65 6e 28 66 64 29 20 26 26  f( isOpen(fd) &&
23130 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69   fd->pMethods->i
23140 56 65 72 73 69 6f 6e 3e 3d 33 20 29 7b 0a 20 20  Version>=3 ){.  
23150 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
23160 73 7a 3b 0a 20 20 20 20 73 7a 20 3d 20 70 50 61  sz;.    sz = pPa
23170 67 65 72 2d 3e 73 7a 4d 6d 61 70 3b 0a 20 20 20  ger->szMmap;.   
23180 20 70 50 61 67 65 72 2d 3e 62 55 73 65 46 65 74   pPager->bUseFet
23190 63 68 20 3d 20 28 73 7a 3e 30 29 3b 0a 20 20 20  ch = (sz>0);.   
231a0 20 73 65 74 47 65 74 74 65 72 4d 65 74 68 6f 64   setGetterMethod
231b0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 73 71  (pPager);.    sq
231c0 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
231d0 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66  olHint(pPager->f
231e0 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  d, SQLITE_FCNTL_
231f0 4d 4d 41 50 5f 53 49 5a 45 2c 20 26 73 7a 29 3b  MMAP_SIZE, &sz);
23200 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
23210 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
23220 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20  maximum size of 
23230 61 6e 79 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69  any memory mappi
23240 6e 67 20 6d 61 64 65 20 6f 66 20 74 68 65 20 64  ng made of the d
23250 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f  atabase file..*/
23260 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
23270 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 50  erSetMmapLimit(P
23280 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 73 71  ager *pPager, sq
23290 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d  lite3_int64 szMm
232a0 61 70 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 73  ap){.  pPager->s
232b0 7a 4d 6d 61 70 20 3d 20 73 7a 4d 6d 61 70 3b 0a  zMmap = szMmap;.
232c0 20 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69 6d    pagerFixMaplim
232d0 69 74 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f  it(pPager);.}../
232e0 2a 0a 2a 2a 20 46 72 65 65 20 61 73 20 6d 75 63  *.** Free as muc
232f0 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73  h memory as poss
23300 69 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 70 61  ible from the pa
23310 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ger..*/.void sql
23320 69 74 65 33 50 61 67 65 72 53 68 72 69 6e 6b 28  ite3PagerShrink(
23330 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
23340 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53    sqlite3PcacheS
23350 68 72 69 6e 6b 28 70 50 61 67 65 72 2d 3e 70 50  hrink(pPager->pP
23360 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Cache);.}../*.**
23370 20 41 64 6a 75 73 74 20 73 65 74 74 69 6e 67 73   Adjust settings
23380 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 74 6f   of the pager to
23390 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64   those specified
233a0 20 69 6e 20 74 68 65 20 70 67 46 6c 61 67 73 20   in the pgFlags 
233b0 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a  parameter..**.**
233c0 20 54 68 65 20 22 6c 65 76 65 6c 22 20 69 6e 20   The "level" in 
233d0 70 67 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f  pgFlags & PAGER_
233e0 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b  SYNCHRONOUS_MASK
233f0 20 73 65 74 73 20 74 68 65 20 72 6f 62 75 73 74   sets the robust
23400 6e 65 73 73 0a 2a 2a 20 6f 66 20 74 68 65 20 64  ness.** of the d
23410 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67  atabase to damag
23420 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73  e due to OS cras
23430 68 65 73 20 6f 72 20 70 6f 77 65 72 20 66 61 69  hes or power fai
23440 6c 75 72 65 73 20 62 79 0a 2a 2a 20 63 68 61 6e  lures by.** chan
23450 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20  ging the number 
23460 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e  of syncs()s when
23470 20 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f 75   writing the jou
23480 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65 72 65 20  rnals..** There 
23490 61 72 65 20 66 6f 75 72 20 6c 65 76 65 6c 73 3a  are four levels:
234a0 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20  .**.**    OFF   
234b0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e      sqlite3OsSyn
234c0 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c  c() is never cal
234d0 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68  led.  This is th
234e0 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20  e default.**    
234f0 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 65            for te
23500 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e  mporary and tran
23510 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a  sient files..**.
23520 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20  **    NORMAL    
23530 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  The journal is s
23540 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72  ynced once befor
23550 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f  e writes begin o
23560 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
23570 20 20 20 20 20 20 64 61 74 61 62 61 73 65 2e 20        database. 
23580 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c   This is normall
23590 79 20 61 64 65 71 75 61 74 65 20 70 72 6f 74 65  y adequate prote
235a0 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20  ction, but.**   
235b0 20 20 20 20 20 20 20 20 20 20 20 69 74 20 69 73             it is
235c0 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70   theoretically p
235d0 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20  ossible, though 
235e0 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a  very unlikely,.*
235f0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  *              t
23600 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e  hat an inopertun
23610 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  e power failure 
23620 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20  could leave the 
23630 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
23640 20 20 20 20 20 20 20 20 69 6e 20 61 20 73 74 61          in a sta
23650 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63  te which would c
23660 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74  ause damage to t
23670 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  he database.**  
23680 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 6e              when
23690 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61   it is rolled ba
236a0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c  ck..**.**    FUL
236b0 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  L      The journ
236c0 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77 69  al is synced twi
236d0 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73  ce before writes
236e0 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a   begin on the.**
236f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
23700 74 61 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d  tabase (with som
23710 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  e additional inf
23720 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e  ormation - the n
23730 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20  Rec field.**    
23740 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65            of the
23750 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
23760 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20  - being written 
23770 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 74  in between the t
23780 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  wo.**           
23790 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77     syncs).  If w
237a0 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 77 72  e assume that wr
237b0 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20  iting a.**      
237c0 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64          single d
237d0 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74  isk sector is at
237e0 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20  omic, then this 
237f0 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a  mode provides.**
23800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
23810 73 75 72 61 6e 63 65 20 74 68 61 74 20 74 68 65  surance that the
23820 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f   journal will no
23830 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 74  t be corrupted t
23840 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  o the.**        
23850 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63        point of c
23860 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f  ausing damage to
23870 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64 75   the database du
23880 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  ring rollback..*
23890 2a 0a 2a 2a 20 20 20 20 45 58 54 52 41 20 20 20  *.**    EXTRA   
238a0 20 20 54 68 69 73 20 69 73 20 6c 69 6b 65 20 46    This is like F
238b0 55 4c 4c 20 65 78 63 65 70 74 20 74 68 61 74 20  ULL except that 
238c0 69 73 20 61 6c 73 6f 20 73 79 6e 63 73 20 74 68  is also syncs th
238d0 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 20  e directory.**  
238e0 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74              that
238f0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 72 6f   contains the ro
23900 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
23910 66 74 65 72 20 74 68 65 20 72 6f 6c 6c 62 61 63  fter the rollbac
23920 6b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  k.**            
23930 20 20 6a 6f 75 72 6e 61 6c 20 69 73 20 75 6e 6c    journal is unl
23940 69 6e 6b 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  inked..**.** The
23950 20 61 62 6f 76 65 20 69 73 20 66 6f 72 20 61 20   above is for a 
23960 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c  rollback-journal
23970 20 6d 6f 64 65 2e 20 20 46 6f 72 20 57 41 4c 20   mode.  For WAL 
23980 6d 6f 64 65 2c 20 4f 46 46 20 63 6f 6e 74 69 6e  mode, OFF contin
23990 75 65 73 0a 2a 2a 20 74 6f 20 6d 65 61 6e 20 74  ues.** to mean t
239a0 68 61 74 20 6e 6f 20 73 79 6e 63 73 20 65 76 65  hat no syncs eve
239b0 72 20 6f 63 63 75 72 2e 20 20 4e 4f 52 4d 41 4c  r occur.  NORMAL
239c0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
239d0 57 41 4c 20 69 73 20 73 79 6e 63 65 64 0a 2a 2a  WAL is synced.**
239e0 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74   prior to the st
239f0 61 72 74 20 6f 66 20 63 68 65 63 6b 70 6f 69 6e  art of checkpoin
23a00 74 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 64  t and that the d
23a10 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
23a20 73 79 6e 63 65 64 0a 2a 2a 20 61 74 20 74 68 65  synced.** at the
23a30 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 74   conclusion of t
23a40 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 66  he checkpoint if
23a50 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
23a60 65 6e 74 20 6f 66 20 74 68 65 20 57 41 4c 0a 2a  ent of the WAL.*
23a70 2a 20 77 61 73 20 77 72 69 74 74 65 6e 20 62 61  * was written ba
23a80 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ck into the data
23a90 62 61 73 65 2e 20 20 42 75 74 20 6e 6f 20 73 79  base.  But no sy
23aa0 6e 63 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 63  nc operations oc
23ab0 63 75 72 20 66 6f 72 0a 2a 2a 20 61 6e 20 6f 72  cur for.** an or
23ac0 64 69 6e 61 72 79 20 63 6f 6d 6d 69 74 20 69 6e  dinary commit in
23ad0 20 4e 4f 52 4d 41 4c 20 6d 6f 64 65 20 77 69 74   NORMAL mode wit
23ae0 68 20 57 41 4c 2e 20 20 46 55 4c 4c 20 6d 65 61  h WAL.  FULL mea
23af0 6e 73 20 74 68 61 74 20 74 68 65 20 57 41 4c 0a  ns that the WAL.
23b00 2a 2a 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65  ** file is synce
23b10 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61 63 68  d following each
23b20 20 63 6f 6d 6d 69 74 20 6f 70 65 72 61 74 69 6f   commit operatio
23b30 6e 2c 20 69 6e 20 61 64 64 69 74 69 6f 6e 20 74  n, in addition t
23b40 6f 20 74 68 65 0a 2a 2a 20 73 79 6e 63 73 20 61  o the.** syncs a
23b50 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 4e  ssociated with N
23b60 4f 52 4d 41 4c 2e 20 20 54 68 65 72 65 20 69 73  ORMAL.  There is
23b70 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20 62   no difference b
23b80 65 74 77 65 65 6e 20 46 55 4c 4c 0a 2a 2a 20 61  etween FULL.** a
23b90 6e 64 20 45 58 54 52 41 20 66 6f 72 20 57 41 4c  nd EXTRA for WAL
23ba0 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20   mode..**.** Do 
23bb0 6e 6f 74 20 63 6f 6e 66 75 73 65 20 73 79 6e 63  not confuse sync
23bc0 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 77 69 74  hronous=FULL wit
23bd0 68 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  h SQLITE_SYNC_FU
23be0 4c 4c 2e 20 20 54 68 65 0a 2a 2a 20 53 51 4c 49  LL.  The.** SQLI
23bf0 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 20 6d 61 63  TE_SYNC_FULL mac
23c00 72 6f 20 6d 65 61 6e 73 20 74 6f 20 75 73 65 20  ro means to use 
23c10 74 68 65 20 4d 61 63 4f 53 58 2d 73 74 79 6c 65  the MacOSX-style
23c20 20 66 75 6c 6c 2d 66 73 79 6e 63 0a 2a 2a 20 75   full-fsync.** u
23c30 73 69 6e 67 20 66 63 6e 74 6c 28 46 5f 46 55 4c  sing fcntl(F_FUL
23c40 4c 46 53 59 4e 43 29 2e 20 20 53 51 4c 49 54 45  LFSYNC).  SQLITE
23c50 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6d 65 61  _SYNC_NORMAL mea
23c60 6e 73 20 74 6f 20 64 6f 20 61 6e 0a 2a 2a 20 6f  ns to do an.** o
23c70 72 64 69 6e 61 72 79 20 66 73 79 6e 63 28 29 20  rdinary fsync() 
23c80 63 61 6c 6c 2e 20 20 54 68 65 72 65 20 69 73 20  call.  There is 
23c90 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  no difference be
23ca0 74 77 65 65 6e 20 53 51 4c 49 54 45 5f 53 59 4e  tween SQLITE_SYN
23cb0 43 5f 46 55 4c 4c 0a 2a 2a 20 61 6e 64 20 53 51  C_FULL.** and SQ
23cc0 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
23cd0 20 6f 6e 20 70 6c 61 74 66 6f 72 6d 73 20 6f 74   on platforms ot
23ce0 68 65 72 20 74 68 61 6e 20 4d 61 63 4f 53 58 2e  her than MacOSX.
23cf0 20 20 42 75 74 20 74 68 65 0a 2a 2a 20 73 79 6e    But the.** syn
23d00 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 76 65  chronous=FULL ve
23d10 72 73 75 73 20 73 79 6e 63 68 72 6f 6e 6f 75 73  rsus synchronous
23d20 3d 4e 4f 52 4d 41 4c 20 73 65 74 74 69 6e 67 20  =NORMAL setting 
23d30 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65 6e 0a  determines when.
23d40 2a 2a 20 74 68 65 20 78 53 79 6e 63 20 70 72 69  ** the xSync pri
23d50 6d 69 74 69 76 65 20 69 73 20 63 61 6c 6c 65 64  mitive is called
23d60 20 61 6e 64 20 69 73 20 72 65 6c 65 76 61 6e 74   and is relevant
23d70 20 74 6f 20 61 6c 6c 20 70 6c 61 74 66 6f 72 6d   to all platform
23d80 73 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63  s..**.** Numeric
23d90 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74   values associat
23da0 65 64 20 77 69 74 68 20 74 68 65 73 65 20 73 74  ed with these st
23db0 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c  ates are OFF==1,
23dc0 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e   NORMAL=2,.** an
23dd0 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66  d FULL=3..*/.#if
23de0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
23df0 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 76  _PAGER_PRAGMAS.v
23e00 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
23e10 53 65 74 46 6c 61 67 73 28 0a 20 20 50 61 67 65  SetFlags(.  Page
23e20 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
23e30 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 74    /* The pager t
23e40 6f 20 73 65 74 20 73 61 66 65 74 79 20 6c 65 76  o set safety lev
23e50 65 6c 20 66 6f 72 20 2a 2f 0a 20 20 75 6e 73 69  el for */.  unsi
23e60 67 6e 65 64 20 70 67 46 6c 61 67 73 20 20 20 20  gned pgFlags    
23e70 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 66 6c 61    /* Various fla
23e80 67 73 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67  gs */.){.  unsig
23e90 6e 65 64 20 6c 65 76 65 6c 20 3d 20 70 67 46 6c  ned level = pgFl
23ea0 61 67 73 20 26 20 50 41 47 45 52 5f 53 59 4e 43  ags & PAGER_SYNC
23eb0 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b 3b 0a 20 20  HRONOUS_MASK;.  
23ec0 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  if( pPager->temp
23ed0 46 69 6c 65 20 29 7b 0a 20 20 20 20 70 50 61 67  File ){.    pPag
23ee0 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 31 3b 0a  er->noSync = 1;.
23ef0 20 20 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c      pPager->full
23f00 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50  Sync = 0;.    pP
23f10 61 67 65 72 2d 3e 65 78 74 72 61 53 79 6e 63 20  ager->extraSync 
23f20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
23f30 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63    pPager->noSync
23f40 20 3d 20 20 6c 65 76 65 6c 3d 3d 50 41 47 45 52   =  level==PAGER
23f50 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4f 46 46  _SYNCHRONOUS_OFF
23f60 20 3f 31 3a 30 3b 0a 20 20 20 20 70 50 61 67 65   ?1:0;.    pPage
23f70 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 6c 65  r->fullSync = le
23f80 76 65 6c 3e 3d 50 41 47 45 52 5f 53 59 4e 43 48  vel>=PAGER_SYNCH
23f90 52 4f 4e 4f 55 53 5f 46 55 4c 4c 20 3f 31 3a 30  RONOUS_FULL ?1:0
23fa0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78  ;.    pPager->ex
23fb0 74 72 61 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3d  traSync = level=
23fc0 3d 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f  =PAGER_SYNCHRONO
23fd0 55 53 5f 45 58 54 52 41 20 3f 31 3a 30 3b 0a 20  US_EXTRA ?1:0;. 
23fe0 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
23ff0 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 70  >noSync ){.    p
24000 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
24010 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
24020 28 20 70 67 46 6c 61 67 73 20 26 20 50 41 47 45  ( pgFlags & PAGE
24030 52 5f 46 55 4c 4c 46 53 59 4e 43 20 29 7b 0a 20  R_FULLFSYNC ){. 
24040 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46     pPager->syncF
24050 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
24060 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65  NC_FULL;.  }else
24070 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79  {.    pPager->sy
24080 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
24090 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  _SYNC_NORMAL;.  
240a0 7d 0a 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53  }.  pPager->walS
240b0 79 6e 63 46 6c 61 67 73 20 3d 20 28 70 50 61 67  yncFlags = (pPag
240c0 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3c 3c 32  er->syncFlags<<2
240d0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
240e0 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20  >fullSync ){.   
240f0 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63   pPager->walSync
24100 46 6c 61 67 73 20 7c 3d 20 70 50 61 67 65 72 2d  Flags |= pPager-
24110 3e 73 79 6e 63 46 6c 61 67 73 3b 0a 20 20 7d 0a  >syncFlags;.  }.
24120 20 20 69 66 28 20 28 70 67 46 6c 61 67 73 20 26    if( (pgFlags &
24130 20 50 41 47 45 52 5f 43 4b 50 54 5f 46 55 4c 4c   PAGER_CKPT_FULL
24140 46 53 59 4e 43 29 20 26 26 20 21 70 50 61 67 65  FSYNC) && !pPage
24150 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
24160 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63   pPager->walSync
24170 46 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49 54 45  Flags |= (SQLITE
24180 5f 53 59 4e 43 5f 46 55 4c 4c 3c 3c 32 29 3b 0a  _SYNC_FULL<<2);.
24190 20 20 7d 0a 20 20 69 66 28 20 70 67 46 6c 61 67    }.  if( pgFlag
241a0 73 20 26 20 50 41 47 45 52 5f 43 41 43 48 45 53  s & PAGER_CACHES
241b0 50 49 4c 4c 20 29 7b 0a 20 20 20 20 70 50 61 67  PILL ){.    pPag
241c0 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26  er->doNotSpill &
241d0 3d 20 7e 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46  = ~SPILLFLAG_OFF
241e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
241f0 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
24200 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c 41 47 5f 4f  l |= SPILLFLAG_O
24210 46 46 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  FF;.  }.}.#endif
24220 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
24230 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72  owing global var
24240 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65  iable is increme
24250 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20 74 68  nted whenever th
24260 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74 74  e library.** att
24270 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20  empts to open a 
24280 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
24290 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
242a0 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a  n is used for.**
242b0 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61   testing and ana
242c0 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f  lysis only.  .*/
242d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
242e0 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
242f0 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d  opentemp_count =
24300 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   0;.#endif../*.*
24310 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  * Open a tempora
24320 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57  ry file..**.** W
24330 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65  rite the file de
24340 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 70  scriptor into *p
24350 46 69 6c 65 2e 20 52 65 74 75 72 6e 20 53 51 4c  File. Return SQL
24360 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
24370 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74  s .** or some ot
24380 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69  her error code i
24390 66 20 77 65 20 66 61 69 6c 2e 20 54 68 65 20 4f  f we fail. The O
243a0 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63  S will automatic
243b0 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65 74 65 20  ally .** delete 
243c0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69  the temporary fi
243d0 6c 65 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c  le when it is cl
243e0 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  osed..**.** The 
243f0 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f 20  flags passed to 
24400 74 68 65 20 56 46 53 20 6c 61 79 65 72 20 78 4f  the VFS layer xO
24410 70 65 6e 28 29 20 63 61 6c 6c 20 61 72 65 20 74  pen() call are t
24420 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 0a 2a  hose specified.*
24430 2a 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 76  * by parameter v
24440 66 73 46 6c 61 67 73 20 4f 52 65 64 20 77 69 74  fsFlags ORed wit
24450 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  h the following:
24460 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  .**.**     SQLIT
24470 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
24480 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f  .**     SQLITE_O
24490 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a 20 20 20  PEN_CREATE.**   
244a0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58    SQLITE_OPEN_EX
244b0 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 53  CLUSIVE.**     S
244c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
244d0 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74 61 74  EONCLOSE.*/.stat
244e0 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e  ic int pagerOpen
244f0 74 65 6d 70 28 0a 20 20 50 61 67 65 72 20 2a 70  temp(.  Pager *p
24500 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a  Pager,        /*
24510 20 54 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   The pager objec
24520 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  t */.  sqlite3_f
24530 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a 20  ile *pFile,  /* 
24540 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64  Write the file d
24550 65 73 63 72 69 70 74 6f 72 20 68 65 72 65 20 2a  escriptor here *
24560 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73  /.  int vfsFlags
24570 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
24580 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67  gs passed throug
24590 68 20 74 6f 20 74 68 65 20 56 46 53 20 2a 2f 0a  h to the VFS */.
245a0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
245b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
245c0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23 69  turn code */..#i
245d0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
245e0 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74  .  sqlite3_opent
245f0 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a  emp_count++;  /*
24600 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   Used for testin
24610 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f  g and analysis o
24620 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  nly */.#endif.. 
24630 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 20 53 51   vfsFlags |=  SQ
24640 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
24650 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
24660 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20  N_CREATE |.     
24670 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
24680 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 20 53  EN_EXCLUSIVE | S
24690 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
246a0 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20 3d  EONCLOSE;.  rc =
246b0 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
246c0 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20  Pager->pVfs, 0, 
246d0 70 46 69 6c 65 2c 20 76 66 73 46 6c 61 67 73 2c  pFile, vfsFlags,
246e0 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72   0);.  assert( r
246f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
24700 69 73 4f 70 65 6e 28 70 46 69 6c 65 29 20 29 3b  isOpen(pFile) );
24710 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
24720 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62  ./*.** Set the b
24730 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63  usy handler func
24740 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
24750 70 61 67 65 72 20 69 6e 76 6f 6b 65 73 20 74 68  pager invokes th
24760 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69  e busy-handler i
24770 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  f sqlite3OsLock(
24780 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51  ) returns .** SQ
24790 4c 49 54 45 5f 42 55 53 59 20 77 68 65 6e 20 74  LITE_BUSY when t
247a0 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65  rying to upgrade
247b0 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74 6f   from no-lock to
247c0 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 0a   a SHARED lock,.
247d0 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72 79 69 6e  ** or when tryin
247e0 67 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f  g to upgrade fro
247f0 6d 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  m a RESERVED loc
24800 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56  k to an EXCLUSIV
24810 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20 64  E .** lock. It d
24820 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b 65  oes *not* invoke
24830 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
24840 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67  r when upgrading
24850 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52 45 44 20   from.** SHARED 
24860 74 6f 20 52 45 53 45 52 56 45 44 2c 20 6f 72 20  to RESERVED, or 
24870 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66  when upgrading f
24880 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 45 58  rom SHARED to EX
24890 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77 68 69 63  CLUSIVE.** (whic
248a0 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  h occurs during 
248b0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
248c0 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72 79 3a 0a  back). Summary:.
248d0 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73 69 74 69  **.**   Transiti
248e0 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  on              
248f0 20 20 20 20 20 20 20 20 20 20 7c 20 49 6e 76 6f            | Invo
24900 6b 65 73 20 78 42 75 73 79 48 61 6e 64 6c 65 72  kes xBusyHandler
24910 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .**   ----------
24920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24930 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24940 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
24950 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20  *   NO_LOCK     
24960 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c 4f 43 4b    -> SHARED_LOCK
24970 20 20 20 20 20 20 7c 20 59 65 73 0a 2a 2a 20 20        | Yes.**  
24980 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d   SHARED_LOCK   -
24990 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  > RESERVED_LOCK 
249a0 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48 41     | No.**   SHA
249b0 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45 58  RED_LOCK   -> EX
249c0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c  CLUSIVE_LOCK   |
249d0 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45 52 56 45   No.**   RESERVE
249e0 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c 55 53  D_LOCK -> EXCLUS
249f0 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 59 65 73  IVE_LOCK   | Yes
24a00 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 75  .**.** If the bu
24a10 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62  sy-handler callb
24a20 61 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d  ack returns non-
24a30 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69  zero, the lock i
24a40 73 20 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20 49  s .** retried. I
24a50 66 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65 72  f it returns zer
24a60 6f 2c 20 74 68 65 6e 20 74 68 65 20 53 51 4c 49  o, then the SQLI
24a70 54 45 5f 42 55 53 59 20 65 72 72 6f 72 20 69 73  TE_BUSY error is
24a80 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 74 6f 20  .** returned to 
24a90 74 68 65 20 63 61 6c 6c 65 72 20 6f 66 20 74 68  the caller of th
24aa0 65 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63  e pager API func
24ab0 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
24ac0 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73  lite3PagerSetBus
24ad0 79 48 61 6e 64 6c 65 72 28 0a 20 20 50 61 67 65  yHandler(.  Page
24ae0 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
24af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b00 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
24b10 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73   */.  int (*xBus
24b20 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 20 2a  yHandler)(void *
24b30 29 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  ),         /* Po
24b40 69 6e 74 65 72 20 74 6f 20 62 75 73 79 2d 68 61  inter to busy-ha
24b50 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 2a  ndler function *
24b60 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48  /.  void *pBusyH
24b70 61 6e 64 6c 65 72 41 72 67 20 20 20 20 20 20 20  andlerArg       
24b80 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75           /* Argu
24b90 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74 6f 20  ment to pass to 
24ba0 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a  xBusyHandler */.
24bb0 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 42 75  ){.  pPager->xBu
24bc0 73 79 48 61 6e 64 6c 65 72 20 3d 20 78 42 75 73  syHandler = xBus
24bd0 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70 50 61 67  yHandler;.  pPag
24be0 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
24bf0 41 72 67 20 3d 20 70 42 75 73 79 48 61 6e 64 6c  Arg = pBusyHandl
24c00 65 72 41 72 67 3b 0a 0a 20 20 69 66 28 20 69 73  erArg;..  if( is
24c10 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
24c20 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 2a 61   ){.    void **a
24c30 70 20 3d 20 28 76 6f 69 64 20 2a 2a 29 26 70 50  p = (void **)&pP
24c40 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c  ager->xBusyHandl
24c50 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  er;.    assert( 
24c60 28 28 69 6e 74 28 2a 29 28 76 6f 69 64 20 2a 29  ((int(*)(void *)
24c70 29 28 61 70 5b 30 5d 29 29 3d 3d 78 42 75 73 79  )(ap[0]))==xBusy
24c80 48 61 6e 64 6c 65 72 20 29 3b 0a 20 20 20 20 61  Handler );.    a
24c90 73 73 65 72 74 28 20 61 70 5b 31 5d 3d 3d 70 42  ssert( ap[1]==pB
24ca0 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 29 3b  usyHandlerArg );
24cb0 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69  .    sqlite3OsFi
24cc0 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50  leControlHint(pP
24cd0 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45  ager->fd, SQLITE
24ce0 5f 46 43 4e 54 4c 5f 42 55 53 59 48 41 4e 44 4c  _FCNTL_BUSYHANDL
24cf0 45 52 2c 20 28 76 6f 69 64 20 2a 29 61 70 29 3b  ER, (void *)ap);
24d00 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
24d10 61 6e 67 65 20 74 68 65 20 70 61 67 65 20 73 69  ange the page si
24d20 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20 50  ze used by the P
24d30 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 54 68 65  ager object. The
24d40 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20 0a   new page size .
24d50 2a 2a 20 69 73 20 70 61 73 73 65 64 20 69 6e 20  ** is passed in 
24d60 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a  *pPageSize..**.*
24d70 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
24d80 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  s in the error s
24d90 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66  tate when this f
24da0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
24db0 64 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e 6f  d, it.** is a no
24dc0 2d 6f 70 2e 20 54 68 65 20 76 61 6c 75 65 20 72  -op. The value r
24dd0 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 65  eturned is the e
24de0 72 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72  rror state error
24df0 20 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a 20   code (i.e. .** 
24e00 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 49 4f  one of SQLITE_IO
24e10 45 52 52 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49  ERR, an SQLITE_I
24e20 4f 45 52 52 5f 78 78 78 20 73 75 62 2d 63 6f 64  OERR_xxx sub-cod
24e30 65 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c  e or SQLITE_FULL
24e40 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  )..**.** Otherwi
24e50 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  se, if all of th
24e60 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
24e70 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  true:.**.**   * 
24e80 74 68 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a  the new page siz
24e90 65 20 28 76 61 6c 75 65 20 6f 66 20 2a 70 50 61  e (value of *pPa
24ea0 67 65 53 69 7a 65 29 20 69 73 20 76 61 6c 69 64  geSize) is valid
24eb0 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20 20   (a power .**   
24ec0 20 20 6f 66 20 74 77 6f 20 62 65 74 77 65 65 6e    of two between
24ed0 20 35 31 32 20 61 6e 64 20 53 51 4c 49 54 45 5f   512 and SQLITE_
24ee0 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20 69  MAX_PAGE_SIZE, i
24ef0 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a 2a  nclusive), and.*
24f00 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65 20 61  *.**   * there a
24f10 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  re no outstandin
24f20 67 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  g page reference
24f30 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a  s, and.**.**   *
24f40 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
24f50 20 65 69 74 68 65 72 20 6e 6f 74 20 61 6e 20 69   either not an i
24f60 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
24f70 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20 20  e or it is.**   
24f80 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64    an in-memory d
24f90 61 74 61 62 61 73 65 20 74 68 61 74 20 63 75 72  atabase that cur
24fa0 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73 20  rently consists 
24fb0 6f 66 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a 2a  of zero pages..*
24fc0 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 70 61  *.** then the pa
24fd0 67 65 72 20 6f 62 6a 65 63 74 20 70 61 67 65 20  ger object page 
24fe0 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 2a  size is set to *
24ff0 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a  pPageSize..**.**
25000 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   If the page siz
25010 65 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74 68  e is changed, th
25020 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
25030 20 75 73 65 73 20 73 71 6c 69 74 65 33 50 61 67   uses sqlite3Pag
25040 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74  erMalloc() .** t
25050 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65 77 20 50  o obtain a new P
25060 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62  ager.pTmpSpace b
25070 75 66 66 65 72 2e 20 49 66 20 74 68 69 73 20 61  uffer. If this a
25080 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70  llocation attemp
25090 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c  t .** fails, SQL
250a0 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74  ITE_NOMEM is ret
250b0 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61  urned and the pa
250c0 67 65 20 73 69 7a 65 20 72 65 6d 61 69 6e 73 20  ge size remains 
250d0 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49  unchanged. .** I
250e0 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 61 73 65  n all other case
250f0 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  s, SQLITE_OK is 
25100 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
25110 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  If the page size
25120 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 2c   is not changed,
25130 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20   either because 
25140 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e 75 6d 65  one of the enume
25150 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74 69  rated.** conditi
25160 6f 6e 73 20 61 62 6f 76 65 20 69 73 20 6e 6f 74  ons above is not
25170 20 74 72 75 65 2c 20 74 68 65 20 70 61 67 65 72   true, the pager
25180 20 77 61 73 20 69 6e 20 65 72 72 6f 72 20 73 74   was in error st
25190 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a  ate when this.**
251a0 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61   function was ca
251b0 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61 75 73 65  lled, or because
251c0 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   the memory allo
251d0 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 66  cation attempt f
251e0 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e 20  ailed, .** then 
251f0 2a 70 50 61 67 65 53 69 7a 65 20 69 73 20 73 65  *pPageSize is se
25200 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72 65  t to the old, re
25210 74 61 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65  tained page size
25220 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
25230 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
25240 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
25250 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
25260 20 75 33 32 20 2a 70 50 61 67 65 53 69 7a 65 2c   u32 *pPageSize,
25270 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29 7b 0a   int nReserve){.
25280 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
25290 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 74 20 69  E_OK;..  /* It i
252a0 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
252b0 6f 20 64 6f 20 61 20 66 75 6c 6c 20 61 73 73 65  o do a full asse
252c0 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 29  rt_pager_state()
252d0 20 68 65 72 65 2c 20 61 73 20 74 68 69 73 0a 20   here, as this. 
252e0 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79   ** function may
252f0 20 62 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20   be called from 
25300 77 69 74 68 69 6e 20 50 61 67 65 72 4f 70 65 6e  within PagerOpen
25310 28 29 2c 20 62 65 66 6f 72 65 20 74 68 65 20 73  (), before the s
25320 74 61 74 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65  tate.  ** of the
25330 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73   Pager object is
25340 20 69 6e 74 65 72 6e 61 6c 6c 79 20 63 6f 6e 73   internally cons
25350 69 73 74 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a  istent..  **.  *
25360 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74  * At one point t
25370 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
25380 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 69  urned an error i
25390 66 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  f the pager was 
253a0 69 6e 20 0a 20 20 2a 2a 20 50 41 47 45 52 5f 45  in .  ** PAGER_E
253b0 52 52 4f 52 20 73 74 61 74 65 2e 20 42 75 74 20  RROR state. But 
253c0 73 69 6e 63 65 20 50 41 47 45 52 5f 45 52 52 4f  since PAGER_ERRO
253d0 52 20 73 74 61 74 65 20 67 75 61 72 61 6e 74 65  R state guarante
253e0 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65  es that.  ** the
253f0 72 65 20 69 73 20 61 74 20 6c 65 61 73 74 20 6f  re is at least o
25400 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ne outstanding p
25410 61 67 65 20 72 65 66 65 72 65 6e 63 65 2c 20 74  age reference, t
25420 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a  his function.  *
25430 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72  * is a no-op for
25440 20 74 68 61 74 20 63 61 73 65 20 61 6e 79 68 6f   that case anyho
25450 77 2e 0a 20 20 2a 2f 0a 0a 20 20 75 33 32 20 70  w..  */..  u32 p
25460 61 67 65 53 69 7a 65 20 3d 20 2a 70 50 61 67 65  ageSize = *pPage
25470 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Size;.  assert( 
25480 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28  pageSize==0 || (
25490 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
254a0 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54   pageSize<=SQLIT
254b0 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29  E_MAX_PAGE_SIZE)
254c0 20 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67 65   );.  if( (pPage
254d0 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20 70  r->memDb==0 || p
254e0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30  Pager->dbSize==0
254f0 29 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 50  ).   && sqlite3P
25500 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
25510 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
25520 30 20 0a 20 20 20 26 26 20 70 61 67 65 53 69 7a  0 .   && pageSiz
25530 65 20 26 26 20 70 61 67 65 53 69 7a 65 21 3d 28  e && pageSize!=(
25540 75 33 32 29 70 50 61 67 65 72 2d 3e 70 61 67 65  u32)pPager->page
25550 53 69 7a 65 20 0a 20 20 29 7b 0a 20 20 20 20 63  Size .  ){.    c
25560 68 61 72 20 2a 70 4e 65 77 20 3d 20 4e 55 4c 4c  har *pNew = NULL
25570 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
25580 20 4e 65 77 20 74 65 6d 70 20 73 70 61 63 65 20   New temp space 
25590 2a 2f 0a 20 20 20 20 69 36 34 20 6e 42 79 74 65  */.    i64 nByte
255a0 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 70   = 0;..    if( p
255b0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50 41  Pager->eState>PA
255c0 47 45 52 5f 4f 50 45 4e 20 26 26 20 69 73 4f 70  GER_OPEN && isOp
255d0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
255e0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
255f0 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
25600 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 42 79 74  Pager->fd, &nByt
25610 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
25620 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
25630 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  ){.      pNew = 
25640 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50  (char *)sqlite3P
25650 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69  ageMalloc(pageSi
25660 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ze);.      if( !
25670 70 4e 65 77 20 29 20 72 63 20 3d 20 53 51 4c 49  pNew ) rc = SQLI
25680 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
25690 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63     }..    if( rc
256a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
256b0 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
256c0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
256d0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  rc = sqlite3Pcac
256e0 68 65 53 65 74 50 61 67 65 53 69 7a 65 28 70 50  heSetPageSize(pP
256f0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
25700 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  ageSize);.    }.
25710 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
25720 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
25730 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70  qlite3PageFree(p
25740 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
25750 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
25760 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 70 4e 65  >pTmpSpace = pNe
25770 77 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  w;.      pPager-
25780 3e 64 62 53 69 7a 65 20 3d 20 28 50 67 6e 6f 29  >dbSize = (Pgno)
25790 28 28 6e 42 79 74 65 2b 70 61 67 65 53 69 7a 65  ((nByte+pageSize
257a0 2d 31 29 2f 70 61 67 65 53 69 7a 65 29 3b 0a 20  -1)/pageSize);. 
257b0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67       pPager->pag
257c0 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
257d0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
257e0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72     sqlite3PageFr
257f0 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 7d 0a  ee(pNew);.    }.
25800 20 20 7d 0a 0a 20 20 2a 70 50 61 67 65 53 69 7a    }..  *pPageSiz
25810 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  e = pPager->page
25820 53 69 7a 65 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Size;.  if( rc==
25830 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25840 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20   if( nReserve<0 
25850 29 20 6e 52 65 73 65 72 76 65 20 3d 20 70 50 61  ) nReserve = pPa
25860 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 3b 0a 20  ger->nReserve;. 
25870 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65     assert( nRese
25880 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72  rve>=0 && nReser
25890 76 65 3c 31 30 30 30 20 29 3b 0a 20 20 20 20 70  ve<1000 );.    p
258a0 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20  Pager->nReserve 
258b0 3d 20 28 69 31 36 29 6e 52 65 73 65 72 76 65 3b  = (i16)nReserve;
258c0 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f 72 74  .    pagerReport
258d0 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
258e0 20 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69 6d    pagerFixMaplim
258f0 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  it(pPager);.  }.
25900 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
25910 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
25920 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22 74  ointer to the "t
25930 65 6d 70 6f 72 61 72 79 20 70 61 67 65 22 20 62  emporary page" b
25940 75 66 66 65 72 20 68 65 6c 64 20 69 6e 74 65 72  uffer held inter
25950 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65 20  nally.** by the 
25960 70 61 67 65 72 2e 20 20 54 68 69 73 20 69 73 20  pager.  This is 
25970 61 20 62 75 66 66 65 72 20 74 68 61 74 20 69 73  a buffer that is
25980 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68   big enough to h
25990 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72  old the.** entir
259a0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64  e content of a d
259b0 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 20 54  atabase page.  T
259c0 68 69 73 20 62 75 66 66 65 72 20 69 73 20 75 73  his buffer is us
259d0 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a  ed internally.**
259e0 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
259f0 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76 65   and will be ove
25a00 72 77 72 69 74 74 65 6e 20 77 68 65 6e 65 76 65  rwritten wheneve
25a10 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  r a rollback.** 
25a20 6f 63 63 75 72 73 2e 20 20 42 75 74 20 6f 74 68  occurs.  But oth
25a30 65 72 20 6d 6f 64 75 6c 65 73 20 61 72 65 20 66  er modules are f
25a40 72 65 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f  ree to use it to
25a50 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a  o, as long as.**
25a60 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61 72   no rollbacks ar
25a70 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a  e happening..*/.
25a80 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67  void *sqlite3Pag
25a90 65 72 54 65 6d 70 53 70 61 63 65 28 50 61 67 65  erTempSpace(Page
25aa0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
25ab0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 54 6d  turn pPager->pTm
25ac0 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pSpace;.}../*.**
25ad0 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20   Attempt to set 
25ae0 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 61 74 61  the maximum data
25af0 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 20  base page count 
25b00 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73  if mxPage is pos
25b10 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20  itive. .** Make 
25b20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20 6d 78  no changes if mx
25b30 50 61 67 65 20 69 73 20 7a 65 72 6f 20 6f 72 20  Page is zero or 
25b40 6e 65 67 61 74 69 76 65 2e 20 20 41 6e 64 20 6e  negative.  And n
25b50 65 76 65 72 20 72 65 64 75 63 65 20 74 68 65 0a  ever reduce the.
25b60 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  ** maximum page 
25b70 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68 65 20  count below the 
25b80 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
25b90 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
25ba0 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f  .** Regardless o
25bb0 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e  f mxPage, return
25bc0 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61 78   the current max
25bd0 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e  imum page count.
25be0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
25bf0 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74  agerMaxPageCount
25c00 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
25c10 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69  int mxPage){.  i
25c20 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20  f( mxPage>0 ){. 
25c30 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e     pPager->mxPgn
25c40 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a  o = mxPage;.  }.
25c50 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
25c60 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
25c70 4f 50 45 4e 20 29 3b 20 20 20 20 20 20 2f 2a 20  OPEN );      /* 
25c80 43 61 6c 6c 65 64 20 6f 6e 6c 79 20 62 79 20 4f  Called only by O
25c90 50 5f 4d 61 78 50 67 63 6e 74 20 2a 2f 0a 20 20  P_MaxPgcnt */.  
25ca0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
25cb0 6d 78 50 67 6e 6f 3e 3d 70 50 61 67 65 72 2d 3e  mxPgno>=pPager->
25cc0 64 62 53 69 7a 65 20 29 3b 20 20 2f 2a 20 4f 50  dbSize );  /* OP
25cd0 5f 4d 61 78 50 67 63 6e 74 20 65 6e 66 6f 72 63  _MaxPgcnt enforc
25ce0 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 72 65 74  es this */.  ret
25cf0 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50 67  urn pPager->mxPg
25d00 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  no;.}../*.** The
25d10 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f   following set o
25d20 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75  f routines are u
25d30 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74  sed to disable t
25d40 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20  he simulated.** 
25d50 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61 6e  I/O error mechan
25d60 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75 74  ism.  These rout
25d70 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
25d80 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65 64   avoid simulated
25d90 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c  .** errors in pl
25da0 61 63 65 73 20 77 68 65 72 65 20 77 65 20 64 6f  aces where we do
25db0 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20   not care about 
25dc0 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e  errors..**.** Un
25dd0 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45  less -DSQLITE_TE
25de0 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68  ST=1 is used, th
25df0 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
25e00 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61   all no-ops.** a
25e10 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63  nd generate no c
25e20 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ode..*/.#ifdef S
25e30 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65 72  QLITE_TEST.exter
25e40 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f  n int sqlite3_io
25e50 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a  _error_pending;.
25e60 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
25e70 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b  e3_io_error_hit;
25e80 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
25e90 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61  d_cnt;.void disa
25ea0 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
25eb0 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20  _errors(void){. 
25ec0 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c   saved_cnt = sql
25ed0 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
25ee0 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33  nding;.  sqlite3
25ef0 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
25f00 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65  g = -1;.}.void e
25f10 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
25f20 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b  io_errors(void){
25f30 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  .  sqlite3_io_er
25f40 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61  ror_pending = sa
25f50 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65  ved_cnt;.}.#else
25f60 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61 62 6c  .# define disabl
25f70 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
25f80 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e 65  rrors().# define
25f90 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
25fa0 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65  d_io_errors().#e
25fb0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  ndif../*.** Read
25fc0 20 74 68 65 20 66 69 72 73 74 20 4e 20 62 79 74   the first N byt
25fd0 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69  es from the begi
25fe0 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c  nning of the fil
25ff0 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a  e into memory.**
26000 20 74 68 61 74 20 70 44 65 73 74 20 70 6f 69 6e   that pDest poin
26010 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  ts to. .**.** If
26020 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 6f   the pager was o
26030 70 65 6e 65 64 20 6f 6e 20 61 20 74 72 61 6e 73  pened on a trans
26040 69 65 6e 74 20 66 69 6c 65 20 28 7a 46 69 6c 65  ient file (zFile
26050 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a 2a  name==""), or.**
26060 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 66 69 6c   opened on a fil
26070 65 20 6c 65 73 73 20 74 68 61 6e 20 4e 20 62 79  e less than N by
26080 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65  tes in size, the
26090 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69   output buffer i
260a0 73 0a 2a 2a 20 7a 65 72 6f 65 64 20 61 6e 64 20  s.** zeroed and 
260b0 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
260c0 65 64 2e 20 54 68 65 20 72 61 74 69 6f 6e 61 6c  ed. The rational
260d0 65 20 66 6f 72 20 74 68 69 73 20 69 73 20 74 68  e for this is th
260e0 61 74 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63  at this .** func
260f0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
26100 72 65 61 64 20 64 61 74 61 62 61 73 65 20 68 65  read database he
26110 61 64 65 72 73 2c 20 61 6e 64 20 61 20 6e 65 77  aders, and a new
26120 20 74 72 61 6e 73 69 65 6e 74 20 6f 72 0a 2a 2a   transient or.**
26130 20 7a 65 72 6f 20 73 69 7a 65 64 20 64 61 74 61   zero sized data
26140 62 61 73 65 20 68 61 73 20 61 20 68 65 61 64 65  base has a heade
26150 72 20 74 68 61 6e 20 63 6f 6e 73 69 73 74 73 20  r than consists 
26160 65 6e 74 69 72 65 6c 79 20 6f 66 20 7a 65 72 6f  entirely of zero
26170 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79  es..**.** If any
26180 20 49 4f 20 65 72 72 6f 72 20 61 70 61 72 74 20   IO error apart 
26190 66 72 6f 6d 20 53 51 4c 49 54 45 5f 49 4f 45 52  from SQLITE_IOER
261a0 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 69 73 20  R_SHORT_READ is 
261b0 65 6e 63 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a 20  encountered,.** 
261c0 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  the error code i
261d0 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  s returned to th
261e0 65 20 63 61 6c 6c 65 72 20 61 6e 64 20 74 68 65  e caller and the
261f0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
26200 0a 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65  .** output buffe
26210 72 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a  r undefined..*/.
26220 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
26230 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 50  ReadFileheader(P
26240 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
26250 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  t N, unsigned ch
26260 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e  ar *pDest){.  in
26270 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
26280 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 73 74  ;.  memset(pDest
26290 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65 72  , 0, N);.  asser
262a0 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
262b0 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  ->fd) || pPager-
262c0 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20  >tempFile );..  
262d0 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  /* This routine 
262e0 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62  is only called b
262f0 79 20 62 74 72 65 65 20 69 6d 6d 65 64 69 61 74  y btree immediat
26300 65 6c 79 20 61 66 74 65 72 20 63 72 65 61 74 69  ely after creati
26310 6e 67 0a 20 20 2a 2a 20 74 68 65 20 50 61 67 65  ng.  ** the Page
26320 72 20 6f 62 6a 65 63 74 2e 20 20 54 68 65 72 65  r object.  There
26330 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6e   has not been an
26340 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20   opportunity to 
26350 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20 2a 2a 20  transition.  ** 
26360 74 6f 20 57 41 4c 20 6d 6f 64 65 20 79 65 74 2e  to WAL mode yet.
26370 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
26380 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
26390 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 69  ger) );..  if( i
263a0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
263b0 29 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45  ) ){.    IOTRACE
263c0 28 28 22 44 42 48 44 52 20 25 70 20 30 20 25 64  (("DBHDR %p 0 %d
263d0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29 29  \n", pPager, N))
263e0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
263f0 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
26400 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30 29  fd, pDest, N, 0)
26410 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
26420 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
26430 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72  _READ ){.      r
26440 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
26450 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
26460 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
26470 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
26480 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20   only be called 
26490 77 68 65 6e 20 61 20 72 65 61 64 2d 74 72 61 6e  when a read-tran
264a0 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20  saction is open 
264b0 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 2e  on.** the pager.
264c0 20 49 74 20 72 65 74 75 72 6e 73 20 74 68 65 20   It returns the 
264d0 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
264e0 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
264f0 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 48 6f 77  abase..**.** How
26500 65 76 65 72 2c 20 69 66 20 74 68 65 20 66 69 6c  ever, if the fil
26510 65 20 69 73 20 62 65 74 77 65 65 6e 20 31 20 61  e is between 1 a
26520 6e 64 20 3c 70 61 67 65 2d 73 69 7a 65 3e 20 62  nd <page-size> b
26530 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68  ytes in size, th
26540 65 6e 20 0a 2a 2a 20 74 68 69 73 20 69 73 20 63  en .** this is c
26550 6f 6e 73 69 64 65 72 65 64 20 61 20 31 20 70 61  onsidered a 1 pa
26560 67 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64  ge file..*/.void
26570 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
26580 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  ecount(Pager *pP
26590 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50 61 67  ager, int *pnPag
265a0 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e){.  assert( pP
265b0 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
265c0 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20  GER_READER );.  
265d0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
265e0 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 57 52  eState!=PAGER_WR
265f0 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 29 3b  ITER_FINISHED );
26600 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 28 69 6e  .  *pnPage = (in
26610 74 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  t)pPager->dbSize
26620 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20  ;.}.../*.** Try 
26630 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  to obtain a lock
26640 20 6f 66 20 74 79 70 65 20 6c 6f 63 6b 74 79 70   of type locktyp
26650 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  e on the databas
26660 65 20 66 69 6c 65 2e 20 49 66 0a 2a 2a 20 61 20  e file. If.** a 
26670 73 69 6d 69 6c 61 72 20 6f 72 20 67 72 65 61 74  similar or great
26680 65 72 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61  er lock is alrea
26690 64 79 20 68 65 6c 64 2c 20 74 68 69 73 20 66 75  dy held, this fu
266a0 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
266b0 70 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67 20  p.** (returning 
266c0 53 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65 64 69  SQLITE_OK immedi
266d0 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74  ately)..**.** Ot
266e0 68 65 72 77 69 73 65 2c 20 61 74 74 65 6d 70 74  herwise, attempt
266f0 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 6c   to obtain the l
26700 6f 63 6b 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ock using sqlite
26710 33 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f 6b  3OsLock(). Invok
26720 65 20 0a 2a 2a 20 74 68 65 20 62 75 73 79 20 63  e .** the busy c
26730 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20 6c  allback if the l
26740 6f 63 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ock is currently
26750 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20   not available. 
26760 52 65 70 65 61 74 20 0a 2a 2a 20 75 6e 74 69 6c  Repeat .** until
26770 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
26780 63 6b 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65  ck returns false
26790 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 61 74   or until the at
267a0 74 65 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f 62 74  tempt to .** obt
267b0 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 73 75 63  ain the lock suc
267c0 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  ceeds..**.** Ret
267d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
267e0 20 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20   success and an 
267f0 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65  error code if we
26800 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a   cannot obtain.*
26810 2a 20 74 68 65 20 6c 6f 63 6b 2e 20 49 66 20 74  * the lock. If t
26820 68 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69  he lock is obtai
26830 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ned successfully
26840 2c 20 73 65 74 20 74 68 65 20 50 61 67 65 72 2e  , set the Pager.
26850 73 74 61 74 65 20 0a 2a 2a 20 76 61 72 69 61 62  state .** variab
26860 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 20 62  le to locktype b
26870 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
26880 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
26890 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
268a0 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  k(Pager *pPager,
268b0 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a   int locktype){.
268c0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
268d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
268e0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
268f0 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 43   code */..  /* C
26900 68 65 63 6b 20 74 68 61 74 20 74 68 69 73 20 69  heck that this i
26910 73 20 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f 70  s either a no-op
26920 20 28 62 65 63 61 75 73 65 20 74 68 65 20 72 65   (because the re
26930 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 69 73 20  quested lock is 
26940 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 68 65  .  ** already he
26950 6c 64 29 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74  ld), or one of t
26960 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74  he transitions t
26970 68 61 74 20 74 68 65 20 62 75 73 79 2d 68 61 6e  hat the busy-han
26980 64 6c 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62 65  dler.  ** may be
26990 20 69 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67 2c   invoked during,
269a0 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
269b0 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 0a  e comment above.
269c0 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65    ** sqlite3Page
269d0 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28  rSetBusyhandler(
269e0 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  )..  */.  assert
269f0 28 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  ( (pPager->eLock
26a00 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20 20  >=locktype).    
26a10 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65     || (pPager->e
26a20 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26  Lock==NO_LOCK &&
26a30 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
26a40 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20 7c  D_LOCK).       |
26a50 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  | (pPager->eLock
26a60 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
26a70 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43  && locktype==EXC
26a80 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 29  LUSIVE_LOCK).  )
26a90 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72 63  ;..  do {.    rc
26aa0 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70   = pagerLockDb(p
26ab0 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29  Pager, locktype)
26ac0 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d  ;.  }while( rc==
26ad0 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70  SQLITE_BUSY && p
26ae0 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64  Pager->xBusyHand
26af0 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75 73  ler(pPager->pBus
26b00 79 48 61 6e 64 6c 65 72 41 72 67 29 20 29 3b 0a  yHandlerArg) );.
26b10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
26b20 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 61  /*.** Function a
26b30 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
26b40 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29 20  straint(pPager) 
26b50 63 68 65 63 6b 73 20 74 68 61 74 20 6f 6e 65 20  checks that one 
26b60 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f  of the .** follo
26b70 77 69 6e 67 20 69 73 20 74 72 75 65 20 66 6f 72  wing is true for
26b80 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
26b90 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68   currently in th
26ba0 65 20 70 61 67 65 2d 63 61 63 68 65 3a 0a 2a 2a  e page-cache:.**
26bb0 0a 2a 2a 20 20 20 61 29 20 54 68 65 20 70 61 67  .**   a) The pag
26bc0 65 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73  e number is less
26bd0 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
26be0 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  o the size of th
26bf0 65 20 0a 2a 2a 20 20 20 20 20 20 63 75 72 72 65  e .**      curre
26c00 6e 74 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  nt database imag
26c10 65 2c 20 69 6e 20 70 61 67 65 73 2c 20 4f 52 0a  e, in pages, OR.
26c20 2a 2a 0a 2a 2a 20 20 20 62 29 20 69 66 20 74 68  **.**   b) if th
26c30 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 77  e page content w
26c40 65 72 65 20 77 72 69 74 74 65 6e 20 61 74 20 74  ere written at t
26c50 68 69 73 20 74 69 6d 65 2c 20 69 74 20 77 6f 75  his time, it wou
26c60 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 62  ld not.**      b
26c70 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77  e necessary to w
26c80 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
26c90 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 74 6f 20   content out to 
26ca0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a  the sub-journal.
26cb0 2a 2a 20 20 20 20 20 20 28 61 73 20 64 65 74 65  **      (as dete
26cc0 72 6d 69 6e 65 64 20 62 79 20 66 75 6e 63 74 69  rmined by functi
26cd0 6f 6e 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  on subjRequiresP
26ce0 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  age())..**.** If
26cf0 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 61   the condition a
26d00 73 73 65 72 74 65 64 20 62 79 20 74 68 69 73 20  sserted by this 
26d10 66 75 6e 63 74 69 6f 6e 20 77 65 72 65 20 6e 6f  function were no
26d20 74 20 74 72 75 65 2c 20 61 6e 64 20 74 68 65 0a  t true, and the.
26d30 2a 2a 20 64 69 72 74 79 20 70 61 67 65 20 77 65  ** dirty page we
26d40 72 65 20 74 6f 20 62 65 20 64 69 73 63 61 72 64  re to be discard
26d50 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68  ed from the cach
26d60 65 20 76 69 61 20 74 68 65 20 70 61 67 65 72 53  e via the pagerS
26d70 74 72 65 73 73 28 29 0a 2a 2a 20 72 6f 75 74 69  tress().** routi
26d80 6e 65 2c 20 70 61 67 65 72 53 74 72 65 73 73 28  ne, pagerStress(
26d90 29 20 77 6f 75 6c 64 20 6e 6f 74 20 77 72 69 74  ) would not writ
26da0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  e the current pa
26db0 67 65 20 63 6f 6e 74 65 6e 74 20 74 6f 0a 2a 2a  ge content to.**
26dc0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
26dd0 6c 65 2e 20 49 66 20 61 20 73 61 76 65 70 6f 69  le. If a savepoi
26de0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  nt transaction w
26df0 65 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ere rolled back 
26e00 61 66 74 65 72 0a 2a 2a 20 74 68 69 73 20 68 61  after.** this ha
26e10 70 70 65 6e 65 64 2c 20 74 68 65 20 63 6f 72 72  ppened, the corr
26e20 65 63 74 20 62 65 68 61 76 69 6f 72 20 77 6f 75  ect behavior wou
26e30 6c 64 20 62 65 20 74 6f 20 72 65 73 74 6f 72 65  ld be to restore
26e40 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
26e50 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
26e60 61 67 65 2e 20 48 6f 77 65 76 65 72 2c 20 73 69  age. However, si
26e70 6e 63 65 20 74 68 69 73 20 63 6f 6e 74 65 6e 74  nce this content
26e80 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 20   is not present 
26e90 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 74 68 65  in either.** the
26ea0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f   database file o
26eb0 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 6f 66  r the portion of
26ec0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
26ed0 75 72 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20 73 75  urnal and .** su
26ee0 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 65 64  b-journal rolled
26ef0 20 62 61 63 6b 20 74 68 65 20 63 6f 6e 74 65 6e   back the conten
26f00 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72  t could not be r
26f10 65 73 74 6f 72 65 64 20 61 6e 64 20 74 68 65 0a  estored and the.
26f20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  ** database imag
26f30 65 20 77 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63  e would become c
26f40 6f 72 72 75 70 74 2e 20 49 74 20 69 73 20 74 68  orrupt. It is th
26f50 65 72 65 66 6f 72 65 20 66 6f 72 74 75 6e 61 74  erefore fortunat
26f60 65 20 74 68 61 74 20 0a 2a 2a 20 74 68 69 73 20  e that .** this 
26f70 63 69 72 63 75 6d 73 74 61 6e 63 65 20 63 61 6e  circumstance can
26f80 6e 6f 74 20 61 72 69 73 65 2e 0a 2a 2f 0a 23 69  not arise..*/.#i
26f90 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
26fa0 5f 44 45 42 55 47 29 0a 73 74 61 74 69 63 20 76  _DEBUG).static v
26fb0 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e 63 61  oid assertTrunca
26fc0 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 28 50  teConstraintCb(P
26fd0 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 61 73  gHdr *pPg){.  as
26fe0 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73  sert( pPg->flags
26ff0 26 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a  &PGHDR_DIRTY );.
27000 20 20 61 73 73 65 72 74 28 20 21 73 75 62 6a 52    assert( !subjR
27010 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29  equiresPage(pPg)
27020 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70   || pPg->pgno<=p
27030 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62 53 69  Pg->pPager->dbSi
27040 7a 65 20 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  ze );.}.static v
27050 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e 63 61  oid assertTrunca
27060 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 50 61 67  teConstraint(Pag
27070 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73  er *pPager){.  s
27080 71 6c 69 74 65 33 50 63 61 63 68 65 49 74 65 72  qlite3PcacheIter
27090 61 74 65 44 69 72 74 79 28 70 50 61 67 65 72 2d  ateDirty(pPager-
270a0 3e 70 50 43 61 63 68 65 2c 20 61 73 73 65 72 74  >pPCache, assert
270b0 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
270c0 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  ntCb);.}.#else.#
270d0 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 54 72   define assertTr
270e0 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
270f0 28 70 50 61 67 65 72 29 0a 23 65 6e 64 69 66 0a  (pPager).#endif.
27100 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20  ./*.** Truncate 
27110 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  the in-memory da
27120 74 61 62 61 73 65 20 66 69 6c 65 20 69 6d 61 67  tabase file imag
27130 65 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73  e to nPage pages
27140 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  . This .** funct
27150 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 63 74  ion does not act
27160 75 61 6c 6c 79 20 6d 6f 64 69 66 79 20 74 68 65  ually modify the
27170 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f   database file o
27180 6e 20 64 69 73 6b 2e 20 49 74 20 0a 2a 2a 20 6a  n disk. It .** j
27190 75 73 74 20 73 65 74 73 20 74 68 65 20 69 6e 74  ust sets the int
271a0 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74  ernal state of t
271b0 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20  he pager object 
271c0 73 6f 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20  so that the .** 
271d0 74 72 75 6e 63 61 74 69 6f 6e 20 77 69 6c 6c 20  truncation will 
271e0 62 65 20 64 6f 6e 65 20 77 68 65 6e 20 74 68 65  be done when the
271f0 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
27200 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
27210 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  d..**.** This fu
27220 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63  nction is only c
27230 61 6c 6c 65 64 20 72 69 67 68 74 20 62 65 66 6f  alled right befo
27240 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20  re committing a 
27250 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
27260 4f 6e 63 65 20 74 68 69 73 20 66 75 6e 63 74 69  Once this functi
27270 6f 6e 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c  on has been call
27280 65 64 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74  ed, the transact
27290 69 6f 6e 20 6d 75 73 74 20 65 69 74 68 65 72 20  ion must either 
272a0 62 65 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63  be.** rolled bac
272b0 6b 20 6f 72 20 63 6f 6d 6d 69 74 74 65 64 2e 20  k or committed. 
272c0 49 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74  It is not safe t
272d0 6f 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63  o call this func
272e0 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 74 68 65 6e  tion and.** then
272f0 20 63 6f 6e 74 69 6e 75 65 20 77 72 69 74 69 6e   continue writin
27300 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
27310 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
27320 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49  e3PagerTruncateI
27330 6d 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67  mage(Pager *pPag
27340 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b  er, Pgno nPage){
27350 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
27360 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61 67 65  r->dbSize>=nPage
27370 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
27380 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
27390 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
273a0 4d 4f 44 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  MOD );.  pPager-
273b0 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b  >dbSize = nPage;
273c0 0a 0a 20 20 2f 2a 20 41 74 20 6f 6e 65 20 70 6f  ..  /* At one po
273d0 69 6e 74 20 74 68 65 20 63 6f 64 65 20 68 65 72  int the code her
273e0 65 20 63 61 6c 6c 65 64 20 61 73 73 65 72 74 54  e called assertT
273f0 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
27400 74 28 29 20 74 6f 0a 20 20 2a 2a 20 65 6e 73 75  t() to.  ** ensu
27410 72 65 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65  re that all page
27420 73 20 62 65 69 6e 67 20 74 72 75 6e 63 61 74 65  s being truncate
27430 64 20 61 77 61 79 20 62 79 20 74 68 69 73 20 6f  d away by this o
27440 70 65 72 61 74 69 6f 6e 20 61 72 65 2c 0a 20 20  peration are,.  
27450 2a 2a 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72  ** if one or mor
27460 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65  e savepoints are
27470 20 6f 70 65 6e 2c 20 70 72 65 73 65 6e 74 20 69   open, present i
27480 6e 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  n the savepoint 
27490 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 73 6f  .  ** journal so
274a0 20 74 68 61 74 20 74 68 65 79 20 63 61 6e 20 62   that they can b
274b0 65 20 72 65 73 74 6f 72 65 64 20 69 66 20 74 68  e restored if th
274c0 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 72  e savepoint is r
274d0 6f 6c 6c 65 64 0a 20 20 2a 2a 20 62 61 63 6b 2e  olled.  ** back.
274e0 20 54 68 69 73 20 69 73 20 6e 6f 20 6c 6f 6e 67   This is no long
274f0 65 72 20 6e 65 63 65 73 73 61 72 79 20 61 73 20  er necessary as 
27500 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
27510 20 6e 6f 77 20 6f 6e 6c 79 0a 20 20 2a 2a 20 63   now only.  ** c
27520 61 6c 6c 65 64 20 72 69 67 68 74 20 62 65 66 6f  alled right befo
27530 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20  re committing a 
27540 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 53 6f 20  transaction. So 
27550 61 6c 74 68 6f 75 67 68 20 74 68 65 20 0a 20 20  although the .  
27560 2a 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  ** Pager object 
27570 6d 61 79 20 73 74 69 6c 6c 20 68 61 76 65 20 6f  may still have o
27580 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 28  pen savepoints (
27590 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74  Pager.nSavepoint
275a0 21 3d 30 29 2c 20 0a 20 20 2a 2a 20 74 68 65 79  !=0), .  ** they
275b0 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65   cannot be rolle
275c0 64 20 62 61 63 6b 2e 20 53 6f 20 74 68 65 20 61  d back. So the a
275d0 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
275e0 73 74 72 61 69 6e 74 28 29 20 63 61 6c 6c 0a 20  straint() call. 
275f0 20 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72   ** is no longer
27600 20 63 6f 72 72 65 63 74 2e 20 2a 2f 0a 7d 0a 0a   correct. */.}..
27610 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
27620 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62  tion is called b
27630 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
27640 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
27650 6f 6c 6c 62 61 63 6b 2e 20 49 74 0a 2a 2a 20 73  ollback. It.** s
27660 79 6e 63 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c  yncs the journal
27670 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2c 20 74   file to disk, t
27680 68 65 6e 20 73 65 74 73 20 70 50 61 67 65 72 2d  hen sets pPager-
27690 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20 74  >journalHdr to t
276a0 68 65 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68  he.** size of th
276b0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73  e journal file s
276c0 6f 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  o that the pager
276d0 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74  _playback() rout
276e0 69 6e 65 20 6b 6e 6f 77 73 0a 2a 2a 20 74 68 61  ine knows.** tha
276f0 74 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75  t the entire jou
27700 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 62 65  rnal file has be
27710 65 6e 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a  en synced..**.**
27720 20 53 79 6e 63 69 6e 67 20 61 20 68 6f 74 2d 6a   Syncing a hot-j
27730 6f 75 72 6e 61 6c 20 74 6f 20 64 69 73 6b 20 62  ournal to disk b
27740 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
27750 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b   to roll it back
27760 20 65 6e 73 75 72 65 73 20 0a 2a 2a 20 74 68 61   ensures .** tha
27770 74 20 69 66 20 61 20 70 6f 77 65 72 2d 66 61 69  t if a power-fai
27780 6c 75 72 65 20 6f 63 63 75 72 73 20 64 75 72 69  lure occurs duri
27790 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2c  ng the rollback,
277a0 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
277b0 74 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 72 6f  t.** attempts ro
277c0 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67  llback following
277d0 20 73 79 73 74 65 6d 20 72 65 63 6f 76 65 72 79   system recovery
277e0 20 73 65 65 73 20 74 68 65 20 73 61 6d 65 20 6a   sees the same j
277f0 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 6e 74 65 6e  ournal.** conten
27800 74 20 61 73 20 74 68 69 73 20 70 72 6f 63 65 73  t as this proces
27810 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72  s..**.** If ever
27820 79 74 68 69 6e 67 20 67 6f 65 73 20 61 73 20 70  ything goes as p
27830 6c 61 6e 6e 65 64 2c 20 53 51 4c 49 54 45 5f 4f  lanned, SQLITE_O
27840 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  K is returned. O
27850 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 61 6e  therwise, .** an
27860 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
27870 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
27880 74 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f  t pagerSyncHotJo
27890 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
278a0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
278b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
278c0 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  ( !pPager->noSyn
278d0 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  c ){.    rc = sq
278e0 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
278f0 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f  er->jfd, SQLITE_
27900 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20  SYNC_NORMAL);.  
27910 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
27920 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
27930 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
27940 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
27950 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   &pPager->journa
27960 6c 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  lHdr);.  }.  ret
27970 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 53  urn rc;.}..#if S
27980 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
27990 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 4f 62 74 61  IZE>0./*.** Obta
279a0 69 6e 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  in a reference t
279b0 6f 20 61 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65  o a memory mappe
279c0 64 20 70 61 67 65 20 6f 62 6a 65 63 74 20 66 6f  d page object fo
279d0 72 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 67  r page number pg
279e0 6e 6f 2e 20 0a 2a 2a 20 54 68 65 20 6e 65 77 20  no. .** The new 
279f0 6f 62 6a 65 63 74 20 77 69 6c 6c 20 75 73 65 20  object will use 
27a00 74 68 65 20 70 6f 69 6e 74 65 72 20 70 44 61 74  the pointer pDat
27a10 61 2c 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  a, obtained from
27a20 20 78 46 65 74 63 68 28 29 2e 0a 2a 2a 20 49 66   xFetch()..** If
27a30 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74   successful, set
27a40 20 2a 70 70 50 61 67 65 20 74 6f 20 70 6f 69 6e   *ppPage to poin
27a50 74 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67  t to the new pag
27a60 65 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 61  e reference.** a
27a70 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
27a80 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  _OK. Otherwise, 
27a90 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65  return an SQLite
27aa0 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20   error code and 
27ab0 73 65 74 0a 2a 2a 20 2a 70 70 50 61 67 65 20 74  set.** *ppPage t
27ac0 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 50 61  o zero..**.** Pa
27ad0 67 65 20 72 65 66 65 72 65 6e 63 65 73 20 6f 62  ge references ob
27ae0 74 61 69 6e 65 64 20 62 79 20 63 61 6c 6c 69 6e  tained by callin
27af0 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  g this function 
27b00 73 68 6f 75 6c 64 20 62 65 20 72 65 6c 65 61 73  should be releas
27b10 65 64 0a 2a 2a 20 62 79 20 63 61 6c 6c 69 6e 67  ed.** by calling
27b20 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70   pagerReleaseMap
27b30 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  Page()..*/.stati
27b40 63 20 69 6e 74 20 70 61 67 65 72 41 63 71 75 69  c int pagerAcqui
27b50 72 65 4d 61 70 50 61 67 65 28 0a 20 20 50 61 67  reMapPage(.  Pag
27b60 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
27b70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27b80 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  Pager object */.
27b90 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
27ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27bb0 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
27bc0 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 44 61 74   */.  void *pDat
27bd0 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a,              
27be0 20 20 20 20 20 20 2f 2a 20 78 46 65 74 63 68 28        /* xFetch(
27bf0 29 27 64 20 64 61 74 61 20 66 6f 72 20 74 68 69  )'d data for thi
27c00 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64  s page */.  PgHd
27c10 72 20 2a 2a 70 70 50 61 67 65 20 20 20 20 20 20  r **ppPage      
27c20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
27c30 55 54 3a 20 41 63 71 75 69 72 65 64 20 70 61 67  UT: Acquired pag
27c40 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20  e object */.){. 
27c50 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20   PgHdr *p;      
27c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c70 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 70 65   /* Memory mappe
27c80 64 20 70 61 67 65 20 74 6f 20 72 65 74 75 72 6e  d page to return
27c90 20 2a 2f 0a 20 20 0a 20 20 69 66 28 20 70 50 61   */.  .  if( pPa
27ca0 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69  ger->pMmapFreeli
27cb0 73 74 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67  st ){.    *ppPag
27cc0 65 20 3d 20 70 20 3d 20 70 50 61 67 65 72 2d 3e  e = p = pPager->
27cd0 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 0a 20  pMmapFreelist;. 
27ce0 20 20 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70     pPager->pMmap
27cf0 46 72 65 65 6c 69 73 74 20 3d 20 70 2d 3e 70 44  Freelist = p->pD
27d00 69 72 74 79 3b 0a 20 20 20 20 70 2d 3e 70 44 69  irty;.    p->pDi
27d10 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 61 73 73  rty = 0;.    ass
27d20 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 45 78  ert( pPager->nEx
27d30 74 72 61 3e 3d 38 20 29 3b 0a 20 20 20 20 6d 65  tra>=8 );.    me
27d40 6d 73 65 74 28 70 2d 3e 70 45 78 74 72 61 2c 20  mset(p->pExtra, 
27d50 30 2c 20 38 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  0, 8);.  }else{.
27d60 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 20      *ppPage = p 
27d70 3d 20 28 50 67 48 64 72 20 2a 29 73 71 6c 69 74  = (PgHdr *)sqlit
27d80 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a  e3MallocZero(siz
27d90 65 6f 66 28 50 67 48 64 72 29 20 2b 20 70 50 61  eof(PgHdr) + pPa
27da0 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20  ger->nExtra);.  
27db0 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
27dc0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 66      sqlite3OsUnf
27dd0 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c  etch(pPager->fd,
27de0 20 28 69 36 34 29 28 70 67 6e 6f 2d 31 29 20 2a   (i64)(pgno-1) *
27df0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
27e00 65 2c 20 70 44 61 74 61 29 3b 0a 20 20 20 20 20  e, pData);.     
27e10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
27e20 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OMEM_BKPT;.    }
27e30 0a 20 20 20 20 70 2d 3e 70 45 78 74 72 61 20 3d  .    p->pExtra =
27e40 20 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d 3b 0a   (void *)&p[1];.
27e50 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 50      p->flags = P
27e60 47 48 44 52 5f 4d 4d 41 50 3b 0a 20 20 20 20 70  GHDR_MMAP;.    p
27e70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  ->nRef = 1;.    
27e80 70 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67  p->pPager = pPag
27e90 65 72 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  er;.  }..  asser
27ea0 74 28 20 70 2d 3e 70 45 78 74 72 61 3d 3d 28 76  t( p->pExtra==(v
27eb0 6f 69 64 20 2a 29 26 70 5b 31 5d 20 29 3b 0a 20  oid *)&p[1] );. 
27ec0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 61 67   assert( p->pPag
27ed0 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e==0 );.  assert
27ee0 28 20 70 2d 3e 66 6c 61 67 73 3d 3d 50 47 48 44  ( p->flags==PGHD
27ef0 52 5f 4d 4d 41 50 20 29 3b 0a 20 20 61 73 73 65  R_MMAP );.  asse
27f00 72 74 28 20 70 2d 3e 70 50 61 67 65 72 3d 3d 70  rt( p->pPager==p
27f10 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72  Pager );.  asser
27f20 74 28 20 70 2d 3e 6e 52 65 66 3d 3d 31 20 29 3b  t( p->nRef==1 );
27f30 0a 0a 20 20 70 2d 3e 70 67 6e 6f 20 3d 20 70 67  ..  p->pgno = pg
27f40 6e 6f 3b 0a 20 20 70 2d 3e 70 44 61 74 61 20 3d  no;.  p->pData =
27f50 20 70 44 61 74 61 3b 0a 20 20 70 50 61 67 65 72   pData;.  pPager
27f60 2d 3e 6e 4d 6d 61 70 4f 75 74 2b 2b 3b 0a 0a 20  ->nMmapOut++;.. 
27f70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
27f80 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
27f90 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 72 65 66  ** Release a ref
27fa0 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 70  erence to page p
27fb0 50 67 2e 20 70 50 67 20 6d 75 73 74 20 68 61 76  Pg. pPg must hav
27fc0 65 20 62 65 65 6e 20 72 65 74 75 72 6e 65 64 20  e been returned 
27fd0 62 79 20 61 6e 20 0a 2a 2a 20 65 61 72 6c 69 65  by an .** earlie
27fe0 72 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 41  r call to pagerA
27ff0 63 71 75 69 72 65 4d 61 70 50 61 67 65 28 29 2e  cquireMapPage().
28000 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
28010 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50  pagerReleaseMapP
28020 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
28030 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
28040 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
28050 20 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f    pPager->nMmapO
28060 75 74 2d 2d 3b 0a 20 20 70 50 67 2d 3e 70 44 69  ut--;.  pPg->pDi
28070 72 74 79 20 3d 20 70 50 61 67 65 72 2d 3e 70 4d  rty = pPager->pM
28080 6d 61 70 46 72 65 65 6c 69 73 74 3b 0a 20 20 70  mapFreelist;.  p
28090 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65  Pager->pMmapFree
280a0 6c 69 73 74 20 3d 20 70 50 67 3b 0a 0a 20 20 61  list = pPg;..  a
280b0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66  ssert( pPager->f
280c0 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69 56 65  d->pMethods->iVe
280d0 72 73 69 6f 6e 3e 3d 33 20 29 3b 0a 20 20 73 71  rsion>=3 );.  sq
280e0 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70  lite3OsUnfetch(p
280f0 50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29  Pager->fd, (i64)
28100 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 2a 70 50  (pPg->pgno-1)*pP
28110 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
28120 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 0a  pPg->pData);.}..
28130 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 50  /*.** Free all P
28140 67 48 64 72 20 6f 62 6a 65 63 74 73 20 73 74 6f  gHdr objects sto
28150 72 65 64 20 69 6e 20 74 68 65 20 50 61 67 65 72  red in the Pager
28160 2e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 6c  .pMmapFreelist l
28170 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ist..*/.static v
28180 6f 69 64 20 70 61 67 65 72 46 72 65 65 4d 61 70  oid pagerFreeMap
28190 48 64 72 73 28 50 61 67 65 72 20 2a 70 50 61 67  Hdrs(Pager *pPag
281a0 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b  er){.  PgHdr *p;
281b0 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 3b  .  PgHdr *pNext;
281c0 0a 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d  .  for(p=pPager-
281d0 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 20  >pMmapFreelist; 
281e0 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20  p; p=pNext){.   
281f0 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 44 69 72   pNext = p->pDir
28200 74 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ty;.    sqlite3_
28210 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  free(p);.  }.}..
28220 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  /* Verify that t
28230 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
28240 20 68 61 73 20 6e 6f 74 20 62 65 20 64 65 6c 65   has not be dele
28250 74 65 64 20 6f 72 20 72 65 6e 61 6d 65 64 20 6f  ted or renamed o
28260 75 74 20 66 72 6f 6d 0a 2a 2a 20 75 6e 64 65 72  ut from.** under
28270 20 74 68 65 20 70 61 67 65 72 2e 20 20 52 65 74   the pager.  Ret
28280 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
28290 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
282a0 20 73 74 69 6c 6c 20 77 68 65 72 65 20 69 74 20   still where it 
282b0 6f 75 67 68 74 0a 2a 2a 20 74 6f 20 62 65 20 6f  ought.** to be o
282c0 6e 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20  n disk.  Return 
282d0 6e 6f 6e 2d 7a 65 72 6f 20 28 53 51 4c 49 54 45  non-zero (SQLITE
282e0 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45  _READONLY_DBMOVE
282f0 44 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20  D or some other 
28300 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 66 72  error.** code fr
28310 6f 6d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65  om sqlite3OsAcce
28320 73 73 28 29 29 20 69 66 20 74 68 65 20 64 61 74  ss()) if the dat
28330 61 62 61 73 65 20 68 61 73 20 67 6f 6e 65 20 6d  abase has gone m
28340 69 73 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  issing..*/.stati
28350 63 20 69 6e 74 20 64 61 74 61 62 61 73 65 49 73  c int databaseIs
28360 55 6e 6d 6f 76 65 64 28 50 61 67 65 72 20 2a 70  Unmoved(Pager *p
28370 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 62 48  Pager){.  int bH
28380 61 73 4d 6f 76 65 64 20 3d 20 30 3b 0a 20 20 69  asMoved = 0;.  i
28390 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 50  nt rc;..  if( pP
283a0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
283b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
283c0 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  K;.  if( pPager-
283d0 3e 64 62 53 69 7a 65 3d 3d 30 20 29 20 72 65 74  >dbSize==0 ) ret
283e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
283f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
28400 3e 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 70 50  >zFilename && pP
28410 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b  ager->zFilename[
28420 30 5d 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  0] );.  rc = sql
28430 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
28440 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51  l(pPager->fd, SQ
28450 4c 49 54 45 5f 46 43 4e 54 4c 5f 48 41 53 5f 4d  LITE_FCNTL_HAS_M
28460 4f 56 45 44 2c 20 26 62 48 61 73 4d 6f 76 65 64  OVED, &bHasMoved
28470 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
28480 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a  ITE_NOTFOUND ){.
28490 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 48 41      /* If the HA
284a0 53 5f 4d 4f 56 45 44 20 66 69 6c 65 2d 63 6f 6e  S_MOVED file-con
284b0 74 72 6f 6c 20 69 73 20 75 6e 69 6d 70 6c 65 6d  trol is unimplem
284c0 65 6e 74 65 64 2c 20 61 73 73 75 6d 65 20 74 68  ented, assume th
284d0 61 74 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  at the file.    
284e0 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  ** has not been 
284f0 6d 6f 76 65 64 2e 20 20 54 68 61 74 20 69 73 20  moved.  That is 
28500 74 68 65 20 68 69 73 74 6f 72 69 63 61 6c 20 62  the historical b
28510 65 68 61 76 69 6f 72 20 6f 66 20 53 51 4c 69 74  ehavior of SQLit
28520 65 3a 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20  e: prior to.    
28530 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 38 2e 33  ** version 3.8.3
28540 2c 20 69 74 20 6e 65 76 65 72 20 63 68 65 63 6b  , it never check
28550 65 64 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53  ed */.    rc = S
28560 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
28570 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
28580 5f 4f 4b 20 26 26 20 62 48 61 73 4d 6f 76 65 64  _OK && bHasMoved
28590 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
285a0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d  ITE_READONLY_DBM
285b0 4f 56 45 44 3b 0a 20 20 7d 0a 20 20 72 65 74 75  OVED;.  }.  retu
285c0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
285d0 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61   Shutdown the pa
285e0 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65 20  ge cache.  Free 
285f0 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63  all memory and c
28600 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a  lose all files..
28610 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73  **.** If a trans
28620 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72  action was in pr
28630 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69 73  ogress when this
28640 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
28650 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e  ed, that.** tran
28660 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
28670 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74  d back.  All out
28680 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61  standing pages a
28690 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a  re invalidated.*
286a0 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f  * and their memo
286b0 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e  ry is freed.  An
286c0 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  y attempt to use
286d0 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61 74   a page associat
286e0 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20  ed.** with this 
286f0 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65 72  page cache after
28700 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
28710 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65  eturns will like
28720 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20  ly.** result in 
28730 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a  a coredump..**.*
28740 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
28750 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e  always succeeds.
28760 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
28770 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 20 61  n is active an a
28780 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64  ttempt.** is mad
28790 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  e to roll it bac
287a0 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  k. If an error o
287b0 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65  ccurs during the
287c0 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20   rollback .** a 
287d0 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  hot journal may 
287e0 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  be left in the f
287f0 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f  ilesystem but no
28800 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
28810 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c  ed.** to the cal
28820 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ler..*/.int sqli
28830 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61  te3PagerClose(Pa
28840 67 65 72 20 2a 70 50 61 67 65 72 2c 20 73 71 6c  ger *pPager, sql
28850 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 75 38 20  ite3 *db){.  u8 
28860 2a 70 54 6d 70 20 3d 20 28 75 38 2a 29 70 50 61  *pTmp = (u8*)pPa
28870 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
28880 20 20 61 73 73 65 72 74 28 20 64 62 20 7c 7c 20    assert( db || 
28890 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
288a0 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  er)==0 );.  asse
288b0 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
288c0 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
288d0 3b 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  ;.  disable_simu
288e0 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
288f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69  );.  sqlite3Begi
28900 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
28910 0a 20 20 70 61 67 65 72 46 72 65 65 4d 61 70 48  .  pagerFreeMapH
28920 64 72 73 28 70 50 61 67 65 72 29 3b 0a 20 20 2f  drs(pPager);.  /
28930 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  * pPager->errCod
28940 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  e = 0; */.  pPag
28950 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
28960 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  e = 0;.#ifndef S
28970 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
28980 20 7b 0a 20 20 20 20 75 38 20 2a 61 20 3d 20 30   {.    u8 *a = 0
28990 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
289a0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 57 61 6c   || pPager->pWal
289b0 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 64  ==0 );.    if( d
289c0 62 20 26 26 20 30 3d 3d 28 64 62 2d 3e 66 6c 61  b && 0==(db->fla
289d0 67 73 20 26 20 53 51 4c 49 54 45 5f 4e 6f 43 6b  gs & SQLITE_NoCk
289e0 70 74 4f 6e 43 6c 6f 73 65 29 20 0a 20 20 20 20  ptOnClose) .    
289f0 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 64   && SQLITE_OK==d
28a00 61 74 61 62 61 73 65 49 73 55 6e 6d 6f 76 65 64  atabaseIsUnmoved
28a10 28 70 50 61 67 65 72 29 0a 20 20 20 20 29 7b 0a  (pPager).    ){.
28a20 20 20 20 20 20 20 61 20 3d 20 70 54 6d 70 3b 0a        a = pTmp;.
28a30 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
28a40 33 57 61 6c 43 6c 6f 73 65 28 70 50 61 67 65 72  3WalClose(pPager
28a50 2d 3e 70 57 61 6c 2c 20 64 62 2c 20 70 50 61 67  ->pWal, db, pPag
28a60 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73  er->walSyncFlags
28a70 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
28a80 7a 65 2c 61 29 3b 0a 20 20 20 20 70 50 61 67 65  ze,a);.    pPage
28a90 72 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a 20 20 7d  r->pWal = 0;.  }
28aa0 0a 23 65 6e 64 69 66 0a 20 20 70 61 67 65 72 5f  .#endif.  pager_
28ab0 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
28ac0 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
28ad0 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70    pager_unlock(p
28ae0 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  Pager);.  }else{
28af0 0a 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73  .    /* If it is
28b00 20 6f 70 65 6e 2c 20 73 79 6e 63 20 74 68 65 20   open, sync the 
28b10 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66  journal file bef
28b20 6f 72 65 20 63 61 6c 6c 69 6e 67 20 55 6e 6c 6f  ore calling Unlo
28b30 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 2e 0a 20  ckAndRollback.. 
28b40 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73     ** If this is
28b50 20 6e 6f 74 20 64 6f 6e 65 2c 20 74 68 65 6e 20   not done, then 
28b60 61 6e 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74  an unsynced port
28b70 69 6f 6e 20 6f 66 20 74 68 65 20 6f 70 65 6e 20  ion of the open 
28b80 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20  journal .    ** 
28b90 66 69 6c 65 20 6d 61 79 20 62 65 20 70 6c 61 79  file may be play
28ba0 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  ed back into the
28bb0 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 61 20   database. If a 
28bc0 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63  power failure oc
28bd0 63 75 72 73 20 0a 20 20 20 20 2a 2a 20 77 68 69  curs .    ** whi
28be0 6c 65 20 74 68 69 73 20 69 73 20 68 61 70 70 65  le this is happe
28bf0 6e 69 6e 67 2c 20 74 68 65 20 64 61 74 61 62 61  ning, the databa
28c00 73 65 20 63 6f 75 6c 64 20 62 65 63 6f 6d 65 20  se could become 
28c10 63 6f 72 72 75 70 74 2e 0a 20 20 20 20 2a 2a 0a  corrupt..    **.
28c20 20 20 20 20 2a 2a 20 49 66 20 61 6e 20 65 72 72      ** If an err
28c30 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
28c40 74 72 79 69 6e 67 20 74 6f 20 73 79 6e 63 20 74  trying to sync t
28c50 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 68 69 66  he journal, shif
28c60 74 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20  t the pager.    
28c70 2a 2a 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ** into the ERRO
28c80 52 20 73 74 61 74 65 2e 20 54 68 69 73 20 63 61  R state. This ca
28c90 75 73 65 73 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f  uses UnlockAndRo
28ca0 6c 6c 62 61 63 6b 20 74 6f 20 75 6e 6c 6f 63 6b  llback to unlock
28cb0 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
28cc0 62 61 73 65 20 61 6e 64 20 63 6c 6f 73 65 20 74  base and close t
28cd0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
28ce0 77 69 74 68 6f 75 74 20 61 74 74 65 6d 70 74 69  without attempti
28cf0 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 0a 20 20  ng to roll it.  
28d00 20 20 2a 2a 20 62 61 63 6b 20 6f 72 20 66 69 6e    ** back or fin
28d10 61 6c 69 7a 65 20 69 74 2e 20 54 68 65 20 6e 65  alize it. The ne
28d20 78 74 20 64 61 74 61 62 61 73 65 20 75 73 65 72  xt database user
28d30 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 64 6f   will have to do
28d40 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20   hot-journal.   
28d50 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 62 65 66   ** rollback bef
28d60 6f 72 65 20 61 63 63 65 73 73 69 6e 67 20 74 68  ore accessing th
28d70 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
28d80 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
28d90 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
28da0 66 64 29 20 29 7b 0a 23 69 66 20 30 0a 20 20 20  fd) ){.#if 0.   
28db0 20 20 20 69 66 28 20 70 61 67 65 72 49 73 53 65     if( pagerIsSe
28dc0 72 76 65 72 28 70 50 61 67 65 72 29 20 29 7b 0a  rver(pPager) ){.
28dd0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
28de0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
28df0 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
28e00 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 29  ALMODE_PERSIST )
28e10 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
28e20 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20  ->journalMode = 
28e30 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
28e40 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 20 20  E_DELETE;.      
28e50 20 20 2f 2a 20 49 66 20 6e 65 63 65 73 73 61 72    /* If necessar
28e60 79 2c 20 63 68 61 6e 67 65 20 74 68 65 20 70 61  y, change the pa
28e70 67 65 72 20 73 74 61 74 65 20 73 6f 20 74 68 61  ger state so tha
28e80 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  t the journal fi
28e90 6c 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  le .        ** i
28ea0 73 20 64 65 6c 65 74 65 64 20 62 79 20 74 68 65  s deleted by the
28eb0 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 55 6e   call to pagerUn
28ec0 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
28ed0 29 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20  ) below.  */.   
28ee0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
28ef0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
28f00 50 45 4e 20 29 20 70 50 61 67 65 72 2d 3e 65 53  PEN ) pPager->eS
28f10 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41  tate = PAGER_REA
28f20 44 45 52 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  DER;.      }.#en
28f30 64 69 66 0a 20 20 20 20 20 20 70 61 67 65 72 5f  dif.      pager_
28f40 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 70 61  error(pPager, pa
28f50 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61  gerSyncHotJourna
28f60 6c 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  l(pPager));.    
28f70 7d 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63  }.    pagerUnloc
28f80 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61  kAndRollback(pPa
28f90 67 65 72 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66  ger);.  }.#ifdef
28fa0 20 53 51 4c 49 54 45 5f 53 45 52 56 45 52 5f 45   SQLITE_SERVER_E
28fb0 44 49 54 49 4f 4e 0a 20 20 69 66 28 20 70 61 67  DITION.  if( pag
28fc0 65 72 49 73 53 65 72 76 65 72 28 70 50 61 67 65  erIsServer(pPage
28fd0 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  r) ){.    sqlite
28fe0 33 53 65 72 76 65 72 44 69 73 63 6f 6e 6e 65 63  3ServerDisconnec
28ff0 74 28 70 50 61 67 65 72 2d 3e 70 53 65 72 76 65  t(pPager->pServe
29000 72 2c 20 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  r, pPager->fd);.
29010 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 65 72      pPager->pSer
29020 76 65 72 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ver = 0;.  }else
29030 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
29040 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
29050 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
29060 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
29070 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e 61 62  Malloc();.  enab
29080 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
29090 65 72 72 6f 72 73 28 29 3b 0a 20 20 50 41 47 45  errors();.  PAGE
290a0 52 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25  RTRACE(("CLOSE %
290b0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
290c0 61 67 65 72 29 29 29 3b 0a 20 20 49 4f 54 52 41  ager)));.  IOTRA
290d0 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22  CE(("CLOSE %p\n"
290e0 2c 20 70 50 61 67 65 72 29 29 3b 0a 20 20 73 71  , pPager));.  sq
290f0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
29100 67 65 72 2d 3e 66 64 29 3b 0a 20 20 73 71 6c 69  ger->fd);.  sqli
29110 74 65 33 50 61 67 65 46 72 65 65 28 70 54 6d 70  te3PageFree(pTmp
29120 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  );.  sqlite3Pcac
29130 68 65 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  heClose(pPager->
29140 70 50 43 61 63 68 65 29 3b 0a 0a 23 69 66 64 65  pPCache);..#ifde
29150 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
29160 45 43 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  EC.  if( pPager-
29170 3e 78 43 6f 64 65 63 46 72 65 65 20 29 20 70 50  >xCodecFree ) pP
29180 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65  ager->xCodecFree
29190 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 29  (pPager->pCodec)
291a0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
291b0 72 74 28 20 21 70 50 61 67 65 72 2d 3e 61 53 61  rt( !pPager->aSa
291c0 76 65 70 6f 69 6e 74 20 26 26 20 21 70 50 61 67  vepoint && !pPag
291d0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29  er->pInJournal )
291e0 3b 0a 20 20 61 73 73 65 72 74 28 20 21 69 73 4f  ;.  assert( !isO
291f0 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
29200 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  ) );..  sqlite3_
29210 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20  free(pPager);.  
29220 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
29230 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  ;.}..#if !define
29240 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64 65 66  d(NDEBUG) || def
29250 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
29260 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  )./*.** Return t
29270 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66  he page number f
29280 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a  or page pPg..*/.
29290 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61 67 65  Pgno sqlite3Page
292a0 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62 50 61  rPagenumber(DbPa
292b0 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75  ge *pPg){.  retu
292c0 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a  rn pPg->pgno;.}.
292d0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
292e0 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
292f0 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
29300 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 76 6f 69  page pPg..*/.voi
29310 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  d sqlite3PagerRe
29320 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  f(DbPage *pPg){.
29330 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52    sqlite3PcacheR
29340 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ef(pPg);.}../*.*
29350 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  * Sync the journ
29360 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  al. In other wor
29370 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c  ds, make sure al
29380 6c 20 74 68 65 20 70 61 67 65 73 20 74 68 61 74  l the pages that
29390 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72   have.** been wr
293a0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
293b0 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c  rnal have actual
293c0 6c 79 20 72 65 61 63 68 65 64 20 74 68 65 20 73  ly reached the s
293d0 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a  urface of the.**
293e0 20 64 69 73 6b 20 61 6e 64 20 63 61 6e 20 62 65   disk and can be
293f0 20 72 65 73 74 6f 72 65 64 20 69 6e 20 74 68 65   restored in the
29400 20 65 76 65 6e 74 20 6f 66 20 61 20 68 6f 74 2d   event of a hot-
29410 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
29420 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50  ..**.** If the P
29430 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66 6c 61 67  ager.noSync flag
29440 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68   is set, then th
29450 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
29460 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 68 65 72   no-op..** Other
29470 77 69 73 65 2c 20 74 68 65 20 61 63 74 69 6f 6e  wise, the action
29480 73 20 72 65 71 75 69 72 65 64 20 64 65 70 65 6e  s required depen
29490 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d on the journal
294a0 2d 6d 6f 64 65 20 61 6e 64 20 74 68 65 20 0a 2a  -mode and the .*
294b0 2a 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74  * device charact
294c0 65 72 69 73 74 69 63 73 20 6f 66 20 74 68 65 20  eristics of the 
294d0 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 61 73 20  file-system, as 
294e0 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
294f0 20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61   * If the journa
29500 6c 20 66 69 6c 65 20 69 73 20 61 6e 20 69 6e 2d  l file is an in-
29510 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66  memory journal f
29520 69 6c 65 2c 20 6e 6f 20 61 63 74 69 6f 6e 20 6e  ile, no action n
29530 65 65 64 0a 2a 2a 20 20 20 20 20 62 65 20 74 61  eed.**     be ta
29540 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4f  ken..**.**   * O
29550 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
29560 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74   device does not
29570 20 73 75 70 70 6f 72 74 20 74 68 65 20 53 41 46   support the SAF
29580 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74  E_APPEND propert
29590 79 2c 0a 2a 2a 20 20 20 20 20 74 68 65 6e 20 74  y,.**     then t
295a0 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 6f 66  he nRec field of
295b0 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
295c0 6c 79 20 77 72 69 74 74 65 6e 20 6a 6f 75 72 6e  ly written journ
295d0 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20  al header.**    
295e0 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 63   is updated to c
295f0 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65  ontain the numbe
29600 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 72 65 63  r of journal rec
29610 6f 72 64 73 20 74 68 61 74 20 68 61 76 65 0a 2a  ords that have.*
29620 2a 20 20 20 20 20 62 65 65 6e 20 77 72 69 74 74  *     been writt
29630 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e  en following it.
29640 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
29650 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 66 75   operating in fu
29660 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20 20 20 6d  ll-sync.**     m
29670 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  ode, then the jo
29680 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79  urnal file is sy
29690 6e 63 65 64 20 62 65 66 6f 72 65 20 74 68 69 73  nced before this
296a0 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65   field is update
296b0 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20  d..**.**   * If 
296c0 74 68 65 20 64 65 76 69 63 65 20 64 6f 65 73 20  the device does 
296d0 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65 20  not support the 
296e0 53 45 51 55 45 4e 54 49 41 4c 20 70 72 6f 70 65  SEQUENTIAL prope
296f0 72 74 79 2c 20 74 68 65 6e 20 0a 2a 2a 20 20 20  rty, then .**   
29700 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69    journal file i
29710 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20  s synced..**.** 
29720 4f 72 2c 20 69 6e 20 70 73 65 75 64 6f 2d 63 6f  Or, in pseudo-co
29730 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20  de:.**.**   if( 
29740 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79 20 6a  NOT <in-memory j
29750 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20 20 20  ournal> ){.**   
29760 20 20 69 66 28 20 4e 4f 54 20 53 41 46 45 5f 41    if( NOT SAFE_A
29770 50 50 45 4e 44 20 29 7b 0a 2a 2a 20 20 20 20 20  PPEND ){.**     
29780 20 20 69 66 28 20 3c 66 75 6c 6c 2d 73 79 6e 63    if( <full-sync
29790 20 6d 6f 64 65 3e 20 29 20 78 53 79 6e 63 28 3c   mode> ) xSync(<
297a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a  journal file>);.
297b0 2a 2a 20 20 20 20 20 20 20 3c 75 70 64 61 74 65  **       <update
297c0 20 6e 52 65 63 20 66 69 65 6c 64 3e 0a 2a 2a 20   nRec field>.** 
297d0 20 20 20 20 7d 20 0a 2a 2a 20 20 20 20 20 69 66      } .**     if
297e0 28 20 4e 4f 54 20 53 45 51 55 45 4e 54 49 41 4c  ( NOT SEQUENTIAL
297f0 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61   ) xSync(<journa
29800 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 7d  l file>);.**   }
29810 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
29820 73 66 75 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  sful, this routi
29830 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20 50 47  ne clears the PG
29840 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
29850 61 67 20 6f 66 20 65 76 65 72 79 20 0a 2a 2a 20  ag of every .** 
29860 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 68  page currently h
29870 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 20 62 65  eld in memory be
29880 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 53  fore returning S
29890 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20  QLITE_OK. If an 
298a0 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 69 73 20 65  IO.** error is e
298b0 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e  ncountered, then
298c0 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
298d0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  de is returned t
298e0 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f  o the caller..*/
298f0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63  .static int sync
29900 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
29910 50 61 67 65 72 2c 20 69 6e 74 20 6e 65 77 48 64  Pager, int newHd
29920 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
29930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29940 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
29950 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  code */..  asser
29960 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
29970 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
29980 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20  CACHEMOD.       
29990 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
299a0 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
299b0 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73  DBMOD.  );.  ass
299c0 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
299d0 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
299e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 61  );.  assert( !pa
299f0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
29a00 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ) );..  rc = sql
29a10 69 74 65 33 50 61 67 65 72 45 78 63 6c 75 73 69  ite3PagerExclusi
29a20 76 65 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  veLock(pPager);.
29a30 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
29a40 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
29a50 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ..  if( !pPager-
29a60 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 61  >noSync ){.    a
29a70 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
29a80 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20  tempFile );.    
29a90 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
29aa0 72 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65  r->jfd) && pPage
29ab0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
29ac0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
29ad0 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20  E_MEMORY ){.    
29ae0 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 63 20    const int iDc 
29af0 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  = sqlite3OsDevic
29b00 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
29b10 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
29b20 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
29b30 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
29b40 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d  );..      if( 0=
29b50 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43  =(iDc&SQLITE_IOC
29b60 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20  AP_SAFE_APPEND) 
29b70 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
29b80 69 73 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77  is block deals w
29b90 69 74 68 20 61 6e 20 6f 62 73 63 75 72 65 20 70  ith an obscure p
29ba0 72 6f 62 6c 65 6d 2e 20 49 66 20 74 68 65 20 6c  roblem. If the l
29bb0 61 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20  ast connection. 
29bc0 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77         ** that w
29bd0 72 6f 74 65 20 74 6f 20 74 68 69 73 20 64 61 74  rote to this dat
29be0 61 62 61 73 65 20 77 61 73 20 6f 70 65 72 61 74  abase was operat
29bf0 69 6e 67 20 69 6e 20 70 65 72 73 69 73 74 65 6e  ing in persisten
29c00 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  t-journal.      
29c10 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20    ** mode, then 
29c20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
29c30 20 6d 61 79 20 61 74 20 74 68 69 73 20 70 6f 69   may at this poi
29c40 6e 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20 6c  nt actually be l
29c50 61 72 67 65 72 0a 20 20 20 20 20 20 20 20 2a 2a  arger.        **
29c60 20 74 68 61 6e 20 50 61 67 65 72 2e 6a 6f 75 72   than Pager.jour
29c70 6e 61 6c 4f 66 66 20 62 79 74 65 73 2e 20 49 66  nalOff bytes. If
29c80 20 74 68 65 20 6e 65 78 74 20 74 68 69 6e 67 20   the next thing 
29c90 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  in the journal. 
29ca0 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 68         ** file h
29cb0 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20 6a  appens to be a j
29cc0 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 28 77  ournal-header (w
29cd0 72 69 74 74 65 6e 20 61 73 20 70 61 72 74 20 6f  ritten as part o
29ce0 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  f the.        **
29cf0 20 70 72 65 76 69 6f 75 73 20 63 6f 6e 6e 65 63   previous connec
29d00 74 69 6f 6e 27 73 20 74 72 61 6e 73 61 63 74 69  tion's transacti
29d10 6f 6e 29 2c 20 61 6e 64 20 61 20 63 72 61 73 68  on), and a crash
29d20 20 6f 72 20 70 6f 77 65 72 2d 66 61 69 6c 75 72   or power-failur
29d30 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 63  e .        ** oc
29d40 63 75 72 73 20 61 66 74 65 72 20 6e 52 65 63 20  curs after nRec 
29d50 69 73 20 75 70 64 61 74 65 64 20 62 75 74 20 62  is updated but b
29d60 65 66 6f 72 65 20 74 68 69 73 20 63 6f 6e 6e 65  efore this conne
29d70 63 74 69 6f 6e 20 77 72 69 74 65 73 20 0a 20 20  ction writes .  
29d80 20 20 20 20 20 20 2a 2a 20 61 6e 79 74 68 69 6e        ** anythin
29d90 67 20 65 6c 73 65 20 74 6f 20 74 68 65 20 6a 6f  g else to the jo
29da0 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20 63  urnal file (or c
29db0 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20 62 61 63  ommits/rolls bac
29dc0 6b 20 69 74 73 20 0a 20 20 20 20 20 20 20 20 2a  k its .        *
29dd0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20  * transaction), 
29de0 74 68 65 6e 20 53 51 4c 69 74 65 20 6d 61 79 20  then SQLite may 
29df0 62 65 63 6f 6d 65 20 63 6f 6e 66 75 73 65 64 20  become confused 
29e00 77 68 65 6e 20 64 6f 69 6e 67 20 74 68 65 20 0a  when doing the .
29e10 20 20 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a          ** hot-j
29e20 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20  ournal rollback 
29e30 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 63 6f 76 65  following recove
29e40 72 79 2e 20 49 74 20 6d 61 79 20 72 6f 6c 6c 20  ry. It may roll 
29e50 62 61 63 6b 20 61 6c 6c 0a 20 20 20 20 20 20 20  back all.       
29e60 20 2a 2a 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e   ** of this conn
29e70 65 63 74 69 6f 6e 73 20 64 61 74 61 2c 20 74 68  ections data, th
29e80 65 6e 20 70 72 6f 63 65 65 64 20 74 6f 20 72 6f  en proceed to ro
29e90 6c 6c 69 6e 67 20 62 61 63 6b 20 74 68 65 20 6f  lling back the o
29ea0 6c 64 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  ld,.        ** o
29eb0 75 74 2d 6f 66 2d 64 61 74 65 20 64 61 74 61 20  ut-of-date data 
29ec0 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69 74 2e  that follows it.
29ed0 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   Database corrup
29ee0 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a  tion..        **
29ef0 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 6f 20 77  .        ** To w
29f00 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 2c  ork around this,
29f10 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   if the journal 
29f20 66 69 6c 65 20 64 6f 65 73 20 61 70 70 65 61 72  file does appear
29f30 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20   to contain.    
29f40 20 20 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 68      ** a valid h
29f50 65 61 64 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20  eader following 
29f60 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66  Pager.journalOff
29f70 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 30  , then write a 0
29f80 78 30 30 0a 20 20 20 20 20 20 20 20 2a 2a 20 62  x00.        ** b
29f90 79 74 65 20 74 6f 20 74 68 65 20 73 74 61 72 74  yte to the start
29fa0 20 6f 66 20 69 74 20 74 6f 20 70 72 65 76 65 6e   of it to preven
29fb0 74 20 69 74 20 66 72 6f 6d 20 62 65 69 6e 67 20  t it from being 
29fc0 72 65 63 6f 67 6e 69 7a 65 64 2e 0a 20 20 20 20  recognized..    
29fd0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
29fe0 2a 20 56 61 72 69 61 62 6c 65 20 69 4e 65 78 74  * Variable iNext
29ff0 48 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74  HdrOffset is set
2a000 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 61   to the offset a
2a010 74 20 77 68 69 63 68 20 74 68 69 73 0a 20 20 20  t which this.   
2a020 20 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 61       ** problema
2a030 74 69 63 20 68 65 61 64 65 72 20 77 69 6c 6c 20  tic header will 
2a040 6f 63 63 75 72 2c 20 69 66 20 69 74 20 65 78 69  occur, if it exi
2a050 73 74 73 2e 20 61 4d 61 67 69 63 20 69 73 20 75  sts. aMagic is u
2a060 73 65 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  sed .        ** 
2a070 61 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 62  as a temporary b
2a080 75 66 66 65 72 20 74 6f 20 69 6e 73 70 65 63 74  uffer to inspect
2a090 20 74 68 65 20 66 69 72 73 74 20 63 6f 75 70 6c   the first coupl
2a0a0 65 20 6f 66 20 62 79 74 65 73 20 6f 66 0a 20 20  e of bytes of.  
2a0b0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6f 74        ** the pot
2a0c0 65 6e 74 69 61 6c 20 6a 6f 75 72 6e 61 6c 20 68  ential journal h
2a0d0 65 61 64 65 72 2e 0a 20 20 20 20 20 20 20 20 2a  eader..        *
2a0e0 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 4e  /.        i64 iN
2a0f0 65 78 74 48 64 72 4f 66 66 73 65 74 3b 0a 20 20  extHdrOffset;.  
2a100 20 20 20 20 20 20 75 38 20 61 4d 61 67 69 63 5b        u8 aMagic[
2a110 38 5d 3b 0a 20 20 20 20 20 20 20 20 75 38 20 7a  8];.        u8 z
2a120 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
2a130 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 3b  ournalMagic)+4];
2a140 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ..        memcpy
2a150 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e  (zHeader, aJourn
2a160 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
2a170 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b  aJournalMagic));
2a180 0a 20 20 20 20 20 20 20 20 70 75 74 33 32 62 69  .        put32bi
2a190 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
2a1a0 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
2a1b0 29 5d 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  )], pPager->nRec
2a1c0 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 4e 65 78  );..        iNex
2a1d0 74 48 64 72 4f 66 66 73 65 74 20 3d 20 6a 6f 75  tHdrOffset = jou
2a1e0 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50  rnalHdrOffset(pP
2a1f0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 72  ager);.        r
2a200 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
2a210 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  d(pPager->jfd, a
2a220 4d 61 67 69 63 2c 20 38 2c 20 69 4e 65 78 74 48  Magic, 8, iNextH
2a230 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20  drOffset);.     
2a240 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2a250 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65 6d 63 6d  E_OK && 0==memcm
2a260 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e  p(aMagic, aJourn
2a270 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 7b 0a 20  alMagic, 8) ){. 
2a280 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20           static 
2a290 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f 62 79 74  const u8 zerobyt
2a2a0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
2a2b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
2a2c0 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
2a2d0 2c 20 26 7a 65 72 6f 62 79 74 65 2c 20 31 2c 20  , &zerobyte, 1, 
2a2e0 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b  iNextHdrOffset);
2a2f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2a300 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2a310 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49  E_OK && rc!=SQLI
2a320 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
2a330 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  EAD ){.         
2a340 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2a350 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
2a360 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63  * Write the nRec
2a370 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20   value into the 
2a380 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61  journal file hea
2a390 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20  der. If in.     
2a3a0 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68     ** full-synch
2a3b0 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e  ronous mode, syn
2a3c0 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
2a3d0 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65  rst. This ensure
2a3e0 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  s that.        *
2a3f0 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72  * all data has r
2a400 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69  eally hit the di
2a410 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69  sk before nRec i
2a420 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72  s updated to mar
2a430 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20  k.        ** it 
2a440 61 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66  as a candidate f
2a450 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20  or rollback..   
2a460 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2a470 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72  ** This is not r
2a480 65 71 75 69 72 65 64 20 69 66 20 74 68 65 20 70  equired if the p
2a490 65 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20  ersistent media 
2a4a0 73 75 70 70 6f 72 74 73 20 74 68 65 0a 20 20 20  supports the.   
2a4b0 20 20 20 20 20 2a 2a 20 53 41 46 45 5f 41 50 50       ** SAFE_APP
2a4c0 45 4e 44 20 70 72 6f 70 65 72 74 79 2e 20 42 65  END property. Be
2a4d0 63 61 75 73 65 20 69 6e 20 74 68 69 73 20 63 61  cause in this ca
2a4e0 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  se it is not pos
2a4f0 73 69 62 6c 65 20 0a 20 20 20 20 20 20 20 20 2a  sible .        *
2a500 2a 20 66 6f 72 20 67 61 72 62 61 67 65 20 64 61  * for garbage da
2a510 74 61 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65  ta to be appende
2a520 64 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 20 74  d to the file, t
2a530 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 20 20  he nRec field.  
2a540 20 20 20 20 20 20 2a 2a 20 69 73 20 70 6f 70 75        ** is popu
2a550 6c 61 74 65 64 20 77 69 74 68 20 30 78 46 46 46  lated with 0xFFF
2a560 46 46 46 46 46 20 77 68 65 6e 20 74 68 65 20 6a  FFFFF when the j
2a570 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
2a580 20 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20 20   written.       
2a590 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e 65   ** and never ne
2a5a0 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65  eds to be update
2a5b0 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  d..        */.  
2a5c0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
2a5d0 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d  ->fullSync && 0=
2a5e0 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43  =(iDc&SQLITE_IOC
2a5f0 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29  AP_SEQUENTIAL) )
2a600 7b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45  {.          PAGE
2a610 52 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f  RTRACE(("SYNC jo
2a620 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20  urnal of %d\n", 
2a630 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
2a640 29 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54  );.          IOT
2a650 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c  RACE(("JSYNC %p\
2a660 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
2a670 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2a680 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
2a690 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  ->jfd, pPager->s
2a6a0 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 20  yncFlags);.     
2a6b0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2a6c0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
2a6d0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
2a6e0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
2a6f0 4a 48 44 52 20 25 70 20 25 6c 6c 64 5c 6e 22 2c  JHDR %p %lld\n",
2a700 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d   pPager, pPager-
2a710 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 29 3b 0a 20  >journalHdr));. 
2a720 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2a730 74 65 33 4f 73 57 72 69 74 65 28 0a 20 20 20 20  te3OsWrite(.    
2a740 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
2a750 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 73 69  jfd, zHeader, si
2a760 7a 65 6f 66 28 7a 48 65 61 64 65 72 29 2c 20 70  zeof(zHeader), p
2a770 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
2a780 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  r.        );.   
2a790 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2a7a0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
2a7b0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
2a7c0 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51    if( 0==(iDc&SQ
2a7d0 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
2a7e0 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20  NTIAL) ){.      
2a7f0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
2a800 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25  YNC journal of %
2a810 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
2a820 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20  ager)));.       
2a830 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43   IOTRACE(("JSYNC
2a840 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
2a850 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
2a860 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
2a870 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
2a880 3e 73 79 6e 63 46 6c 61 67 73 7c 20 0a 20 20 20  >syncFlags| .   
2a890 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
2a8a0 73 79 6e 63 46 6c 61 67 73 3d 3d 53 51 4c 49 54  syncFlags==SQLIT
2a8b0 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49  E_SYNC_FULL?SQLI
2a8c0 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59  TE_SYNC_DATAONLY
2a8d0 3a 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  :0).        );. 
2a8e0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
2a8f0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
2a900 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  n rc;.      }.. 
2a910 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
2a920 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72  rnalHdr = pPager
2a930 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
2a940 20 20 20 20 69 66 28 20 6e 65 77 48 64 72 20 26      if( newHdr &
2a950 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  & 0==(iDc&SQLITE
2a960 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
2a970 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ND) ){.        p
2a980 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
2a990 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72  .        rc = wr
2a9a0 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  iteJournalHdr(pP
2a9b0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69  ager);.        i
2a9c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2a9d0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2a9e0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
2a9f0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
2aa00 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67  ournalHdr = pPag
2aa10 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
2aa20 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
2aa30 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65 72  Unless the pager
2aa40 20 69 73 20 69 6e 20 6e 6f 53 79 6e 63 20 6d 6f   is in noSync mo
2aa50 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  de, the journal 
2aa60 66 69 6c 65 20 77 61 73 20 6a 75 73 74 20 0a 20  file was just . 
2aa70 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79   ** successfully
2aa80 20 73 79 6e 63 65 64 2e 20 45 69 74 68 65 72 20   synced. Either 
2aa90 77 61 79 2c 20 63 6c 65 61 72 20 74 68 65 20 50  way, clear the P
2aaa0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
2aab0 6c 61 67 20 6f 6e 20 0a 20 20 2a 2a 20 61 6c 6c  lag on .  ** all
2aac0 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 73   pages..  */.  s
2aad0 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61  qlite3PcacheClea
2aae0 72 53 79 6e 63 46 6c 61 67 73 28 70 50 61 67 65  rSyncFlags(pPage
2aaf0 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 70  r->pPCache);.  p
2ab00 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
2ab10 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
2ab20 4f 44 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73  OD;.  assert( as
2ab30 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
2ab40 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65  (pPager) );.  re
2ab50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2ab60 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67  }../*.** The arg
2ab70 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 72  ument is the fir
2ab80 73 74 20 69 6e 20 61 20 6c 69 6e 6b 65 64 20 6c  st in a linked l
2ab90 69 73 74 20 6f 66 20 64 69 72 74 79 20 70 61 67  ist of dirty pag
2aba0 65 73 20 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20  es connected.** 
2abb0 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44 69  by the PgHdr.pDi
2abc0 72 74 79 20 70 6f 69 6e 74 65 72 2e 20 54 68 69  rty pointer. Thi
2abd0 73 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65  s function write
2abe0 73 20 65 61 63 68 20 6f 6e 65 20 6f 66 20 74 68  s each one of th
2abf0 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  e.** in-memory p
2ac00 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74  ages in the list
2ac10 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
2ac20 20 66 69 6c 65 2e 20 54 68 65 20 61 72 67 75 6d   file. The argum
2ac30 65 6e 74 20 6d 61 79 0a 2a 2a 20 62 65 20 4e 55  ent may.** be NU
2ac40 4c 4c 2c 20 72 65 70 72 65 73 65 6e 74 69 6e 67  LL, representing
2ac50 20 61 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e 20   an empty list. 
2ac60 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 69  In this case thi
2ac70 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a  s function is.**
2ac80 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
2ac90 54 68 65 20 70 61 67 65 72 20 6d 75 73 74 20 68  The pager must h
2aca0 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 61 20 52  old at least a R
2acb0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 77 68 65  ESERVED lock whe
2acc0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  n this function.
2acd0 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 42 65  ** is called. Be
2ace0 66 6f 72 65 20 77 72 69 74 69 6e 67 20 61 6e 79  fore writing any
2acf0 74 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  thing to the dat
2ad00 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73  abase file, this
2ad10 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75 70 67 72   lock.** is upgr
2ad20 61 64 65 64 20 74 6f 20 61 6e 20 45 58 43 4c 55  aded to an EXCLU
2ad30 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 74 68  SIVE lock. If th
2ad40 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65  e lock cannot be
2ad50 20 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a 20 53 51   obtained,.** SQ
2ad60 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
2ad70 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20 64 61 74  urned and no dat
2ad80 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  a is written to 
2ad90 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2ada0 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65  e..** .** If the
2adb0 20 70 61 67 65 72 20 69 73 20 61 20 74 65 6d 70   pager is a temp
2adc0 2d 66 69 6c 65 20 70 61 67 65 72 20 61 6e 64 20  -file pager and 
2add0 74 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 2d  the actual file-
2ade0 73 79 73 74 65 6d 20 66 69 6c 65 0a 2a 2a 20 69  system file.** i
2adf0 73 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 2c 20  s not yet open, 
2ae00 69 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e  it is created an
2ae10 64 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20  d opened before 
2ae20 61 6e 79 20 64 61 74 61 20 69 73 20 0a 2a 2a 20  any data is .** 
2ae30 77 72 69 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a 0a  written out..**.
2ae40 2a 2a 20 4f 6e 63 65 20 74 68 65 20 6c 6f 63 6b  ** Once the lock
2ae50 20 68 61 73 20 62 65 65 6e 20 75 70 67 72 61 64   has been upgrad
2ae60 65 64 20 61 6e 64 2c 20 69 66 20 6e 65 63 65 73  ed and, if neces
2ae70 73 61 72 79 2c 20 74 68 65 20 66 69 6c 65 20 6f  sary, the file o
2ae80 70 65 6e 65 64 2c 0a 2a 2a 20 74 68 65 20 70 61  pened,.** the pa
2ae90 67 65 73 20 61 72 65 20 77 72 69 74 74 65 6e 20  ges are written 
2aea0 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
2aeb0 61 73 65 20 66 69 6c 65 20 69 6e 20 6c 69 73 74  ase file in list
2aec0 20 6f 72 64 65 72 2e 20 57 72 69 74 69 6e 67 0a   order. Writing.
2aed0 2a 2a 20 61 20 70 61 67 65 20 69 73 20 73 6b 69  ** a page is ski
2aee0 70 70 65 64 20 69 66 20 69 74 20 6d 65 65 74 73  pped if it meets
2aef0 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 66   either of the f
2af00 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69  ollowing criteri
2af10 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65  a:.**.**   * The
2af20 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
2af30 67 72 65 61 74 65 72 20 74 68 61 6e 20 50 61 67  greater than Pag
2af40 65 72 2e 64 62 53 69 7a 65 2c 20 6f 72 0a 2a 2a  er.dbSize, or.**
2af50 20 20 20 2a 20 54 68 65 20 50 47 48 44 52 5f 44     * The PGHDR_D
2af60 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 20 69  ONT_WRITE flag i
2af70 73 20 73 65 74 20 6f 6e 20 74 68 65 20 70 61 67  s set on the pag
2af80 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 69 74  e..**.** If writ
2af90 69 6e 67 20 6f 75 74 20 61 20 70 61 67 65 20 63  ing out a page c
2afa0 61 75 73 65 73 20 74 68 65 20 64 61 74 61 62 61  auses the databa
2afb0 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c  se file to grow,
2afc0 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a   Pager.dbFileSiz
2afd0 65 0a 2a 2a 20 69 73 20 75 70 64 61 74 65 64 20  e.** is updated 
2afe0 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20  accordingly. If 
2aff0 70 61 67 65 20 31 20 69 73 20 77 72 69 74 74 65  page 1 is writte
2b000 6e 20 6f 75 74 2c 20 74 68 65 6e 20 74 68 65 20  n out, then the 
2b010 76 61 6c 75 65 20 63 61 63 68 65 64 0a 2a 2a 20  value cached.** 
2b020 69 6e 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  in Pager.dbFileV
2b030 65 72 73 5b 5d 20 69 73 20 75 70 64 61 74 65 64  ers[] is updated
2b040 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 6e 65   to match the ne
2b050 77 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  w value stored i
2b060 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
2b070 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e file..**.** If
2b080 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73   everything is s
2b090 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
2b0a0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
2b0b0 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
2b0c0 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 61 6e 20   .** occurs, an 
2b0d0 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
2b0e0 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69   returned. Or, i
2b0f0 66 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20  f the EXCLUSIVE 
2b100 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20 62  lock cannot.** b
2b110 65 20 6f 62 74 61 69 6e 65 64 2c 20 53 51 4c 49  e obtained, SQLI
2b120 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72  TE_BUSY is retur
2b130 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
2b140 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70  nt pager_write_p
2b150 61 67 65 6c 69 73 74 28 50 61 67 65 72 20 2a 70  agelist(Pager *p
2b160 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70 4c  Pager, PgHdr *pL
2b170 69 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ist){.  int rc =
2b180 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
2b190 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b1a0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
2b1b0 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69    /* This functi
2b1c0 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  on is only calle
2b1d0 64 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 70  d for rollback p
2b1e0 61 67 65 72 73 20 69 6e 20 57 52 49 54 45 52 5f  agers in WRITER_
2b1f0 44 42 4d 4f 44 20 73 74 61 74 65 2e 20 2a 2f 0a  DBMOD state. */.
2b200 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
2b210 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
2b220 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2b230 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c 20  er->tempFile || 
2b240 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
2b250 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
2b260 4f 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OD );.  assert( 
2b270 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45  pPager->eLock==E
2b280 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
2b290 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
2b2a0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
2b2b0 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3d 3d   pList->pDirty==
2b2c0 30 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  0 );..#ifdef SQL
2b2d0 49 54 45 5f 53 45 52 56 45 52 5f 45 44 49 54 49  ITE_SERVER_EDITI
2b2e0 4f 4e 0a 20 20 69 66 28 20 70 61 67 65 72 49 73  ON.  if( pagerIs
2b2f0 50 72 6f 63 65 73 73 53 65 72 76 65 72 28 70 50  ProcessServer(pP
2b300 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 63 20  ager) ){.    rc 
2b310 3d 20 73 71 6c 69 74 65 33 53 65 72 76 65 72 50  = sqlite3ServerP
2b320 72 65 43 6f 6d 6d 69 74 28 70 50 61 67 65 72 2d  reCommit(pPager-
2b330 3e 70 53 65 72 76 65 72 2c 20 70 50 61 67 65 72  >pServer, pPager
2b340 2d 3e 70 53 65 72 76 65 72 50 61 67 65 29 3b 0a  ->pServerPage);.
2b350 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 65 72      pPager->pSer
2b360 76 65 72 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  verPage = 0;.   
2b370 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2b380 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
2b390 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
2b3a0 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   If the file is 
2b3b0 61 20 74 65 6d 70 2d 66 69 6c 65 20 68 61 73 20  a temp-file has 
2b3c0 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65  not yet been ope
2b3d0 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77  ned, open it now
2b3e0 2e 20 49 74 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  . It.  ** is not
2b3f0 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 72 63   possible for rc
2b400 20 74 6f 20 62 65 20 6f 74 68 65 72 20 74 68 61   to be other tha
2b410 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74  n SQLITE_OK if t
2b420 68 69 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20  his branch.  ** 
2b430 69 73 20 74 61 6b 65 6e 2c 20 61 73 20 70 61 67  is taken, as pag
2b440 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
2b450 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72  ) is a no-op for
2b460 20 74 65 6d 70 2d 66 69 6c 65 73 2e 0a 20 20 2a   temp-files..  *
2b470 2f 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28  /.  if( !isOpen(
2b480 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
2b490 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2b4a0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 72  r->tempFile && r
2b4b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
2b4c0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70      rc = pagerOp
2b4d0 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70  entemp(pPager, p
2b4e0 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65  Pager->fd, pPage
2b4f0 72 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20 20  r->vfsFlags);.  
2b500 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 74  }..  /* Before t
2b510 68 65 20 66 69 72 73 74 20 77 72 69 74 65 2c 20  he first write, 
2b520 67 69 76 65 20 74 68 65 20 56 46 53 20 61 20 68  give the VFS a h
2b530 69 6e 74 20 6f 66 20 77 68 61 74 20 74 68 65 20  int of what the 
2b540 66 69 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20  final.  ** file 
2b550 73 69 7a 65 20 77 69 6c 6c 20 62 65 2e 0a 20 20  size will be..  
2b560 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  */.  assert( rc!
2b570 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73  =SQLITE_OK || is
2b580 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
2b590 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   );.  if( rc==SQ
2b5a0 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 26 26 20 70  LITE_OK .   && p
2b5b0 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a  Pager->dbHintSiz
2b5c0 65 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  e<pPager->dbSize
2b5d0 0a 20 20 20 26 26 20 28 70 4c 69 73 74 2d 3e 70  .   && (pList->p
2b5e0 44 69 72 74 79 20 7c 7c 20 70 4c 69 73 74 2d 3e  Dirty || pList->
2b5f0 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 48  pgno>pPager->dbH
2b600 69 6e 74 53 69 7a 65 29 0a 20 20 29 7b 0a 20 20  intSize).  ){.  
2b610 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
2b620 73 7a 46 69 6c 65 20 3d 20 70 50 61 67 65 72 2d  szFile = pPager-
2b630 3e 70 61 67 65 53 69 7a 65 20 2a 20 28 73 71 6c  >pageSize * (sql
2b640 69 74 65 33 5f 69 6e 74 36 34 29 70 50 61 67 65  ite3_int64)pPage
2b650 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 73  r->dbSize;.    s
2b660 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
2b670 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e  rolHint(pPager->
2b680 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  fd, SQLITE_FCNTL
2b690 5f 53 49 5a 45 5f 48 49 4e 54 2c 20 26 73 7a 46  _SIZE_HINT, &szF
2b6a0 69 6c 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ile);.    pPager
2b6b0 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d 20 70  ->dbHintSize = p
2b6c0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
2b6d0 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   }..  while( rc=
2b6e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c  =SQLITE_OK && pL
2b6f0 69 73 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  ist ){.    Pgno 
2b700 70 67 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e 70 67  pgno = pList->pg
2b710 6e 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  no;..    /* If t
2b720 68 65 72 65 20 61 72 65 20 64 69 72 74 79 20 70  here are dirty p
2b730 61 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65  ages in the page
2b740 20 63 61 63 68 65 20 77 69 74 68 20 70 61 67 65   cache with page
2b750 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72   numbers greater
2b760 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67  .    ** than Pag
2b770 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20  er.dbSize, this 
2b780 6d 65 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67  means sqlite3Pag
2b790 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28  erTruncateImage(
2b7a0 29 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a  ) was called to.
2b7b0 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20      ** make the 
2b7c0 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72  file smaller (pr
2b7d0 65 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f  esumably by auto
2b7e0 2d 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44  -vacuum code). D
2b7f0 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20  o not write.    
2b800 2a 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67 65  ** any such page
2b810 73 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20  s to the file.. 
2b820 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73     **.    ** Als
2b830 6f 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  o, do not write 
2b840 6f 75 74 20 61 6e 79 20 70 61 67 65 20 74 68 61  out any page tha
2b850 74 20 68 61 73 20 74 68 65 20 50 47 48 44 52 5f  t has the PGHDR_
2b860 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 0a  DONT_WRITE flag.
2b870 20 20 20 20 2a 2a 20 73 65 74 20 28 73 65 74 20      ** set (set 
2b880 62 79 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  by sqlite3PagerD
2b890 6f 6e 74 57 72 69 74 65 28 29 29 2e 0a 20 20 20  ontWrite())..   
2b8a0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f   */.    if( pgno
2b8b0 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  <=pPager->dbSize
2b8c0 20 26 26 20 30 3d 3d 28 70 4c 69 73 74 2d 3e 66   && 0==(pList->f
2b8d0 6c 61 67 73 26 50 47 48 44 52 5f 44 4f 4e 54 5f  lags&PGHDR_DONT_
2b8e0 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20 20 20  WRITE) ){.      
2b8f0 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28 70 67  i64 offset = (pg
2b900 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65  no-1)*(i64)pPage
2b910 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 2f  r->pageSize;   /
2b920 2a 20 4f 66 66 73 65 74 20 74 6f 20 77 72 69 74  * Offset to writ
2b930 65 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20  e */.      char 
2b940 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  *pData;         
2b950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b960 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
2b970 61 20 74 6f 20 77 72 69 74 65 20 2a 2f 20 20 20  a to write */   
2b980 20 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   ..      assert(
2b990 20 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50   (pList->flags&P
2b9a0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d  GHDR_NEED_SYNC)=
2b9b0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
2b9c0 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29  pList->pgno==1 )
2b9d0 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61   pager_write_cha
2b9e0 6e 67 65 63 6f 75 6e 74 65 72 28 70 4c 69 73 74  ngecounter(pList
2b9f0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 63  );..      /* Enc
2ba00 6f 64 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ode the database
2ba10 20 2a 2f 0a 20 20 20 20 20 20 43 4f 44 45 43 32   */.      CODEC2
2ba20 28 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e  (pPager, pList->
2ba30 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 36 2c 20  pData, pgno, 6, 
2ba40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2ba50 4d 45 4d 5f 42 4b 50 54 2c 20 70 44 61 74 61 29  MEM_BKPT, pData)
2ba60 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74  ;..      /* Writ
2ba70 65 20 6f 75 74 20 74 68 65 20 70 61 67 65 20 64  e out the page d
2ba80 61 74 61 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63  ata. */.      rc
2ba90 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
2baa0 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44  e(pPager->fd, pD
2bab0 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
2bac0 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a  eSize, offset);.
2bad0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 61 67  .      /* If pag
2bae0 65 20 31 20 77 61 73 20 6a 75 73 74 20 77 72 69  e 1 was just wri
2baf0 74 74 65 6e 2c 20 75 70 64 61 74 65 20 50 61 67  tten, update Pag
2bb00 65 72 2e 64 62 46 69 6c 65 56 65 72 73 20 74 6f  er.dbFileVers to
2bb10 20 6d 61 74 63 68 0a 20 20 20 20 20 20 2a 2a 20   match.      ** 
2bb20 74 68 65 20 76 61 6c 75 65 20 6e 6f 77 20 73 74  the value now st
2bb30 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61  ored in the data
2bb40 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 77 72  base file. If wr
2bb50 69 74 69 6e 67 20 74 68 69 73 20 0a 20 20 20 20  iting this .    
2bb60 20 20 2a 2a 20 70 61 67 65 20 63 61 75 73 65 64    ** page caused
2bb70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2bb80 6c 65 20 74 6f 20 67 72 6f 77 2c 20 75 70 64 61  le to grow, upda
2bb90 74 65 20 64 62 46 69 6c 65 53 69 7a 65 2e 20 0a  te dbFileSize. .
2bba0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
2bbb0 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20  f( pgno==1 ){.  
2bbc0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
2bbd0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
2bbe0 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c 20 73 69  , &pData[24], si
2bbf0 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
2bc00 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20  ileVers));.     
2bc10 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e   }.      if( pgn
2bc20 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  o>pPager->dbFile
2bc30 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
2bc40 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
2bc50 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20  ze = pgno;.     
2bc60 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
2bc70 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41  >aStat[PAGER_STA
2bc80 54 5f 57 52 49 54 45 5d 2b 2b 3b 0a 0a 20 20 20  T_WRITE]++;..   
2bc90 20 20 20 2f 2a 20 55 70 64 61 74 65 20 61 6e 79     /* Update any
2bca0 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20   backup objects 
2bcb0 63 6f 70 79 69 6e 67 20 74 68 65 20 63 6f 6e 74  copying the cont
2bcc0 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61 67  ents of this pag
2bcd0 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  er. */.      sql
2bce0 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65  ite3BackupUpdate
2bcf0 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
2bd00 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 70 4c 69  , pgno, (u8*)pLi
2bd10 73 74 2d 3e 70 44 61 74 61 29 3b 0a 0a 20 20 20  st->pData);..   
2bd20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
2bd30 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64  STORE %d page %d
2bd40 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a   hash(%08x)\n",.
2bd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bd60 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
2bd70 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f  r), pgno, pager_
2bd80 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 29  pagehash(pList))
2bd90 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  );.      IOTRACE
2bda0 28 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e  (("PGOUT %p %d\n
2bdb0 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  ", pPager, pgno)
2bdc0 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49  );.      PAGER_I
2bdd0 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
2bde0 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29  r_writedb_count)
2bdf0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2be00 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
2be10 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65 20  NOSTORE %d page 
2be20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
2be30 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b 0a  Pager), pgno));.
2be40 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f      }.    pager_
2be50 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 4c 69  set_pagehash(pLi
2be60 73 74 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d  st);.    pList =
2be70 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a   pList->pDirty;.
2be80 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
2be90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72  ;.}../*.** Ensur
2bea0 65 20 74 68 61 74 20 74 68 65 20 73 75 62 2d 6a  e that the sub-j
2beb0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f  ournal file is o
2bec0 70 65 6e 2e 20 49 66 20 69 74 20 69 73 20 61 6c  pen. If it is al
2bed0 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 69 73  ready open, this
2bee0 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73   .** function is
2bef0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
2bf00 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
2bf10 75 72 6e 65 64 20 69 66 20 65 76 65 72 79 74 68  urned if everyth
2bf20 69 6e 67 20 67 6f 65 73 20 61 63 63 6f 72 64 69  ing goes accordi
2bf30 6e 67 20 74 6f 20 70 6c 61 6e 2e 20 41 6e 20 0a  ng to plan. An .
2bf40 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  ** SQLITE_IOERR_
2bf50 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69  XXX error code i
2bf60 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20  s returned if a 
2bf70 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f  call to sqlite3O
2bf80 73 4f 70 65 6e 28 29 20 0a 2a 2a 20 66 61 69 6c  sOpen() .** fail
2bf90 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
2bfa0 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28   openSubJournal(
2bfb0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
2bfc0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2bfd0 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 69 73 4f  E_OK;.  if( !isO
2bfe0 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
2bff0 29 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69  ) ){.    const i
2c000 6e 74 20 66 6c 61 67 73 20 3d 20 20 53 51 4c 49  nt flags =  SQLI
2c010 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e  TE_OPEN_SUBJOURN
2c020 41 4c 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  AL | SQLITE_OPEN
2c030 5f 52 45 41 44 57 52 49 54 45 20 0a 20 20 20 20  _READWRITE .    
2c040 20 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f    | SQLITE_OPEN_
2c050 43 52 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f  CREATE | SQLITE_
2c060 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 0a  OPEN_EXCLUSIVE .
2c070 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4f        | SQLITE_O
2c080 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
2c090 45 3b 0a 20 20 20 20 69 6e 74 20 6e 53 74 6d 74  E;.    int nStmt
2c0a0 53 70 69 6c 6c 20 3d 20 73 71 6c 69 74 65 33 43  Spill = sqlite3C
2c0b0 6f 6e 66 69 67 2e 6e 53 74 6d 74 53 70 69 6c 6c  onfig.nStmtSpill
2c0c0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
2c0d0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
2c0e0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2c0f0 5f 4d 45 4d 4f 52 59 20 7c 7c 20 70 50 61 67 65  _MEMORY || pPage
2c100 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20  r->subjInMemory 
2c110 29 7b 0a 20 20 20 20 20 20 6e 53 74 6d 74 53 70  ){.      nStmtSp
2c120 69 6c 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a  ill = -1;.    }.
2c130 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2c140 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67  JournalOpen(pPag
2c150 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70 50 61  er->pVfs, 0, pPa
2c160 67 65 72 2d 3e 73 6a 66 64 2c 20 66 6c 61 67 73  ger->sjfd, flags
2c170 2c 20 6e 53 74 6d 74 53 70 69 6c 6c 29 3b 0a 20  , nStmtSpill);. 
2c180 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2c190 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  }../*.** Append 
2c1a0 61 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20  a record of the 
2c1b0 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66  current state of
2c1c0 20 70 61 67 65 20 70 50 67 20 74 6f 20 74 68 65   page pPg to the
2c1d0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a   sub-journal. .*
2c1e0 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
2c1f0 75 6c 2c 20 73 65 74 20 74 68 65 20 62 69 74 20  ul, set the bit 
2c200 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
2c210 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 74 68   pPg->pgno in th
2c220 65 20 62 69 74 76 65 63 73 0a 2a 2a 20 66 6f 72  e bitvecs.** for
2c230 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f   all open savepo
2c240 69 6e 74 73 20 62 65 66 6f 72 65 20 72 65 74 75  ints before retu
2c250 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  rning..**.** Thi
2c260 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
2c270 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  ns SQLITE_OK if 
2c280 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
2c290 63 63 65 73 73 66 75 6c 2c 20 61 6e 20 49 4f 0a  ccessful, an IO.
2c2a0 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  ** error code if
2c2b0 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20   the attempt to 
2c2c0 77 72 69 74 65 20 74 6f 20 74 68 65 20 73 75 62  write to the sub
2c2d0 2d 6a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20  -journal fails, 
2c2e0 6f 72 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f  or .** SQLITE_NO
2c2f0 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20  MEM if a malloc 
2c300 66 61 69 6c 73 20 77 68 69 6c 65 20 73 65 74 74  fails while sett
2c310 69 6e 67 20 61 20 62 69 74 20 69 6e 20 61 20 73  ing a bit in a s
2c320 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 62 69 74 76  avepoint.** bitv
2c330 65 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ec..*/.static in
2c340 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65  t subjournalPage
2c350 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
2c360 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2c370 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  OK;.  Pager *pPa
2c380 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
2c390 72 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  r;.  if( pPager-
2c3a0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
2c3b0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2c3c0 4f 46 46 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f  OFF ){..    /* O
2c3d0 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  pen the sub-jour
2c3e0 6e 61 6c 2c 20 69 66 20 69 74 20 68 61 73 20 6e  nal, if it has n
2c3f0 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ot already been 
2c400 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 20 20 61 73  opened */.    as
2c410 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73  sert( pPager->us
2c420 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  eJournal );.    
2c430 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
2c440 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70  Pager->jfd) || p
2c450 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
2c460 72 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  r) );.    assert
2c470 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
2c480 3e 73 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72  >sjfd) || pPager
2c490 2d 3e 6e 53 75 62 52 65 63 3d 3d 30 20 29 3b 0a  ->nSubRec==0 );.
2c4a0 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65      assert( page
2c4b0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
2c4c0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 61 67  .         || pag
2c4d0 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  eInJournal(pPage
2c4e0 72 2c 20 70 50 67 29 20 0a 20 20 20 20 20 20 20  r, pPg) .       
2c4f0 20 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70    || pPg->pgno>p
2c500 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
2c510 65 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63  e .    );.    rc
2c520 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61   = openSubJourna
2c530 6c 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20  l(pPager);..    
2c540 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d 6a 6f  /* If the sub-jo
2c550 75 72 6e 61 6c 20 77 61 73 20 6f 70 65 6e 65 64  urnal was opened
2c560 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 28 6f   successfully (o
2c570 72 20 77 61 73 20 61 6c 72 65 61 64 79 20 6f 70  r was already op
2c580 65 6e 29 2c 0a 20 20 20 20 2a 2a 20 77 72 69 74  en),.    ** writ
2c590 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65  e the journal re
2c5a0 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 66 69  cord into the fi
2c5b0 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  le.  */.    if( 
2c5c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2c5d0 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 44 61  .      void *pDa
2c5e0 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b  ta = pPg->pData;
2c5f0 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65  .      i64 offse
2c600 74 20 3d 20 28 69 36 34 29 70 50 61 67 65 72 2d  t = (i64)pPager-
2c610 3e 6e 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67  >nSubRec*(4+pPag
2c620 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
2c630 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61       char *pData
2c640 32 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 48  2;..#if SQLITE_H
2c650 41 53 5f 43 4f 44 45 43 20 20 20 0a 20 20 20 20  AS_CODEC   .    
2c660 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73    if( !pPager->s
2c670 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20  ubjInMemory ){. 
2c680 20 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50         CODEC2(pP
2c690 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
2c6a0 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72  ->pgno, 7, retur
2c6b0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
2c6c0 4b 50 54 2c 20 70 44 61 74 61 32 29 3b 0a 20 20  KPT, pData2);.  
2c6d0 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
2c6e0 0a 20 20 20 20 20 20 70 44 61 74 61 32 20 3d 20  .      pData2 = 
2c6f0 70 44 61 74 61 3b 0a 20 20 20 20 20 20 50 41 47  pData;.      PAG
2c700 45 52 54 52 41 43 45 28 28 22 53 54 4d 54 2d 4a  ERTRACE(("STMT-J
2c710 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25  OURNAL %d page %
2c720 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
2c730 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
2c740 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  ));.      rc = w
2c750 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
2c760 72 2d 3e 73 6a 66 64 2c 20 6f 66 66 73 65 74 2c  r->sjfd, offset,
2c770 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
2c780 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2c790 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2c7a0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
2c7b0 69 74 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  ite(pPager->sjfd
2c7c0 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72  , pData2, pPager
2c7d0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73  ->pageSize, offs
2c7e0 65 74 2b 34 29 3b 0a 20 20 20 20 20 20 7d 0a 20  et+4);.      }. 
2c7f0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
2c800 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2c810 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62      pPager->nSub
2c820 52 65 63 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72  Rec++;.    asser
2c830 74 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  t( pPager->nSave
2c840 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20 20 20 72  point>0 );.    r
2c850 63 20 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69  c = addToSavepoi
2c860 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72  ntBitvecs(pPager
2c870 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
2c880 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2c890 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a  .static int subj
2c8a0 6f 75 72 6e 61 6c 50 61 67 65 49 66 52 65 71 75  ournalPageIfRequ
2c8b0 69 72 65 64 28 50 67 48 64 72 20 2a 70 50 67 29  ired(PgHdr *pPg)
2c8c0 7b 0a 20 20 69 66 28 20 73 75 62 6a 52 65 71 75  {.  if( subjRequ
2c8d0 69 72 65 73 50 61 67 65 28 70 50 67 29 20 29 7b  iresPage(pPg) ){
2c8e0 0a 20 20 20 20 72 65 74 75 72 6e 20 73 75 62 6a  .    return subj
2c8f0 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b  ournalPage(pPg);
2c900 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
2c910 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2c920 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
2c930 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
2c940 6c 6c 65 64 20 62 79 20 74 68 65 20 70 63 61 63  lled by the pcac
2c950 68 65 20 6c 61 79 65 72 20 77 68 65 6e 20 69 74  he layer when it
2c960 20 68 61 73 20 72 65 61 63 68 65 64 20 73 6f 6d   has reached som
2c970 65 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79  e.** soft memory
2c980 20 6c 69 6d 69 74 2e 20 54 68 65 20 66 69 72 73   limit. The firs
2c990 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  t argument is a 
2c9a0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67  pointer to a Pag
2c9b0 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61  er object.** (ca
2c9c0 73 74 20 61 73 20 61 20 76 6f 69 64 2a 29 2e 20  st as a void*). 
2c9d0 54 68 65 20 70 61 67 65 72 20 69 73 20 61 6c 77  The pager is alw
2c9e0 61 79 73 20 27 70 75 72 67 65 61 62 6c 65 27 20  ays 'purgeable' 
2c9f0 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  (not an in-memor
2ca00 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 29 2e 20  y.** database). 
2ca10 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
2ca20 65 6e 74 20 69 73 20 61 20 72 65 66 65 72 65 6e  ent is a referen
2ca30 63 65 20 74 6f 20 61 20 70 61 67 65 20 74 68 61  ce to a page tha
2ca40 74 20 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74  t is .** current
2ca50 6c 79 20 64 69 72 74 79 20 62 75 74 20 68 61 73  ly dirty but has
2ca60 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
2ca70 72 65 66 65 72 65 6e 63 65 73 2e 20 54 68 65 20  references. The 
2ca80 70 61 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79  page.** is alway
2ca90 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
2caa0 68 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  h the Pager obje
2cab0 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
2cac0 20 66 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d   first .** argum
2cad0 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  ent..**.** The j
2cae0 6f 62 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ob of this funct
2caf0 69 6f 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20 70  ion is to make p
2cb00 50 67 20 63 6c 65 61 6e 20 62 79 20 77 72 69 74  Pg clean by writ
2cb10 69 6e 67 20 69 74 73 20 63 6f 6e 74 65 6e 74 73  ing its contents
2cb20 0a 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64  .** out to the d
2cb30 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 66  atabase file, if
2cb40 20 70 6f 73 73 69 62 6c 65 2e 20 54 68 69 73 20   possible. This 
2cb50 6d 61 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63  may involve sync
2cb60 69 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  ing the.** journ
2cb70 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  al file. .**.** 
2cb80 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73  If successful, s
2cb90 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
2cba0 43 6c 65 61 6e 28 29 20 69 73 20 63 61 6c 6c 65  Clean() is calle
2cbb0 64 20 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e  d on the page an
2cbc0 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72  d.** SQLITE_OK r
2cbd0 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
2cbe0 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
2cbf0 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6d  hile trying to m
2cc00 61 6b 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  ake the.** page 
2cc10 63 6c 65 61 6e 2c 20 74 68 65 20 49 4f 20 65 72  clean, the IO er
2cc20 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
2cc30 72 6e 65 64 2e 20 49 66 20 74 68 65 20 70 61 67  rned. If the pag
2cc40 65 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d  e cannot be.** m
2cc50 61 64 65 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f  ade clean for so
2cc60 6d 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c  me other reason,
2cc70 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63   but no error oc
2cc80 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54  curs, then SQLIT
2cc90 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72  E_OK.** is retur
2cca0 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 50 63  ned by sqlite3Pc
2ccb0 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20  acheMakeClean() 
2ccc0 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a  is not called..*
2ccd0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
2cce0 65 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a 70  erStress(void *p
2ccf0 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  , PgHdr *pPg){. 
2cd00 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
2cd10 20 28 50 61 67 65 72 20 2a 29 70 3b 0a 20 20 69   (Pager *)p;.  i
2cd20 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2cd30 4b 3b 0a 0a 20 20 69 66 28 20 70 61 67 65 72 49  K;..  if( pagerI
2cd40 73 53 65 72 76 65 72 28 70 50 61 67 65 72 29 20  sServer(pPager) 
2cd50 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2cd60 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  OK;..  assert( p
2cd70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67  Pg->pPager==pPag
2cd80 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er );.  assert( 
2cd90 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
2cda0 5f 44 49 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20  _DIRTY );..  /* 
2cdb0 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 4e  The doNotSpill N
2cdc0 4f 53 59 4e 43 20 62 69 74 20 69 73 20 73 65 74  OSYNC bit is set
2cdd0 20 64 75 72 69 6e 67 20 74 69 6d 65 73 20 77 68   during times wh
2cde0 65 6e 20 64 6f 69 6e 67 20 61 20 73 79 6e 63 20  en doing a sync 
2cdf0 6f 66 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  of.  ** journal 
2ce00 28 61 6e 64 20 61 64 64 69 6e 67 20 61 20 6e 65  (and adding a ne
2ce10 77 20 68 65 61 64 65 72 29 20 69 73 20 6e 6f 74  w header) is not
2ce20 20 61 6c 6c 6f 77 65 64 2e 20 20 54 68 69 73 20   allowed.  This 
2ce30 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69  occurs.  ** duri
2ce40 6e 67 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ng calls to sqli
2ce50 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
2ce60 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20  while trying to 
2ce70 6a 6f 75 72 6e 61 6c 20 6d 75 6c 74 69 70 6c 65  journal multiple
2ce80 0a 20 20 2a 2a 20 70 61 67 65 73 20 62 65 6c 6f  .  ** pages belo
2ce90 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 73 61 6d  nging to the sam
2cea0 65 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2a 0a 20  e sector..  **. 
2ceb0 20 2a 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70 69   ** The doNotSpi
2cec0 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20  ll ROLLBACK and 
2ced0 4f 46 46 20 62 69 74 73 20 69 6e 68 69 62 69 74  OFF bits inhibit
2cee0 73 20 61 6c 6c 20 63 61 63 68 65 20 73 70 69 6c  s all cache spil
2cef0 6c 69 6e 67 0a 20 20 2a 2a 20 72 65 67 61 72 64  ling.  ** regard
2cf00 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20  less of whether 
2cf10 6f 72 20 6e 6f 74 20 61 20 73 79 6e 63 20 69 73  or not a sync is
2cf20 20 72 65 71 75 69 72 65 64 2e 20 20 54 68 69 73   required.  This
2cf30 20 69 73 20 73 65 74 20 64 75 72 69 6e 67 0a 20   is set during. 
2cf40 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f   ** a rollback o
2cf50 72 20 62 79 20 75 73 65 72 20 72 65 71 75 65 73  r by user reques
2cf60 74 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  t, respectively.
2cf70 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 70 69 6c 6c  .  **.  ** Spill
2cf80 69 6e 67 20 69 73 20 61 6c 73 6f 20 70 72 6f 68  ing is also proh
2cf90 69 62 69 74 65 64 20 77 68 65 6e 20 69 6e 20 61  ibited when in a
2cfa0 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 73 69  n error state si
2cfb0 6e 63 65 20 74 68 61 74 20 63 6f 75 6c 64 0a 20  nce that could. 
2cfc0 20 2a 2a 20 6c 65 61 64 20 74 6f 20 64 61 74 61   ** lead to data
2cfd0 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
2cfe0 20 20 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e     In the curren
2cff0 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
2d000 20 69 74 20 0a 20 20 2a 2a 20 69 73 20 69 6d 70   it .  ** is imp
2d010 6f 73 73 69 62 6c 65 20 66 6f 72 20 73 71 6c 69  ossible for sqli
2d020 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 29  te3PcacheFetch()
2d030 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 77 69   to be called wi
2d040 74 68 20 63 72 65 61 74 65 46 6c 61 67 3d 3d 33  th createFlag==3
2d050 0a 20 20 2a 2a 20 77 68 69 6c 65 20 69 6e 20 74  .  ** while in t
2d060 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  he error state, 
2d070 68 65 6e 63 65 20 69 74 20 69 73 20 69 6d 70 6f  hence it is impo
2d080 73 73 69 62 6c 65 20 66 6f 72 20 74 68 69 73 20  ssible for this 
2d090 72 6f 75 74 69 6e 65 20 74 6f 0a 20 20 2a 2a 20  routine to.  ** 
2d0a0 62 65 20 63 61 6c 6c 65 64 20 69 6e 20 74 68 65  be called in the
2d0b0 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 20 4e   error state.  N
2d0c0 65 76 65 72 74 68 65 6c 65 73 73 2c 20 77 65 20  evertheless, we 
2d0d0 69 6e 63 6c 75 64 65 20 61 20 4e 45 56 45 52 28  include a NEVER(
2d0e0 29 0a 20 20 2a 2a 20 74 65 73 74 20 66 6f 72 20  ).  ** test for 
2d0f0 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20  the error state 
2d100 61 73 20 61 20 73 61 66 65 67 75 61 72 64 20 61  as a safeguard a
2d110 67 61 69 6e 73 74 20 66 75 74 75 72 65 20 63 68  gainst future ch
2d120 61 6e 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  anges..  */.  if
2d130 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e  ( NEVER(pPager->
2d140 65 72 72 43 6f 64 65 29 20 29 20 72 65 74 75 72  errCode) ) retur
2d150 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 74  n SQLITE_OK;.  t
2d160 65 73 74 63 61 73 65 28 20 70 50 61 67 65 72 2d  estcase( pPager-
2d170 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50  >doNotSpill & SP
2d180 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b  ILLFLAG_ROLLBACK
2d190 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
2d1a0 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
2d1b0 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 4f  ll & SPILLFLAG_O
2d1c0 46 46 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  FF );.  testcase
2d1d0 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  ( pPager->doNotS
2d1e0 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47  pill & SPILLFLAG
2d1f0 5f 4e 4f 53 59 4e 43 20 29 3b 0a 20 20 69 66 28  _NOSYNC );.  if(
2d200 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
2d210 69 6c 6c 0a 20 20 20 26 26 20 28 28 70 50 61 67  ill.   && ((pPag
2d220 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26  er->doNotSpill &
2d230 20 28 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c   (SPILLFLAG_ROLL
2d240 42 41 43 4b 7c 53 50 49 4c 4c 46 4c 41 47 5f 4f  BACK|SPILLFLAG_O
2d250 46 46 29 29 21 3d 30 0a 20 20 20 20 20 20 7c 7c  FF))!=0.      ||
2d260 20 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50   (pPg->flags & P
2d270 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21  GHDR_NEED_SYNC)!
2d280 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  =0).  ){.    ret
2d290 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2d2a0 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 61 53   }..  pPager->aS
2d2b0 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 53  tat[PAGER_STAT_S
2d2c0 50 49 4c 4c 5d 2b 2b 3b 0a 20 20 70 50 67 2d 3e  PILL]++;.  pPg->
2d2d0 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 69 66  pDirty = 0;.  if
2d2e0 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
2d2f0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20  ager) ){.    /* 
2d300 57 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20 66  Write a single f
2d310 72 61 6d 65 20 66 6f 72 20 74 68 69 73 20 70 61  rame for this pa
2d320 67 65 20 74 6f 20 74 68 65 20 6c 6f 67 2e 20 2a  ge to the log. *
2d330 2f 0a 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f  /.    rc = subjo
2d340 75 72 6e 61 6c 50 61 67 65 49 66 52 65 71 75 69  urnalPageIfRequi
2d350 72 65 64 28 70 50 67 29 3b 20 0a 20 20 20 20 69  red(pPg); .    i
2d360 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2d370 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
2d380 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28 70 50  agerWalFrames(pP
2d390 61 67 65 72 2c 20 70 50 67 2c 20 30 2c 20 30 29  ager, pPg, 0, 0)
2d3a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
2d3b0 0a 20 20 20 20 0a 23 69 66 64 65 66 20 53 51 4c  .    .#ifdef SQL
2d3c0 49 54 45 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48  ITE_ENABLE_BATCH
2d3d0 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20  _ATOMIC_WRITE.  
2d3e0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65    if( pPager->te
2d3f0 6d 70 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  mpFile==0 ){.   
2d400 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a     rc = sqlite3J
2d410 6f 75 72 6e 61 6c 43 72 65 61 74 65 28 70 50 61  ournalCreate(pPa
2d420 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
2d430 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2d440 4f 4b 20 29 20 72 65 74 75 72 6e 20 70 61 67 65  OK ) return page
2d450 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
2d460 72 63 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  rc);.    }.#endi
2d470 66 0a 20 20 0a 20 20 20 20 2f 2a 20 53 79 6e 63  f.  .    /* Sync
2d480 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2d490 65 20 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a  e if required. *
2d4a0 2f 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 66  /.    if( pPg->f
2d4b0 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
2d4c0 53 59 4e 43 20 0a 20 20 20 20 20 7c 7c 20 70 50  SYNC .     || pP
2d4d0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
2d4e0 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
2d4f0 4d 4f 44 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  MOD.    ){.     
2d500 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61   rc = syncJourna
2d510 6c 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20  l(pPager, 1);.  
2d520 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72    }.  .    /* Wr
2d530 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ite the contents
2d540 20 6f 66 20 74 68 65 20 70 61 67 65 20 6f 75 74   of the page out
2d550 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
2d560 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66   file. */.    if
2d570 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2d580 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2d590 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
2d5a0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30  DR_NEED_SYNC)==0
2d5b0 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   );.      rc = p
2d5c0 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
2d5d0 69 73 74 28 70 50 61 67 65 72 2c 20 70 50 67 29  ist(pPager, pPg)
2d5e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
2d5f0 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20  * Mark the page 
2d600 61 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69  as clean. */.  i
2d610 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2d620 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41   ){.    PAGERTRA
2d630 43 45 28 28 22 53 54 52 45 53 53 20 25 64 20 70  CE(("STRESS %d p
2d640 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
2d650 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
2d660 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c  >pgno));.    sql
2d670 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c  ite3PcacheMakeCl
2d680 65 61 6e 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20  ean(pPg);.  }.. 
2d690 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
2d6a0 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
2d6b0 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68   .}../*.** Flush
2d6c0 20 61 6c 6c 20 75 6e 72 65 66 65 72 65 6e 63 65   all unreference
2d6d0 64 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f  d dirty pages to
2d6e0 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   disk..*/.int sq
2d6f0 6c 69 74 65 33 50 61 67 65 72 46 6c 75 73 68 28  lite3PagerFlush(
2d700 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
2d710 20 20 69 6e 74 20 72 63 20 3d 20 70 50 61 67 65    int rc = pPage
2d720 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 69 66  r->errCode;.  if
2d730 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  ( !MEMDB ){.    
2d740 50 67 48 64 72 20 2a 70 4c 69 73 74 20 3d 20 73  PgHdr *pList = s
2d750 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74  qlite3PcacheDirt
2d760 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50  yList(pPager->pP
2d770 43 61 63 68 65 29 3b 0a 20 20 20 20 61 73 73 65  Cache);.    asse
2d780 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
2d790 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
2d7a0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d  ;.    while( rc=
2d7b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c  =SQLITE_OK && pL
2d7c0 69 73 74 20 29 7b 0a 20 20 20 20 20 20 50 67 48  ist ){.      PgH
2d7d0 64 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73  dr *pNext = pLis
2d7e0 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 20  t->pDirty;.     
2d7f0 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 52 65 66   if( pList->nRef
2d800 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
2d810 63 20 3d 20 70 61 67 65 72 53 74 72 65 73 73 28  c = pagerStress(
2d820 28 76 6f 69 64 2a 29 70 50 61 67 65 72 2c 20 70  (void*)pPager, p
2d830 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  List);.      }. 
2d840 20 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65       pList = pNe
2d850 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  xt;.    }.  }.. 
2d860 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2d870 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e  *.** Allocate an
2d880 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e  d initialize a n
2d890 65 77 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  ew Pager object 
2d8a0 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65  and put a pointe
2d8b0 72 20 74 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a 70  r to it.** in *p
2d8c0 70 50 61 67 65 72 2e 20 54 68 65 20 70 61 67 65  pPager. The page
2d8d0 72 20 73 68 6f 75 6c 64 20 65 76 65 6e 74 75 61  r should eventua
2d8e0 6c 6c 79 20 62 65 20 66 72 65 65 64 20 62 79 20  lly be freed by 
2d8f0 70 61 73 73 69 6e 67 20 69 74 0a 2a 2a 20 74 6f  passing it.** to
2d900 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
2d910 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  se()..**.** The 
2d920 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65  zFilename argume
2d930 6e 74 20 69 73 20 74 68 65 20 70 61 74 68 20 74  nt is the path t
2d940 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
2d950 69 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20  ile to open..** 
2d960 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
2d970 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64  NULL then a rand
2d980 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f  omly-named tempo
2d990 72 61 72 79 20 66 69 6c 65 20 69 73 20 63 72 65  rary file is cre
2d9a0 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64  ated.** and used
2d9b0 20 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20   as the file to 
2d9c0 62 65 20 63 61 63 68 65 64 2e 20 54 65 6d 70 6f  be cached. Tempo
2d9d0 72 61 72 79 20 66 69 6c 65 73 20 61 72 65 20 62  rary files are b
2d9e0 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74  e deleted.** aut
2d9f0 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20  omatically when 
2da00 74 68 65 79 20 61 72 65 20 63 6c 6f 73 65 64 2e  they are closed.
2da10 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
2da20 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e   ":memory:" then
2da30 20 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d 61   .** all informa
2da40 74 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20  tion is held in 
2da50 63 61 63 68 65 2e 20 49 74 20 69 73 20 6e 65 76  cache. It is nev
2da60 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69  er written to di
2da70 73 6b 2e 20 0a 2a 2a 20 54 68 69 73 20 63 61 6e  sk. .** This can
2da80 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c   be used to impl
2da90 65 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ement an in-memo
2daa0 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  ry database..**.
2dab0 2a 2a 20 54 68 65 20 6e 45 78 74 72 61 20 70 61  ** The nExtra pa
2dac0 72 61 6d 65 74 65 72 20 73 70 65 63 69 66 69 65  rameter specifie
2dad0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
2dae0 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61  bytes of space a
2daf0 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e  llocated.** alon
2db00 67 20 77 69 74 68 20 65 61 63 68 20 70 61 67 65  g with each page
2db10 20 72 65 66 65 72 65 6e 63 65 2e 20 54 68 69 73   reference. This
2db20 20 73 70 61 63 65 20 69 73 20 61 76 61 69 6c 61   space is availa
2db30 62 6c 65 20 74 6f 20 74 68 65 20 75 73 65 72 0a  ble to the user.
2db40 2a 2a 20 76 69 61 20 74 68 65 20 73 71 6c 69 74  ** via the sqlit
2db50 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
2db60 29 20 41 50 49 2e 20 20 57 68 65 6e 20 61 20 6e  ) API.  When a n
2db70 65 77 20 70 61 67 65 20 69 73 20 61 6c 6c 6f 63  ew page is alloc
2db80 61 74 65 64 2c 20 74 68 65 0a 2a 2a 20 66 69 72  ated, the.** fir
2db90 73 74 20 38 20 62 79 74 65 73 20 6f 66 20 74 68  st 8 bytes of th
2dba0 69 73 20 73 70 61 63 65 20 61 72 65 20 7a 65 72  is space are zer
2dbb0 6f 65 64 20 62 75 74 20 74 68 65 20 72 65 6d 61  oed but the rema
2dbc0 69 6e 64 65 72 20 69 73 20 75 6e 69 6e 69 74 69  inder is uniniti
2dbd0 61 6c 69 7a 65 64 2e 0a 2a 2a 20 28 54 68 65 20  alized..** (The 
2dbe0 65 78 74 72 61 20 73 70 61 63 65 20 69 73 20 75  extra space is u
2dbf0 73 65 64 20 62 79 20 62 74 72 65 65 20 61 73 20  sed by btree as 
2dc00 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65  the MemPage obje
2dc10 63 74 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ct.).**.** The f
2dc20 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69 73  lags argument is
2dc30 20 75 73 65 64 20 74 6f 20 73 70 65 63 69 66 79   used to specify
2dc40 20 70 72 6f 70 65 72 74 69 65 73 20 74 68 61 74   properties that
2dc50 20 61 66 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f   affect the.** o
2dc60 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  peration of the 
2dc70 70 61 67 65 72 2e 20 49 74 20 73 68 6f 75 6c 64  pager. It should
2dc80 20 62 65 20 70 61 73 73 65 64 20 73 6f 6d 65 20   be passed some 
2dc90 62 69 74 77 69 73 65 20 63 6f 6d 62 69 6e 61 74  bitwise combinat
2dca0 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41  ion.** of the PA
2dcb0 47 45 52 5f 2a 20 66 6c 61 67 73 2e 0a 2a 2a 0a  GER_* flags..**.
2dcc0 2a 2a 20 54 68 65 20 76 66 73 46 6c 61 67 73 20  ** The vfsFlags 
2dcd0 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62  parameter is a b
2dce0 69 74 6d 61 73 6b 20 74 6f 20 70 61 73 73 20 74  itmask to pass t
2dcf0 6f 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61  o the flags para
2dd00 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20  meter.** of the 
2dd10 78 4f 70 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f  xOpen() method o
2dd20 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 56  f the supplied V
2dd30 46 53 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  FS when opening 
2dd40 66 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  files. .**.** If
2dd50 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
2dd60 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  t is allocated a
2dd70 6e 64 20 74 68 65 20 73 70 65 63 69 66 69 65 64  nd the specified
2dd80 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a   file opened .**
2dd90 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 53   successfully, S
2dda0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2ddb0 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65  rned and *ppPage
2ddc0 72 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  r set to point t
2ddd0 6f 0a 2a 2a 20 74 68 65 20 6e 65 77 20 70 61 67  o.** the new pag
2dde0 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e  er object. If an
2ddf0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a   error occurs, *
2de00 70 70 50 61 67 65 72 20 69 73 20 73 65 74 20 74  ppPager is set t
2de10 6f 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72  o NULL.** and er
2de20 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65  ror code returne
2de30 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  d. This function
2de40 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
2de50 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c  TE_NOMEM.** (sql
2de60 69 74 65 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20  ite3Malloc() is 
2de70 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65  used to allocate
2de80 20 6d 65 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45   memory), SQLITE
2de90 5f 43 41 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a  _CANTOPEN or .**
2dea0 20 76 61 72 69 6f 75 73 20 53 51 4c 49 54 45 5f   various SQLITE_
2deb0 49 4f 5f 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a  IO_XXX errors..*
2dec0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
2ded0 65 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65  erOpen(.  sqlite
2dee0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
2def0 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61     /* The virtua
2df00 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f  l file system to
2df10 20 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20   use */.  Pager 
2df20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20  **ppPager,      
2df30 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72     /* OUT: Retur
2df40 6e 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  n the Pager stru
2df50 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20  cture here */.  
2df60 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
2df70 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65  ename,   /* Name
2df80 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2df90 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f   file to open */
2dfa0 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20  .  int nExtra,  
2dfb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
2dfc0 78 74 72 61 20 62 79 74 65 73 20 61 70 70 65 6e  xtra bytes appen
2dfd0 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d  d to each in-mem
2dfe0 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  ory page */.  in
2dff0 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
2e000 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20         /* flags 
2e010 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73  controlling this
2e020 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76   file */.  int v
2e030 66 73 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20  fsFlags,        
2e040 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 70 61 73      /* flags pas
2e050 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73  sed through to s
2e060 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e  qlite3_vfs.xOpen
2e070 28 29 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  () */.  void (*x
2e080 52 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a 29  Reinit)(DbPage*)
2e090 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20   /* Function to 
2e0a0 72 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67  reinitialize pag
2e0b0 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70  es */.){.  u8 *p
2e0c0 50 74 72 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  Ptr;.  Pager *pP
2e0d0 61 67 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  ager = 0;       
2e0e0 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
2e0f0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20  to allocate and 
2e100 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20  return */.  int 
2e110 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
2e120 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
2e130 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d  ode */.  int tem
2e140 70 46 69 6c 65 20 3d 20 30 3b 20 20 20 20 20 20  pFile = 0;      
2e150 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 65    /* True for te
2e160 6d 70 20 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20  mp files (incl. 
2e170 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29  in-memory files)
2e180 20 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20   */.  int memDb 
2e190 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
2e1a0 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
2e1b0 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66  s an in-memory f
2e1c0 69 6c 65 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ile */.#ifdef SQ
2e1d0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 45 53 45  LITE_ENABLE_DESE
2e1e0 52 49 41 4c 49 5a 45 0a 20 20 69 6e 74 20 6d 65  RIALIZE.  int me
2e1f0 6d 4a 4d 20 3d 20 30 3b 20 20 20 20 20 20 20 20  mJM = 0;        
2e200 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6a 6f 75     /* Memory jou
2e210 72 6e 61 6c 20 6d 6f 64 65 20 2a 2f 0a 23 65 6c  rnal mode */.#el
2e220 73 65 0a 23 20 64 65 66 69 6e 65 20 6d 65 6d 4a  se.# define memJ
2e230 4d 20 30 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74  M 0.#endif.  int
2e240 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 20 20   readOnly = 0;  
2e250 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2e260 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64 2d   this is a read-
2e270 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69  only file */.  i
2e280 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69  nt journalFileSi
2e290 7a 65 3b 20 20 20 20 20 2f 2a 20 42 79 74 65 73  ze;     /* Bytes
2e2a0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72   to allocate for
2e2b0 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 64   each journal fd
2e2c0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61 74   */.  char *zPat
2e2d0 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f  hname = 0;     /
2e2e0 2a 20 46 75 6c 6c 20 70 61 74 68 20 74 6f 20 64  * Full path to d
2e2f0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2e300 20 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65 20    int nPathname 
2e310 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75  = 0;       /* Nu
2e320 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
2e330 20 7a 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20   zPathname */.  
2e340 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d  int useJournal =
2e350 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f   (flags & PAGER_
2e360 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30  OMIT_JOURNAL)==0
2e370 3b 20 2f 2a 20 46 61 6c 73 65 20 74 6f 20 6f 6d  ; /* False to om
2e380 69 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  it journal */.  
2e390 69 6e 74 20 70 63 61 63 68 65 53 69 7a 65 20 3d  int pcacheSize =
2e3a0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 69   sqlite3PcacheSi
2e3b0 7a 65 28 29 3b 20 20 20 20 20 20 20 2f 2a 20 42  ze();       /* B
2e3c0 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ytes to allocate
2e3d0 20 66 6f 72 20 50 43 61 63 68 65 20 2a 2f 0a 20   for PCache */. 
2e3e0 20 75 33 32 20 73 7a 50 61 67 65 44 66 6c 74 20   u32 szPageDflt 
2e3f0 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
2e400 5f 50 41 47 45 5f 53 49 5a 45 3b 20 20 2f 2a 20  _PAGE_SIZE;  /* 
2e410 44 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  Default page siz
2e420 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
2e430 72 20 2a 7a 55 72 69 20 3d 20 30 3b 20 20 20 20  r *zUri = 0;    
2e440 2f 2a 20 55 52 49 20 61 72 67 73 20 74 6f 20 63  /* URI args to c
2e450 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 55 72  opy */.  int nUr
2e460 69 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  i = 0;          
2e470 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
2e480 79 74 65 73 20 6f 66 20 55 52 49 20 61 72 67 73  ytes of URI args
2e490 20 61 74 20 2a 7a 55 72 69 20 2a 2f 0a 0a 20 20   at *zUri */..  
2e4a0 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
2e4b0 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 73 20  w much space is 
2e4c0 72 65 71 75 69 72 65 64 20 66 6f 72 20 65 61 63  required for eac
2e4d0 68 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68  h journal file-h
2e4e0 61 6e 64 6c 65 0a 20 20 2a 2a 20 28 74 68 65 72  andle.  ** (ther
2e4f0 65 20 61 72 65 20 74 77 6f 20 6f 66 20 74 68 65  e are two of the
2e500 6d 2c 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  m, the main jour
2e510 6e 61 6c 20 61 6e 64 20 74 68 65 20 73 75 62 2d  nal and the sub-
2e520 6a 6f 75 72 6e 61 6c 29 2e 20 20 2a 2f 0a 20 20  journal).  */.  
2e530 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
2e540 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33  = ROUND8(sqlite3
2e550 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73  JournalSize(pVfs
2e560 29 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68  ));..  /* Set th
2e570 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  e output variabl
2e580 65 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 63 61 73  e to NULL in cas
2e590 65 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  e an error occur
2e5a0 73 2e 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72  s. */.  *ppPager
2e5b0 20 3d 20 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53   = 0;..#ifndef S
2e5c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
2e5d0 59 44 42 0a 20 20 69 66 28 20 66 6c 61 67 73 20  YDB.  if( flags 
2e5e0 26 20 50 41 47 45 52 5f 4d 45 4d 4f 52 59 20 29  & PAGER_MEMORY )
2e5f0 7b 0a 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b  {.    memDb = 1;
2e600 0a 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  .    if( zFilena
2e610 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b  me && zFilename[
2e620 30 5d 20 29 7b 0a 20 20 20 20 20 20 7a 50 61 74  0] ){.      zPat
2e630 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  hname = sqlite3D
2e640 62 53 74 72 44 75 70 28 30 2c 20 7a 46 69 6c 65  bStrDup(0, zFile
2e650 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28  name);.      if(
2e660 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 20 29   zPathname==0  )
2e670 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2e680 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
2e690 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c   nPathname = sql
2e6a0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61  ite3Strlen30(zPa
2e6b0 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7a  thname);.      z
2e6c0 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20  Filename = 0;.  
2e6d0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
2e6e0 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64    /* Compute and
2e6f0 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 20   store the full 
2e700 70 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61  pathname in an a
2e710 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 20  llocated buffer 
2e720 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20  pointed.  ** to 
2e730 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65  by zPathname, le
2e740 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20  ngth nPathname. 
2e750 4f 72 2c 20 69 66 20 74 68 69 73 20 69 73 20 61  Or, if this is a
2e760 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c   temporary file,
2e770 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68  .  ** leave both
2e780 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a   nPathname and z
2e790 50 61 74 68 6e 61 6d 65 20 73 65 74 20 74 6f 20  Pathname set to 
2e7a0 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46  0..  */.  if( zF
2e7b0 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65  ilename && zFile
2e7c0 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 63  name[0] ){.    c
2e7d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
2e7e0 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70 56    nPathname = pV
2e7f0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
2e800 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20  ;.    zPathname 
2e810 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
2e820 63 52 61 77 28 30 2c 20 6e 50 61 74 68 6e 61 6d  cRaw(0, nPathnam
2e830 65 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 50  e*2);.    if( zP
2e840 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  athname==0 ){.  
2e850 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2e860 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
2e870 20 20 7d 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d    }.    zPathnam
2e880 65 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b  e[0] = 0; /* Mak
2e890 65 20 73 75 72 65 20 69 6e 69 74 69 61 6c 69 7a  e sure initializ
2e8a0 65 64 20 65 76 65 6e 20 69 66 20 46 75 6c 6c 50  ed even if FullP
2e8b0 61 74 68 6e 61 6d 65 28 29 20 66 61 69 6c 73 20  athname() fails 
2e8c0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
2e8d0 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d  te3OsFullPathnam
2e8e0 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d  e(pVfs, zFilenam
2e8f0 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50  e, nPathname, zP
2e900 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6e 50  athname);.    nP
2e910 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
2e920 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e  3Strlen30(zPathn
2e930 61 6d 65 29 3b 0a 20 20 20 20 7a 20 3d 20 7a 55  ame);.    z = zU
2e940 72 69 20 3d 20 26 7a 46 69 6c 65 6e 61 6d 65 5b  ri = &zFilename[
2e950 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
2e960 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 5d 3b 0a 20  zFilename)+1];. 
2e970 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a     while( *z ){.
2e980 20 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74        z += sqlit
2e990 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b  e3Strlen30(z)+1;
2e9a0 0a 20 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69  .      z += sqli
2e9b0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31  te3Strlen30(z)+1
2e9c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 55 72 69  ;.    }.    nUri
2e9d0 20 3d 20 28 69 6e 74 29 28 26 7a 5b 31 5d 20 2d   = (int)(&z[1] -
2e9e0 20 7a 55 72 69 29 3b 0a 20 20 20 20 61 73 73 65   zUri);.    asse
2e9f0 72 74 28 20 6e 55 72 69 3e 3d 30 20 29 3b 0a 20  rt( nUri>=0 );. 
2ea00 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2ea10 45 5f 4f 4b 20 26 26 20 6e 50 61 74 68 6e 61 6d  E_OK && nPathnam
2ea20 65 2b 38 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  e+8>pVfs->mxPath
2ea30 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  name ){.      /*
2ea40 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20   This branch is 
2ea50 74 61 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 6a  taken when the j
2ea60 6f 75 72 6e 61 6c 20 70 61 74 68 20 72 65 71 75  ournal path requ
2ea70 69 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a  ired by.      **
2ea80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
2ea90 69 6e 67 20 6f 70 65 6e 65 64 20 77 69 6c 6c 20  ing opened will 
2eaa0 62 65 20 6d 6f 72 65 20 74 68 61 6e 20 70 56 66  be more than pVf
2eab0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 20 20  s->mxPathname.  
2eac0 20 20 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20      ** bytes in 
2ead0 6c 65 6e 67 74 68 2e 20 54 68 69 73 20 6d 65 61  length. This mea
2eae0 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
2eaf0 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64  cannot be opened
2eb00 2c 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 74  ,.      ** as it
2eb10 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73   will not be pos
2eb20 73 69 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68  sible to open th
2eb30 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
2eb40 72 20 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20  r even.      ** 
2eb50 63 68 65 63 6b 20 66 6f 72 20 61 20 68 6f 74 2d  check for a hot-
2eb60 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 72  journal before r
2eb70 65 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f  eading..      */
2eb80 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
2eb90 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
2eba0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2ebb0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2ebc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
2ebd0 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d  Free(0, zPathnam
2ebe0 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
2ebf0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   rc;.    }.  }..
2ec00 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65    /* Allocate me
2ec10 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 50 61 67  mory for the Pag
2ec20 65 72 20 73 74 72 75 63 74 75 72 65 2c 20 50 43  er structure, PC
2ec30 61 63 68 65 20 6f 62 6a 65 63 74 2c 20 74 68 65  ache object, the
2ec40 0a 20 20 2a 2a 20 74 68 72 65 65 20 66 69 6c 65  .  ** three file
2ec50 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20 74 68   descriptors, th
2ec60 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2ec70 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 6a 6f 75  name and the jou
2ec80 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20  rnal .  ** file 
2ec90 6e 61 6d 65 2e 20 54 68 65 20 6c 61 79 6f 75 74  name. The layout
2eca0 20 69 6e 20 6d 65 6d 6f 72 79 20 69 73 20 61 73   in memory is as
2ecb0 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20   follows:.  **. 
2ecc0 20 2a 2a 20 20 20 20 20 50 61 67 65 72 20 6f 62   **     Pager ob
2ecd0 6a 65 63 74 20 20 20 20 20 20 20 20 20 20 20 20  ject            
2ece0 20 20 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28          (sizeof(
2ecf0 50 61 67 65 72 29 20 62 79 74 65 73 29 0a 20 20  Pager) bytes).  
2ed00 2a 2a 20 20 20 20 20 50 43 61 63 68 65 20 6f 62  **     PCache ob
2ed10 6a 65 63 74 20 20 20 20 20 20 20 20 20 20 20 20  ject            
2ed20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 50         (sqlite3P
2ed30 63 61 63 68 65 53 69 7a 65 28 29 20 62 79 74 65  cacheSize() byte
2ed40 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61  s).  **     Data
2ed50 62 61 73 65 20 66 69 6c 65 20 68 61 6e 64 6c 65  base file handle
2ed60 20 20 20 20 20 20 20 20 20 20 20 20 28 70 56 66              (pVf
2ed70 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 62 79 74 65  s->szOsFile byte
2ed80 73 29 0a 20 20 2a 2a 20 20 20 20 20 53 75 62 2d  s).  **     Sub-
2ed90 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e  journal file han
2eda0 64 6c 65 20 20 20 20 20 20 20 20 20 28 6a 6f 75  dle         (jou
2edb0 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74  rnalFileSize byt
2edc0 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4d 61 69  es).  **     Mai
2edd0 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  n journal file h
2ede0 61 6e 64 6c 65 20 20 20 20 20 20 20 20 28 6a 6f  andle        (jo
2edf0 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79  urnalFileSize by
2ee00 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61  tes).  **     Da
2ee10 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65  tabase file name
2ee20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e                (n
2ee30 50 61 74 68 6e 61 6d 65 2b 31 20 62 79 74 65 73  Pathname+1 bytes
2ee40 29 0a 20 20 2a 2a 20 20 20 20 20 4a 6f 75 72 6e  ).  **     Journ
2ee50 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20  al file name    
2ee60 20 20 20 20 20 20 20 20 20 20 20 28 6e 50 61 74             (nPat
2ee70 68 6e 61 6d 65 2b 38 2b 31 20 62 79 74 65 73 29  hname+8+1 bytes)
2ee80 0a 20 20 2a 2f 0a 20 20 70 50 74 72 20 3d 20 28  .  */.  pPtr = (
2ee90 75 38 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  u8 *)sqlite3Mall
2eea0 6f 63 5a 65 72 6f 28 0a 20 20 20 20 52 4f 55 4e  ocZero(.    ROUN
2eeb0 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65  D8(sizeof(*pPage
2eec0 72 29 29 20 2b 20 20 20 20 20 20 2f 2a 20 50 61  r)) +      /* Pa
2eed0 67 65 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ger structure */
2eee0 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 63 61 63  .    ROUND8(pcac
2eef0 68 65 53 69 7a 65 29 20 2b 20 20 20 20 20 20 20  heSize) +       
2ef00 20 20 20 20 2f 2a 20 50 43 61 63 68 65 20 6f 62      /* PCache ob
2ef10 6a 65 63 74 20 2a 2f 0a 20 20 20 20 52 4f 55 4e  ject */.    ROUN
2ef20 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  D8(pVfs->szOsFil
2ef30 65 29 20 2b 20 20 20 20 20 20 20 2f 2a 20 54 68  e) +       /* Th
2ef40 65 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 20 2a  e main db file *
2ef50 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c  /.    journalFil
2ef60 65 53 69 7a 65 20 2a 20 32 20 2b 20 20 20 20 20  eSize * 2 +     
2ef70 20 20 20 20 20 2f 2a 20 54 68 65 20 74 77 6f 20       /* The two 
2ef80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f  journal files */
2ef90 20 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20   .    nPathname 
2efa0 2b 20 31 20 2b 20 6e 55 72 69 20 2b 20 20 20 20  + 1 + nUri +    
2efb0 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d       /* zFilenam
2efc0 65 20 2a 2f 0a 20 20 20 20 6e 50 61 74 68 6e 61  e */.    nPathna
2efd0 6d 65 20 2b 20 38 20 2b 20 32 20 20 20 20 20 20  me + 8 + 2      
2efe0 20 20 20 20 20 20 20 20 2f 2a 20 7a 4a 6f 75 72          /* zJour
2eff0 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  nal */.#ifndef S
2f000 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
2f010 20 20 20 2b 20 6e 50 61 74 68 6e 61 6d 65 20 2b     + nPathname +
2f020 20 34 20 2b 20 32 20 20 20 20 20 20 20 20 20 20   4 + 2          
2f030 20 20 2f 2a 20 7a 57 61 6c 20 2a 2f 0a 23 65 6e    /* zWal */.#en
2f040 64 69 66 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  dif.  );.  asser
2f050 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
2f060 49 47 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f 49  IGNMENT(SQLITE_I
2f070 4e 54 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e 61  NT_TO_PTR(journa
2f080 6c 46 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a 20  lFileSize)) );. 
2f090 20 69 66 28 20 21 70 50 74 72 20 29 7b 0a 20 20   if( !pPtr ){.  
2f0a0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2f0b0 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  0, zPathname);. 
2f0c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2f0d0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d  _NOMEM_BKPT;.  }
2f0e0 0a 20 20 70 50 61 67 65 72 20 3d 20 20 20 20 20  .  pPager =     
2f0f0 20 20 20 20 20 20 20 20 20 28 50 61 67 65 72 2a           (Pager*
2f100 29 28 70 50 74 72 29 3b 0a 20 20 70 50 61 67 65  )(pPtr);.  pPage
2f110 72 2d 3e 70 50 43 61 63 68 65 20 3d 20 20 20 20  r->pPCache =    
2f120 28 50 43 61 63 68 65 2a 29 28 70 50 74 72 20 2b  (PCache*)(pPtr +
2f130 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  = ROUND8(sizeof(
2f140 2a 70 50 61 67 65 72 29 29 29 3b 0a 20 20 70 50  *pPager)));.  pP
2f150 61 67 65 72 2d 3e 66 64 20 3d 20 20 20 28 73 71  ager->fd =   (sq
2f160 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74  lite3_file*)(pPt
2f170 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 63 61 63  r += ROUND8(pcac
2f180 68 65 53 69 7a 65 29 29 3b 0a 20 20 70 50 61 67  heSize));.  pPag
2f190 65 72 2d 3e 73 6a 66 64 20 3d 20 28 73 71 6c 69  er->sjfd = (sqli
2f1a0 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20  te3_file*)(pPtr 
2f1b0 2b 3d 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e  += ROUND8(pVfs->
2f1c0 73 7a 4f 73 46 69 6c 65 29 29 3b 0a 20 20 70 50  szOsFile));.  pP
2f1d0 61 67 65 72 2d 3e 6a 66 64 20 3d 20 20 28 73 71  ager->jfd =  (sq
2f1e0 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74  lite3_file*)(pPt
2f1f0 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  r += journalFile
2f200 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 72 2d  Size);.  pPager-
2f210 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 20 20 20  >zFilename =    
2f220 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20  (char*)(pPtr += 
2f230 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29  journalFileSize)
2f240 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
2f250 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
2f260 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
2f270 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74  ..  /* Fill in t
2f280 68 65 20 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61  he Pager.zFilena
2f290 6d 65 20 61 6e 64 20 50 61 67 65 72 2e 7a 4a 6f  me and Pager.zJo
2f2a0 75 72 6e 61 6c 20 62 75 66 66 65 72 73 2c 20 69  urnal buffers, i
2f2b0 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  f required. */. 
2f2c0 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 20 29   if( zPathname )
2f2d0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 50  {.    assert( nP
2f2e0 61 74 68 6e 61 6d 65 3e 30 20 29 3b 0a 20 20 20  athname>0 );.   
2f2f0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
2f300 6c 20 3d 20 20 20 28 63 68 61 72 2a 29 28 70 50  l =   (char*)(pP
2f310 74 72 20 2b 3d 20 6e 50 61 74 68 6e 61 6d 65 20  tr += nPathname 
2f320 2b 20 31 20 2b 20 6e 55 72 69 29 3b 0a 20 20 20  + 1 + nUri);.   
2f330 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
2f340 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68  zFilename, zPath
2f350 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29  name, nPathname)
2f360 3b 0a 20 20 20 20 69 66 28 20 6e 55 72 69 20 29  ;.    if( nUri )
2f370 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
2f380 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50 61 74 68  >zFilename[nPath
2f390 6e 61 6d 65 2b 31 5d 2c 20 7a 55 72 69 2c 20 6e  name+1], zUri, n
2f3a0 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  Uri);.    memcpy
2f3b0 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
2f3c0 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50  l, zPathname, nP
2f3d0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65  athname);.    me
2f3e0 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a  mcpy(&pPager->zJ
2f3f0 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65  ournal[nPathname
2f400 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 5c 30 30 30  ], "-journal\000
2f410 22 2c 20 38 2b 32 29 3b 0a 20 20 20 20 73 71 6c  ", 8+2);.    sql
2f420 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28  ite3FileSuffix3(
2f430 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2f440 65 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  e, pPager->zJour
2f450 6e 61 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  nal);.#ifndef SQ
2f460 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
2f470 20 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 20 3d    pPager->zWal =
2f480 20 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e   &pPager->zJourn
2f490 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31  al[nPathname+8+1
2f4a0 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50  ];.    memcpy(pP
2f4b0 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 7a 50 61 74  ager->zWal, zPat
2f4c0 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  hname, nPathname
2f4d0 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70  );.    memcpy(&p
2f4e0 50 61 67 65 72 2d 3e 7a 57 61 6c 5b 6e 50 61 74  Pager->zWal[nPat
2f4f0 68 6e 61 6d 65 5d 2c 20 22 2d 77 61 6c 5c 30 30  hname], "-wal\00
2f500 30 22 2c 20 34 2b 31 29 3b 0a 20 20 20 20 73 71  0", 4+1);.    sq
2f510 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33  lite3FileSuffix3
2f520 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
2f530 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c  me, pPager->zWal
2f540 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71  );.#endif.    sq
2f550 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a  lite3DbFree(0, z
2f560 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20  Pathname);.  }. 
2f570 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20 3d 20   pPager->pVfs = 
2f580 70 56 66 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e  pVfs;.  pPager->
2f590 76 66 73 46 6c 61 67 73 20 3d 20 76 66 73 46 6c  vfsFlags = vfsFl
2f5a0 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  ags;..  /* Open 
2f5b0 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a  the pager file..
2f5c0 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65    */.  if( zFile
2f5d0 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
2f5e0 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20  e[0] ){.    int 
2f5f0 66 6f 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20  fout = 0;       
2f600 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f610 56 46 53 20 66 6c 61 67 73 20 72 65 74 75 72 6e  VFS flags return
2f620 65 64 20 62 79 20 78 4f 70 65 6e 28 29 20 2a 2f  ed by xOpen() */
2f630 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2f640 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50  3OsOpen(pVfs, pP
2f650 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
2f660 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 76 66 73   pPager->fd, vfs
2f670 46 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a 20  Flags, &fout);. 
2f680 20 20 20 61 73 73 65 72 74 28 20 21 6d 65 6d 44     assert( !memD
2f690 62 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  b );.#ifdef SQLI
2f6a0 54 45 5f 45 4e 41 42 4c 45 5f 44 45 53 45 52 49  TE_ENABLE_DESERI
2f6b0 41 4c 49 5a 45 0a 20 20 20 20 6d 65 6d 4a 4d 20  ALIZE.    memJM 
2f6c0 3d 20 28 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f  = (fout&SQLITE_O
2f6d0 50 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a  PEN_MEMORY)!=0;.
2f6e0 23 65 6e 64 69 66 0a 20 20 20 20 72 65 61 64 4f  #endif.    readO
2f6f0 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53 51 4c 49  nly = (fout&SQLI
2f700 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
2f710 29 21 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  )!=0;..    /* If
2f720 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 73 75   the file was su
2f730 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65  ccessfully opene
2f740 64 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65  d for read/write
2f750 20 61 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20   access,.    ** 
2f760 63 68 6f 6f 73 65 20 61 20 64 65 66 61 75 6c 74  choose a default
2f770 20 70 61 67 65 20 73 69 7a 65 20 69 6e 20 63 61   page size in ca
2f780 73 65 20 77 65 20 68 61 76 65 20 74 6f 20 63 72  se we have to cr
2f790 65 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  eate the.    ** 
2f7a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
2f7b0 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20  he default page 
2f7c0 73 69 7a 65 20 69 73 20 74 68 65 20 6d 61 78 69  size is the maxi
2f7d0 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20  mum of:.    **. 
2f7e0 20 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54     **    + SQLIT
2f7f0 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
2f800 49 5a 45 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b  IZE,.    **    +
2f810 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
2f820 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73  ned by sqlite3Os
2f830 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20  SectorSize().   
2f840 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72   **    + The lar
2f850 67 65 73 74 20 70 61 67 65 20 73 69 7a 65 20 74  gest page size t
2f860 68 61 74 20 63 61 6e 20 62 65 20 77 72 69 74 74  hat can be writt
2f870 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20  en atomically.. 
2f880 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
2f890 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2f8a0 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73       int iDc = s
2f8b0 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
2f8c0 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
2f8d0 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20  ager->fd);.     
2f8e0 20 69 66 28 20 21 72 65 61 64 4f 6e 6c 79 20 29   if( !readOnly )
2f8f0 7b 0a 20 20 20 20 20 20 20 20 73 65 74 53 65 63  {.        setSec
2f900 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b  torSize(pPager);
2f910 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2f920 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
2f930 41 47 45 5f 53 49 5a 45 3c 3d 53 51 4c 49 54 45  AGE_SIZE<=SQLITE
2f940 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
2f950 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 20  E_SIZE);.       
2f960 20 69 66 28 20 73 7a 50 61 67 65 44 66 6c 74 3c   if( szPageDflt<
2f970 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
2f980 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
2f990 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74  if( pPager->sect
2f9a0 6f 72 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  orSize>SQLITE_MA
2f9b0 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
2f9c0 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  IZE ){.         
2f9d0 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20     szPageDflt = 
2f9e0 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
2f9f0 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20  LT_PAGE_SIZE;.  
2fa00 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2fa10 20 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67             szPag
2fa20 65 44 66 6c 74 20 3d 20 28 75 33 32 29 70 50 61  eDflt = (u32)pPa
2fa30 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b  ger->sectorSize;
2fa40 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2fa50 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51       }.#ifdef SQ
2fa60 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
2fa70 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20 20  IC_WRITE.       
2fa80 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74   {.          int
2fa90 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 61   ii;.          a
2faa0 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
2fab0 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35  AP_ATOMIC512==(5
2fac0 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20  12>>8));.       
2fad0 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
2fae0 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b  _IOCAP_ATOMIC64K
2faf0 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20  ==(65536>>8));. 
2fb00 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2fb10 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
2fb20 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35  LT_PAGE_SIZE<=65
2fb30 35 33 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20  536);.          
2fb40 66 6f 72 28 69 69 3d 73 7a 50 61 67 65 44 66 6c  for(ii=szPageDfl
2fb50 74 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41  t; ii<=SQLITE_MA
2fb60 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
2fb70 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20  IZE; ii=ii*2){. 
2fb80 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
2fb90 44 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  Dc&(SQLITE_IOCAP
2fba0 5f 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29  _ATOMIC|(ii>>8))
2fbb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2fbc0 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 69    szPageDflt = i
2fbd0 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  i;.            }
2fbe0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2fbf0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
2fc00 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
2fc10 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d 20 73 71 6c  er->noLock = sql
2fc20 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e  ite3_uri_boolean
2fc30 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 6e 6f 6c  (zFilename, "nol
2fc40 6f 63 6b 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  ock", 0);.      
2fc50 69 66 28 20 28 69 44 63 20 26 20 53 51 4c 49 54  if( (iDc & SQLIT
2fc60 45 5f 49 4f 43 41 50 5f 49 4d 4d 55 54 41 42 4c  E_IOCAP_IMMUTABL
2fc70 45 29 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  E)!=0.       || 
2fc80 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c  sqlite3_uri_bool
2fc90 65 61 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22  ean(zFilename, "
2fca0 69 6d 6d 75 74 61 62 6c 65 22 2c 20 30 29 20 29  immutable", 0) )
2fcb0 7b 0a 20 20 20 20 20 20 20 20 20 20 76 66 73 46  {.          vfsF
2fcc0 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
2fcd0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  PEN_READONLY;.  
2fce0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 63 74          goto act
2fcf0 5f 6c 69 6b 65 5f 74 65 6d 70 5f 66 69 6c 65 3b  _like_temp_file;
2fd00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2fd10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
2fd20 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  f a temporary fi
2fd30 6c 65 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  le is requested,
2fd40 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65   it is not opene
2fd50 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  d immediately.. 
2fd60 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61     ** In this ca
2fd70 73 65 20 77 65 20 61 63 63 65 70 74 20 74 68 65  se we accept the
2fd80 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69   default page si
2fd90 7a 65 20 61 6e 64 20 64 65 6c 61 79 20 61 63 74  ze and delay act
2fda0 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65  ually.    ** ope
2fdb0 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20 75 6e  ning the file un
2fdc0 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 63 61  til the first ca
2fdd0 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65 28 29 2e  ll to OsWrite().
2fde0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
2fdf0 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 61 6c  his branch is al
2fe00 73 6f 20 72 75 6e 20 66 6f 72 20 61 6e 20 69 6e  so run for an in
2fe10 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
2fe20 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20  . An in-memory. 
2fe30 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
2fe40 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 20  s the same as a 
2fe50 74 65 6d 70 2d 66 69 6c 65 20 74 68 61 74 20 69  temp-file that i
2fe60 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20  s never written 
2fe70 6f 75 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69  out to.    ** di
2fe80 73 6b 20 61 6e 64 20 75 73 65 73 20 61 6e 20 69  sk and uses an i
2fe90 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62 61 63  n-memory rollbac
2fea0 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a  k journal..    *
2feb0 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62 72  *.    ** This br
2fec0 61 6e 63 68 20 61 6c 73 6f 20 72 75 6e 73 20 66  anch also runs f
2fed0 6f 72 20 66 69 6c 65 73 20 6d 61 72 6b 65 64 20  or files marked 
2fee0 61 73 20 69 6d 6d 75 74 61 62 6c 65 2e 0a 20 20  as immutable..  
2fef0 20 20 2a 2f 20 0a 61 63 74 5f 6c 69 6b 65 5f 74    */ .act_like_t
2ff00 65 6d 70 5f 66 69 6c 65 3a 0a 20 20 20 20 74 65  emp_file:.    te
2ff10 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20  mpFile = 1;.    
2ff20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
2ff30 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b 20 20   PAGER_READER;  
2ff40 20 20 20 2f 2a 20 50 72 65 74 65 6e 64 20 77 65     /* Pretend we
2ff50 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20   already have a 
2ff60 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 70 50 61 67  lock */.    pPag
2ff70 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 45 58 43 4c  er->eLock = EXCL
2ff80 55 53 49 56 45 5f 4c 4f 43 4b 3b 20 20 20 20 2f  USIVE_LOCK;    /
2ff90 2a 20 50 72 65 74 65 6e 64 20 77 65 20 61 72 65  * Pretend we are
2ffa0 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20 6d 6f   in EXCLUSIVE mo
2ffb0 64 65 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72  de */.    pPager
2ffc0 2d 3e 6e 6f 4c 6f 63 6b 20 3d 20 31 3b 20 20 20  ->noLock = 1;   
2ffd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ffe0 44 6f 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 2a 2f  Do no locking */
2fff0 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20  .    readOnly = 
30000 28 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45  (vfsFlags&SQLITE
30010 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b  _OPEN_READONLY);
30020 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66  .  }..  /* The f
30030 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f  ollowing call to
30040 20 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a   PagerSetPagesiz
30050 65 28 29 20 73 65 72 76 65 73 20 74 6f 20 73 65  e() serves to se
30060 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 0a  t the value of .
30070 20 20 2a 2a 20 50 61 67 65 72 2e 70 61 67 65 53    ** Pager.pageS
30080 69 7a 65 20 61 6e 64 20 74 6f 20 61 6c 6c 6f 63  ize and to alloc
30090 61 74 65 20 74 68 65 20 50 61 67 65 72 2e 70 54  ate the Pager.pT
300a0 6d 70 53 70 61 63 65 20 62 75 66 66 65 72 2e 0a  mpSpace buffer..
300b0 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
300c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
300d0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
300e0 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20  memDb==0 );.    
300f0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
30100 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50 61  rSetPagesize(pPa
30110 67 65 72 2c 20 26 73 7a 50 61 67 65 44 66 6c 74  ger, &szPageDflt
30120 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63  , -1);.    testc
30130 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
30140 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OK );.  }..  /* 
30150 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 50  Initialize the P
30160 43 61 63 68 65 20 6f 62 6a 65 63 74 2e 20 2a 2f  Cache object. */
30170 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
30180 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6e 45 78 74  E_OK ){.    nExt
30190 72 61 20 3d 20 52 4f 55 4e 44 38 28 6e 45 78 74  ra = ROUND8(nExt
301a0 72 61 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ra);.    assert(
301b0 20 6e 45 78 74 72 61 3e 3d 38 20 26 26 20 6e 45   nExtra>=8 && nE
301c0 78 74 72 61 3c 31 30 30 30 20 29 3b 0a 20 20 20  xtra<1000 );.   
301d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61   rc = sqlite3Pca
301e0 63 68 65 4f 70 65 6e 28 73 7a 50 61 67 65 44 66  cheOpen(szPageDf
301f0 6c 74 2c 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d  lt, nExtra, !mem
30200 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Db,.            
30210 20 20 20 20 20 20 20 20 20 20 20 21 6d 65 6d 44             !memD
30220 62 3f 70 61 67 65 72 53 74 72 65 73 73 3a 30 2c  b?pagerStress:0,
30230 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c   (void *)pPager,
30240 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65   pPager->pPCache
30250 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
30260 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  an error occurre
30270 64 20 61 62 6f 76 65 2c 20 66 72 65 65 20 74 68  d above, free th
30280 65 20 20 50 61 67 65 72 20 73 74 72 75 63 74 75  e  Pager structu
30290 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65  re and close the
302a0 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
302b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
302c0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
302d0 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64  Close(pPager->fd
302e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
302f0 67 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70  geFree(pPager->p
30300 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 73  TmpSpace);.    s
30310 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
30320 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  er);.    return 
30330 72 63 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52  rc;.  }..  PAGER
30340 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20  TRACE(("OPEN %d 
30350 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c  %s\n", FILEHANDL
30360 45 49 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c  EID(pPager->fd),
30370 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
30380 6d 65 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  me));.  IOTRACE(
30390 28 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c  ("OPEN %p %s\n",
303a0 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d   pPager, pPager-
303b0 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20  >zFilename))..  
303c0 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
303d0 61 6c 20 3d 20 28 75 38 29 75 73 65 4a 6f 75 72  al = (u8)useJour
303e0 6e 61 6c 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  nal;.  /* pPager
303f0 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20  ->stmtOpen = 0; 
30400 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
30410 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a  stmtInUse = 0; *
30420 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e  /.  /* pPager->n
30430 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  Ref = 0; */.  /*
30440 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
30450 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
30460 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
30470 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
30480 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b  ager->nPage = 0;
30490 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78   */.  pPager->mx
304a0 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41  Pgno = SQLITE_MA
304b0 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20  X_PAGE_COUNT;.  
304c0 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  /* pPager->state
304d0 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b   = PAGER_UNLOCK;
304e0 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
304f0 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f  >errMask = 0; */
30500 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  .  pPager->tempF
30510 69 6c 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69  ile = (u8)tempFi
30520 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65  le;.  assert( te
30530 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f  mpFile==PAGER_LO
30540 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
30550 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74   .          || t
30560 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c  empFile==PAGER_L
30570 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
30580 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74  SIVE );.  assert
30590 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ( PAGER_LOCKINGM
305a0 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31  ODE_EXCLUSIVE==1
305b0 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78   );.  pPager->ex
305c0 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 28 75  clusiveMode = (u
305d0 38 29 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70  8)tempFile; .  p
305e0 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
305f0 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d  ntDone = pPager-
30600 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61  >tempFile;.  pPa
30610 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 28 75 38  ger->memDb = (u8
30620 29 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72  )memDb;.  pPager
30630 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 28 75 38  ->readOnly = (u8
30640 29 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 61 73 73  )readOnly;.  ass
30650 65 72 74 28 20 75 73 65 4a 6f 75 72 6e 61 6c 20  ert( useJournal 
30660 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
30670 69 6c 65 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  ile );.  pPager-
30680 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72  >noSync = pPager
30690 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 69 66  ->tempFile;.  if
306a0 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  ( pPager->noSync
306b0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
306c0 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
306d0 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
306e0 74 28 20 70 50 61 67 65 72 2d 3e 65 78 74 72 61  t( pPager->extra
306f0 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Sync==0 );.    a
30700 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
30710 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20  yncFlags==0 );. 
30720 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
30730 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 3d  r->walSyncFlags=
30740 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  =0 );.  }else{. 
30750 20 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53     pPager->fullS
30760 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  ync = 1;.    pPa
30770 67 65 72 2d 3e 65 78 74 72 61 53 79 6e 63 20 3d  ger->extraSync =
30780 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
30790 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49  syncFlags = SQLI
307a0 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a  TE_SYNC_NORMAL;.
307b0 20 20 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53      pPager->walS
307c0 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
307d0 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 7c 20  E_SYNC_NORMAL | 
307e0 28 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52  (SQLITE_SYNC_NOR
307f0 4d 41 4c 3c 3c 32 29 3b 0a 20 20 7d 0a 20 20 2f  MAL<<2);.  }.  /
30800 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  * pPager->pFirst
30810 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
30820 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
30830 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ed = 0; */.  /* 
30840 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
30850 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
30860 6e 45 78 74 72 61 20 3d 20 28 75 31 36 29 6e 45  nExtra = (u16)nE
30870 78 74 72 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e  xtra;.  pPager->
30880 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
30890 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
308a0 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c  T_JOURNAL_SIZE_L
308b0 49 4d 49 54 3b 0a 20 20 61 73 73 65 72 74 28 20  IMIT;.  assert( 
308c0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
308d0 64 29 20 7c 7c 20 74 65 6d 70 46 69 6c 65 20 29  d) || tempFile )
308e0 3b 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a  ;.  setSectorSiz
308f0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  e(pPager);.  if(
30900 20 21 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a   !useJournal ){.
30910 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
30920 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f  nalMode = PAGER_
30930 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b  JOURNALMODE_OFF;
30940 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d  .  }else if( mem
30950 44 62 20 7c 7c 20 6d 65 6d 4a 4d 20 29 7b 0a 20  Db || memJM ){. 
30960 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
30970 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a  alMode = PAGER_J
30980 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
30990 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67  Y;.  }.  /* pPag
309a0 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72  er->xBusyHandler
309b0 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
309c0 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
309d0 65 72 41 72 67 20 3d 20 30 3b 20 2a 2f 0a 20 20  erArg = 0; */.  
309e0 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
309f0 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 20 20 73  r = xReinit;.  s
30a00 65 74 47 65 74 74 65 72 4d 65 74 68 6f 64 28 70  etGetterMethod(p
30a10 50 61 67 65 72 29 3b 0a 20 20 2f 2a 20 6d 65 6d  Pager);.  /* mem
30a20 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73  set(pPager->aHas
30a30 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61  h, 0, sizeof(pPa
30a40 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f  ger->aHash)); */
30a50 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 7a  .  /* pPager->sz
30a60 4d 6d 61 70 20 3d 20 53 51 4c 49 54 45 5f 44 45  Mmap = SQLITE_DE
30a70 46 41 55 4c 54 5f 4d 4d 41 50 5f 53 49 5a 45 20  FAULT_MMAP_SIZE 
30a80 2f 2f 20 77 69 6c 6c 20 62 65 20 73 65 74 20 62  // will be set b
30a90 79 20 62 74 72 65 65 2e 63 20 2a 2f 0a 0a 20 20  y btree.c */..  
30aa0 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  *ppPager = pPage
30ab0 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  r;.  return SQLI
30ac0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a  TE_OK;.}..../*.*
30ad0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
30ae0 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
30af0 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72  transitioning fr
30b00 6f 6d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  om PAGER_UNLOCK 
30b10 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 53 48 41 52  to.** PAGER_SHAR
30b20 45 44 20 73 74 61 74 65 2e 20 49 74 20 74 65 73  ED state. It tes
30b30 74 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ts if there is a
30b40 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 70 72 65   hot journal pre
30b50 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 66  sent in.** the f
30b60 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72 20 74  ile-system for t
30b70 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 20  he given pager. 
30b80 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73  A hot journal is
30b90 20 6f 6e 65 20 74 68 61 74 20 0a 2a 2a 20 6e 65   one that .** ne
30ba0 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64  eds to be played
30bb0 20 62 61 63 6b 2e 20 41 63 63 6f 72 64 69 6e 67   back. According
30bc0 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
30bd0 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  n, a hot-journal
30be0 0a 2a 2a 20 66 69 6c 65 20 65 78 69 73 74 73 20  .** file exists 
30bf0 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  if the following
30c00 20 63 72 69 74 65 72 69 61 20 61 72 65 20 6d 65   criteria are me
30c10 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65  t:.**.**   * The
30c20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
30c30 69 73 74 73 20 69 6e 20 74 68 65 20 66 69 6c 65  ists in the file
30c40 20 73 79 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20   system, and.** 
30c50 20 20 2a 20 4e 6f 20 70 72 6f 63 65 73 73 20 68    * No process h
30c60 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45 44 20  olds a RESERVED 
30c70 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
30c80 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
30c90 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a  file, and.**   *
30ca0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
30cb0 6c 65 20 69 74 73 65 6c 66 20 69 73 20 67 72 65  le itself is gre
30cc0 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65  ater than 0 byte
30cd0 73 20 69 6e 20 73 69 7a 65 2c 20 61 6e 64 0a 2a  s in size, and.*
30ce0 2a 20 20 20 2a 20 54 68 65 20 66 69 72 73 74 20  *   * The first 
30cf0 62 79 74 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  byte of the jour
30d00 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  nal file exists 
30d10 61 6e 64 20 69 73 20 6e 6f 74 20 30 78 30 30 2e  and is not 0x00.
30d20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
30d30 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68  rrent size of th
30d40 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
30d50 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e  is 0 but a journ
30d60 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74  al file.** exist
30d70 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62 61  s, that is proba
30d80 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e  bly an old journ
30d90 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f  al left over fro
30da0 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74  m a prior.** dat
30db0 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73  abase with the s
30dc0 61 6d 65 20 6e 61 6d 65 2e 20 49 6e 20 74 68 69  ame name. In thi
30dd0 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e  s case the journ
30de0 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 6a 75  al file is.** ju
30df0 73 74 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67  st deleted using
30e00 20 4f 73 44 65 6c 65 74 65 2c 20 2a 70 45 78 69   OsDelete, *pExi
30e10 73 74 73 20 69 73 20 73 65 74 20 74 6f 20 30 20  sts is set to 0 
30e20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  and SQLITE_OK.**
30e30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
30e40 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
30e50 20 64 6f 65 73 20 6e 6f 74 20 63 68 65 63 6b 20   does not check 
30e60 69 66 20 74 68 65 72 65 20 69 73 20 61 20 6d 61  if there is a ma
30e70 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
30e80 65 6e 61 6d 65 0a 2a 2a 20 61 74 20 74 68 65 20  ename.** at the 
30e90 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2e  end of the file.
30ea0 20 49 66 20 74 68 65 72 65 20 69 73 2c 20 61 6e   If there is, an
30eb0 64 20 74 68 61 74 20 6d 61 73 74 65 72 20 6a 6f  d that master jo
30ec0 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f  urnal file.** do
30ed0 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68  es not exist, th
30ee0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
30ef0 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c  ile is not reall
30f00 79 20 68 6f 74 2e 20 49 6e 20 74 68 69 73 0a 2a  y hot. In this.*
30f10 2a 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74  * case this rout
30f20 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  ine will return 
30f30 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65  a false-positive
30f40 2e 20 54 68 65 20 70 61 67 65 72 5f 70 6c 61 79  . The pager_play
30f50 62 61 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  back().** routin
30f60 65 20 77 69 6c 6c 20 64 69 73 63 6f 76 65 72 20  e will discover 
30f70 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
30f80 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61   file is not rea
30f90 6c 6c 79 20 68 6f 74 20 61 6e 64 20 0a 2a 2a 20  lly hot and .** 
30fa0 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69 74  will not roll it
30fb0 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66   back. .**.** If
30fc0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66   a hot-journal f
30fd0 69 6c 65 20 69 73 20 66 6f 75 6e 64 20 74 6f 20  ile is found to 
30fe0 65 78 69 73 74 2c 20 2a 70 45 78 69 73 74 73 20  exist, *pExists 
30ff0 69 73 20 73 65 74 20 74 6f 20 31 20 61 6e 64 20  is set to 1 and 
31000 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  .** SQLITE_OK re
31010 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 20 68 6f  turned. If no ho
31020 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  t-journal file i
31030 73 20 70 72 65 73 65 6e 74 2c 20 2a 70 45 78 69  s present, *pExi
31040 73 74 73 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  sts is.** set to
31050 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b   0 and SQLITE_OK
31060 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
31070 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
31080 20 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a   while trying.**
31090 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68   to determine wh
310a0 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 68  ether or not a h
310b0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
310c0 65 78 69 73 74 73 2c 20 74 68 65 20 49 4f 20 65  exists, the IO e
310d0 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 73 20  rror.** code is 
310e0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
310f0 20 76 61 6c 75 65 20 6f 66 20 2a 70 45 78 69 73   value of *pExis
31100 74 73 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e  ts is undefined.
31110 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68  .*/.static int h
31120 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67  asHotJournal(Pag
31130 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
31140 2a 70 45 78 69 73 74 73 2c 20 69 6e 74 20 2a 70  *pExists, int *p
31150 65 53 65 72 76 65 72 29 7b 0a 20 20 73 71 6c 69  eServer){.  sqli
31160 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20  te3_vfs * const 
31170 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
31180 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Vfs;.  int rc = 
31190 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
311a0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
311b0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65 78 69  ode */.  int exi
311c0 73 74 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20  sts = 1;        
311d0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
311e0 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  f a journal file
311f0 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
31200 20 69 6e 74 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20   int jrnlOpen = 
31210 21 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  !!isOpen(pPager-
31220 3e 6a 66 64 29 3b 0a 0a 20 20 61 73 73 65 72 74  >jfd);..  assert
31230 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
31240 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  rnal );.  assert
31250 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
31260 3e 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74  >fd) );.  assert
31270 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
31280 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  ==PAGER_OPEN );.
31290 0a 20 20 61 73 73 65 72 74 28 20 6a 72 6e 6c 4f  .  assert( jrnlO
312a0 70 65 6e 3d 3d 30 20 7c 7c 20 28 20 73 71 6c 69  pen==0 || ( sqli
312b0 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
312c0 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
312d0 72 2d 3e 6a 66 64 29 20 26 0a 20 20 20 20 53 51  r->jfd) &.    SQ
312e0 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c  LITE_IOCAP_UNDEL
312f0 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e  ETABLE_WHEN_OPEN
31300 0a 20 20 29 29 3b 0a 0a 20 20 2a 70 45 78 69 73  .  ));..  *pExis
31310 74 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 6a  ts = 0;.  if( !j
31320 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72  rnlOpen ){.    r
31330 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
31340 65 73 73 28 70 56 66 73 2c 20 70 50 61 67 65 72  ess(pVfs, pPager
31350 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49  ->zJournal, SQLI
31360 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
31370 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20 7d 0a  , &exists);.  }.
31380 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
31390 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20 29 7b  _OK && exists ){
313a0 0a 20 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64 20  .    int locked 
313b0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
313c0 20 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 6d 65   /* True if some
313d0 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61   process holds a
313e0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a   RESERVED lock *
313f0 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
31400 5f 53 45 52 56 45 52 5f 45 44 49 54 49 4f 4e 0a  _SERVER_EDITION.
31410 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
31420 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50  OsFileControl(pP
31430 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45  ager->fd, SQLITE
31440 5f 46 43 4e 54 4c 5f 53 45 52 56 45 52 5f 4d 4f  _FCNTL_SERVER_MO
31450 44 45 2c 20 70 65 53 65 72 76 65 72 29 3b 0a 20  DE, peServer);. 
31460 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
31470 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a 20 20  E_NOTFOUND ){.  
31480 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
31490 54 45 5f 4f 4b 20 7c 7c 20 2a 70 65 53 65 72 76  TE_OK || *peServ
314a0 65 72 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  er ) return rc;.
314b0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
314c0 20 20 2f 2a 20 52 61 63 65 20 63 6f 6e 64 69 74    /* Race condit
314d0 69 6f 6e 20 68 65 72 65 3a 20 20 41 6e 6f 74 68  ion here:  Anoth
314e0 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74  er process might
314f0 20 68 61 76 65 20 62 65 65 6e 20 68 6f 6c 64 69   have been holdi
31500 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 68  ng the.    ** th
31510 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  e RESERVED lock 
31520 61 6e 64 20 68 61 76 65 20 61 20 6a 6f 75 72 6e  and have a journ
31530 61 6c 20 6f 70 65 6e 20 61 74 20 74 68 65 20 73  al open at the s
31540 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29  qlite3OsAccess()
31550 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62   .    ** call ab
31560 6f 76 65 2c 20 62 75 74 20 74 68 65 6e 20 64 65  ove, but then de
31570 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
31580 20 61 6e 64 20 64 72 6f 70 20 74 68 65 20 6c 6f   and drop the lo
31590 63 6b 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a  ck before.    **
315a0 20 77 65 20 67 65 74 20 74 6f 20 74 68 65 20 66   we get to the f
315b0 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33  ollowing sqlite3
315c0 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  OsCheckReservedL
315d0 6f 63 6b 28 29 20 63 61 6c 6c 2e 20 20 49 66 20  ock() call.  If 
315e0 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 73 20 74  that.    ** is t
315f0 68 65 20 63 61 73 65 2c 20 74 68 69 73 20 72 6f  he case, this ro
31600 75 74 69 6e 65 20 6d 69 67 68 74 20 74 68 69 6e  utine might thin
31610 6b 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74  k there is a hot
31620 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 0a 20 20   journal when.  
31630 20 20 2a 2a 20 69 6e 20 66 61 63 74 20 74 68 65    ** in fact the
31640 72 65 20 69 73 20 6e 6f 6e 65 2e 20 20 54 68 69  re is none.  Thi
31650 73 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 66  s results in a f
31660 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 20 77 68  alse-positive wh
31670 69 63 68 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  ich will.    ** 
31680 62 65 20 64 65 61 6c 74 20 77 69 74 68 20 62 79  be dealt with by
31690 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20 72 6f   the playback ro
316a0 75 74 69 6e 65 2e 20 20 54 69 63 6b 65 74 20 23  utine.  Ticket #
316b0 33 38 38 33 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  3883..    */.   
316c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 43   rc = sqlite3OsC
316d0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
316e0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f  (pPager->fd, &lo
316f0 63 6b 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72  cked);.    if( r
31700 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
31710 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 20  !locked ){.     
31720 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20   Pgno nPage;    
31730 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31740 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
31750 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
31760 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73 65 72   */..      asser
31770 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  t( pPager->tempF
31780 69 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ile==0 );.      
31790 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  rc = pagerPageco
317a0 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61  unt(pPager, &nPa
317b0 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
317c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
317d0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
317e0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 7a 65  e database is ze
317f0 72 6f 20 70 61 67 65 73 20 69 6e 20 73 69 7a 65  ro pages in size
31800 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61  , that means tha
31810 74 20 65 69 74 68 65 72 20 28 31 29 20 74 68 65  t either (1) the
31820 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72  .        ** jour
31830 6e 61 6c 20 69 73 20 61 20 72 65 6d 6e 61 6e 74  nal is a remnant
31840 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 64 61   from a prior da
31850 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20  tabase with the 
31860 73 61 6d 65 20 6e 61 6d 65 20 77 68 65 72 65 0a  same name where.
31870 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64          ** the d
31880 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 75 74  atabase file but
31890 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c   not the journal
318a0 20 77 61 73 20 64 65 6c 65 74 65 64 2c 20 6f 72   was deleted, or
318b0 20 28 32 29 20 74 68 65 20 69 6e 69 74 69 61 6c   (2) the initial
318c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e  .        ** tran
318d0 73 61 63 74 69 6f 6e 20 74 68 61 74 20 70 6f 70  saction that pop
318e0 75 6c 61 74 65 73 20 61 20 6e 65 77 20 64 61 74  ulates a new dat
318f0 61 62 61 73 65 20 69 73 20 62 65 69 6e 67 20 72  abase is being r
31900 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20  olled back..    
31910 20 20 20 20 2a 2a 20 49 6e 20 65 69 74 68 65 72      ** In either
31920 20 63 61 73 65 2c 20 74 68 65 20 6a 6f 75 72 6e   case, the journ
31930 61 6c 20 66 69 6c 65 20 63 61 6e 20 62 65 20 64  al file can be d
31940 65 6c 65 74 65 64 2e 20 20 48 6f 77 65 76 65 72  eleted.  However
31950 2c 20 74 61 6b 65 20 63 61 72 65 0a 20 20 20 20  , take care.    
31960 20 20 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 64 65      ** not to de
31970 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
31980 20 66 69 6c 65 20 69 66 20 69 74 20 69 73 20 61   file if it is a
31990 6c 72 65 61 64 79 20 6f 70 65 6e 20 64 75 65 20  lready open due 
319a0 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f  to.        ** jo
319b0 75 72 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49  urnal_mode=PERSI
319c0 53 54 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ST..        */. 
319d0 20 20 20 20 20 20 20 69 66 28 20 6e 50 61 67 65         if( nPage
319e0 3d 3d 30 20 26 26 20 21 6a 72 6e 6c 4f 70 65 6e  ==0 && !jrnlOpen
319f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
31a00 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
31a10 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
31a20 20 20 20 20 69 66 28 20 70 61 67 65 72 4c 6f 63      if( pagerLoc
31a30 6b 44 62 28 70 50 61 67 65 72 2c 20 52 45 53 45  kDb(pPager, RESE
31a40 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49  RVED_LOCK)==SQLI
31a50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
31a60 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
31a70 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61 67 65  lete(pVfs, pPage
31a80 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b  r->zJournal, 0);
31a90 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
31aa0 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
31ab0 69 76 65 4d 6f 64 65 20 29 20 70 61 67 65 72 55  iveMode ) pagerU
31ac0 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  nlockDb(pPager, 
31ad0 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
31ae0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31af0 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
31b00 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
31b10 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
31b20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f         /* The jo
31b30 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
31b40 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 63  s and no other c
31b50 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 20  onnection has a 
31b60 72 65 73 65 72 76 65 64 0a 20 20 20 20 20 20 20  reserved.       
31b70 20 20 20 2a 2a 20 6f 72 20 67 72 65 61 74 65 72     ** or greater
31b80 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
31b90 61 62 61 73 65 20 66 69 6c 65 2e 20 4e 6f 77 20  abase file. Now 
31ba0 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 72 65  check that there
31bb0 20 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   is.          **
31bc0 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6e 6f   at least one no
31bd0 6e 2d 7a 65 72 6f 20 62 79 74 65 73 20 61 74 20  n-zero bytes at 
31be0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
31bf0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
31c00 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74           ** If t
31c10 68 65 72 65 20 69 73 2c 20 74 68 65 6e 20 77 65  here is, then we
31c20 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20 6a   consider this j
31c30 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 68 6f 74  ournal to be hot
31c40 2e 20 49 66 20 6e 6f 74 2c 20 0a 20 20 20 20 20  . If not, .     
31c50 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62       ** it can b
31c60 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20 20 20 20  e ignored..     
31c70 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
31c80 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20    if( !jrnlOpen 
31c90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
31ca0 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50  nt f = SQLITE_OP
31cb0 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49  EN_READONLY|SQLI
31cc0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
31cd0 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20  RNAL;.          
31ce0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
31cf0 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
31d00 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
31d10 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 29  ger->jfd, f, &f)
31d20 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
31d30 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
31d40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
31d50 20 20 20 20 20 20 20 20 20 75 38 20 66 69 72 73           u8 firs
31d60 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
31d70 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
31d80 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66  sRead(pPager->jf
31d90 64 2c 20 28 76 6f 69 64 20 2a 29 26 66 69 72 73  d, (void *)&firs
31da0 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 1, 0);.      
31db0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
31dc0 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
31dd0 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20  _READ ){.       
31de0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
31df0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
31e00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
31e10 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29   if( !jrnlOpen )
31e20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
31e30 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
31e40 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
31e50 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
31e60 20 20 20 20 20 20 20 2a 70 45 78 69 73 74 73 20         *pExists 
31e70 3d 20 28 66 69 72 73 74 21 3d 30 29 3b 0a 20 20  = (first!=0);.  
31e80 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
31e90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e  ( rc==SQLITE_CAN
31ea0 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 20  TOPEN ){.       
31eb0 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63 61       /* If we ca
31ec0 6e 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20 72 6f  nnot open the ro
31ed0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66  llback journal f
31ee0 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ile in order to 
31ef0 73 65 65 20 69 66 0a 20 20 20 20 20 20 20 20 20  see if.         
31f00 20 20 20 2a 2a 20 69 74 20 68 61 73 20 61 20 7a     ** it has a z
31f10 65 72 6f 20 68 65 61 64 65 72 2c 20 74 68 61 74  ero header, that
31f20 20 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f   might be due to
31f30 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 2c 20 6f   an I/O error, o
31f40 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  r.            **
31f50 20 69 74 20 6d 69 67 68 74 20 62 65 20 64 75 65   it might be due
31f60 20 74 6f 20 74 68 65 20 72 61 63 65 20 63 6f 6e   to the race con
31f70 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64  dition described
31f80 20 61 62 6f 76 65 20 61 6e 64 20 69 6e 0a 20 20   above and in.  
31f90 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 69 63            ** tic
31fa0 6b 65 74 20 23 33 38 38 33 2e 20 20 45 69 74 68  ket #3883.  Eith
31fb0 65 72 20 77 61 79 2c 20 61 73 73 75 6d 65 20 74  er way, assume t
31fc0 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
31fd0 69 73 20 68 6f 74 2e 0a 20 20 20 20 20 20 20 20  is hot..        
31fe0 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68      ** This migh
31ff0 74 20 62 65 20 61 20 66 61 6c 73 65 20 70 6f 73  t be a false pos
32000 69 74 69 76 65 2e 20 20 42 75 74 20 69 66 20 69  itive.  But if i
32010 74 20 69 73 2c 20 74 68 65 6e 20 74 68 65 0a 20  t is, then the. 
32020 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 75             ** au
32030 74 6f 6d 61 74 69 63 20 6a 6f 75 72 6e 61 6c 20  tomatic journal 
32040 70 6c 61 79 62 61 63 6b 20 61 6e 64 20 72 65 63  playback and rec
32050 6f 76 65 72 79 20 6d 65 63 68 61 6e 69 73 6d 20  overy mechanism 
32060 77 69 6c 6c 20 64 65 61 6c 0a 20 20 20 20 20 20  will deal.      
32070 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 69 74        ** with it
32080 20 75 6e 64 65 72 20 61 6e 20 45 58 43 4c 55 53   under an EXCLUS
32090 49 56 45 20 6c 6f 63 6b 20 77 68 65 72 65 20 77  IVE lock where w
320a0 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f  e do not need to
320b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
320c0 77 6f 72 72 79 20 73 6f 20 6d 75 63 68 20 77 69  worry so much wi
320d0 74 68 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f  th race conditio
320e0 6e 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ns..            
320f0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  */.            *
32100 70 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20 20  pExists = 1;.   
32110 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
32120 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
32130 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
32140 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
32150 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
32160 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
32170 53 45 52 56 45 52 5f 45 44 49 54 49 4f 4e 0a 73  SERVER_EDITION.s
32180 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53  tatic int pagerS
32190 65 72 76 65 72 43 6f 6e 6e 65 63 74 28 50 61 67  erverConnect(Pag
321a0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
321b0 65 53 65 72 76 65 72 29 7b 0a 20 20 69 6e 74 20  eServer){.  int 
321c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
321d0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65    if( pPager->te
321e0 6d 70 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  mpFile==0 ){.   
321f0 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20   pPager->noLock 
32200 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 1;.    pPager-
32210 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50  >journalMode = P
32220 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
32230 5f 50 45 52 53 49 53 54 3b 0a 20 20 20 20 72 63  _PERSIST;.    rc
32240 20 3d 20 73 71 6c 69 74 65 33 53 65 72 76 65 72   = sqlite3Server
32250 43 6f 6e 6e 65 63 74 28 70 50 61 67 65 72 2c 20  Connect(pPager, 
32260 65 53 65 72 76 65 72 2c 20 26 70 50 61 67 65 72  eServer, &pPager
32270 2d 3e 70 53 65 72 76 65 72 29 3b 0a 20 20 7d 0a  ->pServer);.  }.
32280 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
32290 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
322a0 52 6f 6c 6c 62 61 63 6b 4a 6f 75 72 6e 61 6c 28  RollbackJournal(
322b0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 73  Pager *pPager, s
322c0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 66  qlite3_file *pJf
322d0 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  d){.  int rc;   
322e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
322f0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
32300 43 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  Code */.  sqlite
32310 33 5f 66 69 6c 65 20 2a 73 61 76 65 64 5f 6a 66  3_file *saved_jf
32320 64 20 3d 20 70 50 61 67 65 72 2d 3e 6a 66 64 3b  d = pPager->jfd;
32330 0a 20 20 75 38 20 73 61 76 65 64 5f 65 53 74 61  .  u8 saved_eSta
32340 74 65 20 3d 20 70 50 61 67 65 72 2d 3e 65 53 74  te = pPager->eSt
32350 61 74 65 3b 0a 20 20 75 38 20 73 61 76 65 64 5f  ate;.  u8 saved_
32360 65 4c 6f 63 6b 20 3d 20 70 50 61 67 65 72 2d 3e  eLock = pPager->
32370 65 4c 6f 63 6b 3b 0a 20 20 69 36 34 20 73 61 76  eLock;.  i64 sav
32380 65 64 5f 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  ed_journalOff = 
32390 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
323a0 66 66 3b 0a 20 20 69 36 34 20 73 61 76 65 64 5f  ff;.  i64 saved_
323b0 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61  journalHdr = pPa
323c0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 3b  ger->journalHdr;
323d0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
323e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
323f0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
32400 44 45 5f 50 45 52 53 49 53 54 20 29 3b 0a 0a 20  DE_PERSIST );.. 
32410 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d   pPager->eLock =
32420 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b   EXCLUSIVE_LOCK;
32430 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  .  pPager->eStat
32440 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52  e = PAGER_WRITER
32450 5f 44 42 4d 4f 44 3b 0a 20 20 70 50 61 67 65 72  _DBMOD;.  pPager
32460 2d 3e 6a 66 64 20 3d 20 70 4a 66 64 3b 0a 20 20  ->jfd = pJfd;.  
32470 72 63 20 3d 20 70 61 67 65 72 53 79 6e 63 48 6f  rc = pagerSyncHo
32480 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  tJournal(pPager)
32490 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
324a0 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 70 61 67  TE_OK ) rc = pag
324b0 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
324c0 65 72 2c 20 31 29 3b 0a 0a 20 20 61 73 73 65 72  er, 1);..  asser
324d0 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
324e0 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 70 50 61 67  ->jfd) );.  pPag
324f0 65 72 2d 3e 6a 66 64 20 3d 20 73 61 76 65 64 5f  er->jfd = saved_
32500 6a 66 64 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65  jfd;.  pPager->e
32510 53 74 61 74 65 20 3d 20 73 61 76 65 64 5f 65 53  State = saved_eS
32520 74 61 74 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  tate;.  pPager->
32530 65 4c 6f 63 6b 20 3d 20 73 61 76 65 64 5f 65 4c  eLock = saved_eL
32540 6f 63 6b 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  ock;.  pPager->j
32550 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 61 76 65  ournalOff = save
32560 64 5f 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  d_journalOff;.  
32570 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
32580 64 72 20 3d 20 73 61 76 65 64 5f 6a 6f 75 72 6e  dr = saved_journ
32590 61 6c 48 64 72 3b 0a 20 20 72 65 74 75 72 6e 20  alHdr;.  return 
325a0 72 63 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c 69  rc;.}..void sqli
325b0 74 65 33 50 61 67 65 72 53 65 72 76 65 72 4a 6f  te3PagerServerJo
325c0 75 72 6e 61 6c 28 0a 20 20 50 61 67 65 72 20 2a  urnal(.  Pager *
325d0 70 50 61 67 65 72 2c 20 0a 20 20 73 71 6c 69 74  pPager, .  sqlit
325e0 65 33 5f 66 69 6c 65 20 2a 6a 66 64 2c 0a 20 20  e3_file *jfd,.  
325f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4a 6f 75  const char *zJou
32600 72 6e 61 6c 0a 29 7b 0a 20 20 70 50 61 67 65 72  rnal.){.  pPager
32610 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 28 63 68  ->zJournal = (ch
32620 61 72 2a 29 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20  ar*)zJournal;.  
32630 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20 6a 66  pPager->jfd = jf
32640 64 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  d;.}.#endif.../*
32650 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
32660 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f  n is called to o
32670 62 74 61 69 6e 20 61 20 73 68 61 72 65 64 20 6c  btain a shared l
32680 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
32690 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 74 20  ase file..** It 
326a0 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63 61  is illegal to ca
326b0 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  ll sqlite3PagerG
326c0 65 74 28 29 20 75 6e 74 69 6c 20 61 66 74 65 72  et() until after
326d0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
326e0 2a 20 68 61 73 20 62 65 65 6e 20 73 75 63 63 65  * has been succe
326f0 73 73 66 75 6c 6c 79 20 63 61 6c 6c 65 64 2e 20  ssfully called. 
32700 49 66 20 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b  If a shared-lock
32710 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64   is already held
32720 20 77 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75   when.** this fu
32730 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
32740 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
32750 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
32760 77 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 20  wing operations 
32770 61 72 65 20 61 6c 73 6f 20 70 65 72 66 6f 72 6d  are also perform
32780 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
32790 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20  ion..**.**   1) 
327a0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
327b0 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 50 41 47  currently in PAG
327c0 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 20 28 6e  ER_OPEN state (n
327d0 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a 2a 20 20  o lock held.**  
327e0 20 20 20 20 6f 6e 20 74 68 65 20 64 61 74 61 62      on the datab
327f0 61 73 65 20 66 69 6c 65 29 2c 20 74 68 65 6e 20  ase file), then 
32800 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  an attempt is ma
32810 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 0a 2a  de to obtain a.*
32820 2a 20 20 20 20 20 20 53 48 41 52 45 44 20 6c 6f  *      SHARED lo
32830 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
32840 73 65 20 66 69 6c 65 2e 20 49 6d 6d 65 64 69 61  se file. Immedia
32850 74 65 6c 79 20 61 66 74 65 72 20 6f 62 74 61 69  tely after obtai
32860 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65  ning.**      the
32870 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68   SHARED lock, th
32880 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 73  e file-system is
32890 20 63 68 65 63 6b 65 64 20 66 6f 72 20 61 20 68   checked for a h
328a0 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 20  ot-journal,.**  
328b0 20 20 20 20 77 68 69 63 68 20 69 73 20 70 6c 61      which is pla
328c0 79 65 64 20 62 61 63 6b 20 69 66 20 70 72 65 73  yed back if pres
328d0 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20 61  ent. Following a
328e0 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 0a  ny hot-journal .
328f0 2a 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b  **      rollback
32900 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  , the contents o
32910 66 20 74 68 65 20 63 61 63 68 65 20 61 72 65 20  f the cache are 
32920 76 61 6c 69 64 61 74 65 64 20 62 79 20 63 68 65  validated by che
32930 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68  cking.**      th
32940 65 20 27 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  e 'change-counte
32950 72 27 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  r' field of the 
32960 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65  database file he
32970 61 64 65 72 20 61 6e 64 0a 2a 2a 20 20 20 20 20  ader and.**     
32980 20 64 69 73 63 61 72 64 65 64 20 69 66 20 74 68   discarded if th
32990 65 79 20 61 72 65 20 66 6f 75 6e 64 20 74 6f 20  ey are found to 
329a0 62 65 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a 0a 2a  be invalid..**.*
329b0 2a 20 20 20 32 29 20 49 66 20 74 68 65 20 70 61  *   2) If the pa
329c0 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69  ger is running i
329d0 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65  n exclusive-mode
329e0 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  , and there are 
329f0 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20  currently.**    
32a00 20 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67    no outstanding
32a10 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61   references to a
32a20 6e 79 20 70 61 67 65 73 2c 20 61 6e 64 20 69 73  ny pages, and is
32a30 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74   in the error st
32a40 61 74 65 2c 0a 2a 2a 20 20 20 20 20 20 74 68 65  ate,.**      the
32a50 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20  n an attempt is 
32a60 6d 61 64 65 20 74 6f 20 63 6c 65 61 72 20 74 68  made to clear th
32a70 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 62 79  e error state by
32a80 20 64 69 73 63 61 72 64 69 6e 67 0a 2a 2a 20 20   discarding.**  
32a90 20 20 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73      the contents
32aa0 20 6f 66 20 74 68 65 20 70 61 67 65 20 63 61 63   of the page cac
32ab0 68 65 20 61 6e 64 20 72 6f 6c 6c 69 6e 67 20 62  he and rolling b
32ac0 61 63 6b 20 61 6e 79 20 6f 70 65 6e 20 6a 6f 75  ack any open jou
32ad0 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 66 69 6c  rnal.**      fil
32ae0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72  e..**.** If ever
32af0 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73  ything is succes
32b00 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  sful, SQLITE_OK 
32b10 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
32b20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20  an IO error .** 
32b30 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6c 6f 63  occurs while loc
32b40 6b 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  king the databas
32b50 65 2c 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  e, checking for 
32b60 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
32b70 6c 65 20 6f 72 20 0a 2a 2a 20 72 6f 6c 6c 69 6e  le or .** rollin
32b80 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c  g back a journal
32b90 20 66 69 6c 65 2c 20 74 68 65 20 49 4f 20 65 72   file, the IO er
32ba0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
32bb0 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
32bc0 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64 4c  ite3PagerSharedL
32bd0 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
32be0 72 2c 20 69 6e 74 20 62 52 65 61 64 6f 6e 6c 79  r, int bReadonly
32bf0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
32c00 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
32c10 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
32c20 6e 20 63 6f 64 65 20 2a 2f 0a 23 69 66 64 65 66  n code */.#ifdef
32c30 20 53 51 4c 49 54 45 5f 53 45 52 56 45 52 5f 45   SQLITE_SERVER_E
32c40 44 49 54 49 4f 4e 0a 20 20 69 6e 74 20 65 53 65  DITION.  int eSe
32c50 72 76 65 72 20 3d 20 30 3b 0a 23 65 6e 64 69 66  rver = 0;.#endif
32c60 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74  ..  /* This rout
32c70 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ine is only call
32c80 65 64 20 66 72 6f 6d 20 62 2d 74 72 65 65 20 61  ed from b-tree a
32c90 6e 64 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65  nd only when the
32ca0 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f  re are no.  ** o
32cb0 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73  utstanding pages
32cc0 2e 20 54 68 69 73 20 69 6d 70 6c 69 65 73 20 74  . This implies t
32cd0 68 61 74 20 74 68 65 20 70 61 67 65 72 20 73 74  hat the pager st
32ce0 61 74 65 20 73 68 6f 75 6c 64 20 65 69 74 68 65  ate should eithe
32cf0 72 0a 20 20 2a 2a 20 62 65 20 4f 50 45 4e 20 6f  r.  ** be OPEN o
32d00 72 20 52 45 41 44 45 52 2e 20 52 45 41 44 45 52  r READER. READER
32d10 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c   is only possibl
32d20 65 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69  e if the pager i
32d30 73 20 6f 72 20 77 61 73 20 69 6e 20 0a 20 20 2a  s or was in .  *
32d40 2a 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 65  * exclusive acce
32d50 73 73 20 6d 6f 64 65 2e 20 20 2a 2f 0a 20 20 61  ss mode.  */.  a
32d60 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63  ssert( sqlite3Pc
32d70 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
32d80 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
32d90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
32da0 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
32db0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
32dc0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
32dd0 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
32de0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
32df0 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
32e00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
32e10 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
32e20 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69  QLITE_OK );..  i
32e30 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  f( !pagerUseWal(
32e40 70 50 61 67 65 72 29 20 0a 20 20 20 26 26 20 21  pPager) .   && !
32e50 70 61 67 65 72 49 73 53 65 72 76 65 72 28 70 50  pagerIsServer(pP
32e60 61 67 65 72 29 20 0a 20 20 20 26 26 20 70 50 61  ager) .   && pPa
32e70 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
32e80 45 52 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20 69  ER_OPEN ){.    i
32e90 6e 74 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d  nt bHotJournal =
32ea0 20 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   1;          /* 
32eb0 54 72 75 65 20 69 66 20 74 68 65 72 65 20 65 78  True if there ex
32ec0 69 73 74 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e  ists a hot journ
32ed0 61 6c 2d 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20  al-file */..    
32ee0 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
32ef0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
32f00 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d  ager->tempFile==
32f10 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f  0 || pPager->eLo
32f20 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
32f30 43 4b 20 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20  CK );..    rc = 
32f40 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
32f50 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52 45  ck(pPager, SHARE
32f60 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  D_LOCK);.    if(
32f70 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
32f80 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
32f90 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e  pPager->eLock==N
32fa0 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72  O_LOCK || pPager
32fb0 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e  ->eLock==UNKNOWN
32fc0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 67  _LOCK );.      g
32fd0 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
32fe0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6a  }..    /* If a j
32ff0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
33000 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73  ts, and there is
33010 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63   no RESERVED loc
33020 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  k on the.    ** 
33030 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
33040 68 65 6e 20 69 74 20 65 69 74 68 65 72 20 6e 65  hen it either ne
33050 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64  eds to be played
33060 20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74 65 64   back or deleted
33070 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
33080 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 3d   pPager->eLock<=
33090 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
330a0 20 20 20 20 20 72 63 20 3d 20 68 61 73 48 6f 74       rc = hasHot
330b0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20  Journal(pPager, 
330c0 26 62 48 6f 74 4a 6f 75 72 6e 61 6c 2c 20 26 65  &bHotJournal, &e
330d0 53 65 72 76 65 72 29 3b 0a 20 20 20 20 20 20 61  Server);.      a
330e0 73 73 65 72 74 28 20 62 48 6f 74 4a 6f 75 72 6e  ssert( bHotJourn
330f0 61 6c 3d 3d 30 20 7c 7c 20 65 53 65 72 76 65 72  al==0 || eServer
33100 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ==0 );.    }.   
33110 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
33120 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
33130 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20   failed;.    }. 
33140 20 20 20 69 66 28 20 62 48 6f 74 4a 6f 75 72 6e     if( bHotJourn
33150 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  al ){.      if( 
33160 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
33170 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
33180 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
33190 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20  _ROLLBACK;.     
331a0 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
331b0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
331c0 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49  * Get an EXCLUSI
331d0 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
331e0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74  atabase file. At
331f0 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69   this point it i
33200 73 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72  s.      ** impor
33210 74 61 6e 74 20 74 68 61 74 20 61 20 52 45 53 45  tant that a RESE
33220 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74  RVED lock is not
33230 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65   obtained on the
33240 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20   way to the.    
33250 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
33260 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c  ock. If it were,
33270 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73   another process
33280 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a   might open the.
33290 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
332a0 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74  e file, detect t
332b0 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  he RESERVED lock
332c0 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74  , and conclude t
332d0 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  hat the.      **
332e0 20 64 61 74 61 62 61 73 65 20 69 73 20 73 61 66   database is saf
332f0 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20  e to read while 
33300 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20  this process is 
33310 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74 68  still rolling th
33320 65 20 0a 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d  e .      ** hot-
33330 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2e 0a 20 20  journal back..  
33340 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a      ** .      **
33350 20 42 65 63 61 75 73 65 20 74 68 65 20 69 6e 74   Because the int
33360 65 72 6d 65 64 69 61 74 65 20 52 45 53 45 52 56  ermediate RESERV
33370 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72  ED lock is not r
33380 65 71 75 65 73 74 65 64 2c 20 61 6e 79 0a 20 20  equested, any.  
33390 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 70 72 6f      ** other pro
333a0 63 65 73 73 20 61 74 74 65 6d 70 74 69 6e 67 20  cess attempting 
333b0 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
333c0 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c  tabase file will
333d0 20 67 65 74 20 74 6f 20 0a 20 20 20 20 20 20 2a   get to .      *
333e0 2a 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20  * this point in 
333f0 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69  the code and fai
33400 6c 20 74 6f 20 6f 62 74 61 69 6e 20 69 74 73 20  l to obtain its 
33410 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  own EXCLUSIVE lo
33420 63 6b 20 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20  ck .      ** on 
33430 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
33440 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
33450 20 20 2a 2a 20 55 6e 6c 65 73 73 20 74 68 65 20    ** Unless the 
33460 70 61 67 65 72 20 69 73 20 69 6e 20 6c 6f 63 6b  pager is in lock
33470 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
33480 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f 63  ve mode, the loc
33490 6b 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f  k is.      ** do
334a0 77 6e 67 72 61 64 65 64 20 74 6f 20 53 48 41 52  wngraded to SHAR
334b0 45 44 5f 4c 4f 43 4b 20 62 65 66 6f 72 65 20 74  ED_LOCK before t
334c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
334d0 75 72 6e 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  urns..      */. 
334e0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c       rc = pagerL
334f0 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 45 58  ockDb(pPager, EX
33500 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
33510 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
33520 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
33530 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
33540 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f       }. .      /
33550 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61  * If it is not a
33560 6c 72 65 61 64 79 20 6f 70 65 6e 20 61 6e 64 20  lready open and 
33570 74 68 65 20 66 69 6c 65 20 65 78 69 73 74 73 20  the file exists 
33580 6f 6e 20 64 69 73 6b 2c 20 6f 70 65 6e 20 74 68  on disk, open th
33590 65 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72  e .      ** jour
335a0 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72 69  nal for read/wri
335b0 74 65 20 61 63 63 65 73 73 2e 20 57 72 69 74 65  te access. Write
335c0 20 61 63 63 65 73 73 20 69 73 20 72 65 71 75 69   access is requi
335d0 72 65 64 20 62 65 63 61 75 73 65 20 0a 20 20 20  red because .   
335e0 20 20 20 2a 2a 20 69 6e 20 65 78 63 6c 75 73 69     ** in exclusi
335f0 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74  ve-access mode t
33600 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
33610 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74 20  or will be kept 
33620 6f 70 65 6e 20 0a 20 20 20 20 20 20 2a 2a 20 61  open .      ** a
33630 6e 64 20 70 6f 73 73 69 62 6c 79 20 75 73 65 64  nd possibly used
33640 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69   for a transacti
33650 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 41 6c 73  on later on. Als
33660 6f 2c 20 77 72 69 74 65 2d 61 63 63 65 73 73 20  o, write-access 
33670 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73 75  .      ** is usu
33680 61 6c 6c 79 20 72 65 71 75 69 72 65 64 20 74 6f  ally required to
33690 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f   finalize the jo
336a0 75 72 6e 61 6c 20 69 6e 20 6a 6f 75 72 6e 61 6c  urnal in journal
336b0 5f 6d 6f 64 65 3d 70 65 72 73 69 73 74 20 0a 20  _mode=persist . 
336c0 20 20 20 20 20 2a 2a 20 6d 6f 64 65 20 28 61 6e       ** mode (an
336d0 64 20 61 6c 73 6f 20 66 6f 72 20 6a 6f 75 72 6e  d also for journ
336e0 61 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65  al_mode=truncate
336f0 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73   on some systems
33700 29 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  )..      **.    
33710 20 20 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72    ** If the jour
33720 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  nal does not exi
33730 73 74 2c 20 69 74 20 75 73 75 61 6c 6c 79 20 6d  st, it usually m
33740 65 61 6e 73 20 74 68 61 74 20 73 6f 6d 65 20 0a  eans that some .
33750 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63        ** other c
33760 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67 65  onnection manage
33770 64 20 74 6f 20 67 65 74 20 69 6e 20 61 6e 64 20  d to get in and 
33780 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 62 65 66  roll it back bef
33790 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 68  ore .      ** th
337a0 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62  is connection ob
337b0 74 61 69 6e 65 64 20 74 68 65 20 65 78 63 6c 75  tained the exclu
337c0 73 69 76 65 20 6c 6f 63 6b 20 61 62 6f 76 65 2e  sive lock above.
337d0 20 4f 72 2c 20 69 74 20 0a 20 20 20 20 20 20 2a   Or, it .      *
337e0 2a 20 6d 61 79 20 6d 65 61 6e 20 74 68 61 74 20  * may mean that 
337f0 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e  the pager was in
33800 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65   the error-state
33810 20 77 68 65 6e 20 74 68 69 73 0a 20 20 20 20 20   when this.     
33820 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73   ** function was
33830 20 63 61 6c 6c 65 64 20 61 6e 64 20 74 68 65 20   called and the 
33840 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65  journal file doe
33850 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20 20  s not exist..   
33860 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
33870 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
33880 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  jfd) ){.        
33890 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f  sqlite3_vfs * co
338a0 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65  nst pVfs = pPage
338b0 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20 20 20 20  r->pVfs;.       
338c0 20 69 6e 74 20 62 45 78 69 73 74 73 3b 20 20 20   int bExists;   
338d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
338e0 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66 69  ue if journal fi
338f0 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20  le exists */.   
33900 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
33910 33 4f 73 41 63 63 65 73 73 28 0a 20 20 20 20 20  3OsAccess(.     
33920 20 20 20 20 20 20 20 70 56 66 73 2c 20 70 50 61         pVfs, pPa
33930 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53  ger->zJournal, S
33940 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
33950 53 54 53 2c 20 26 62 45 78 69 73 74 73 29 3b 0a  STS, &bExists);.
33960 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
33970 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 45 78  SQLITE_OK && bEx
33980 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ists ){.        
33990 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a    int fout = 0;.
339a0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 20            int f 
339b0 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
339c0 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
339d0 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
339e0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
339f0 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  rt( !pPager->tem
33a00 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 20  pFile );.       
33a10 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
33a20 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67  sOpen(pVfs, pPag
33a30 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50  er->zJournal, pP
33a40 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66  ager->jfd, f, &f
33a50 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  out);.          
33a60 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
33a70 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28  TE_OK || isOpen(
33a80 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
33a90 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
33aa0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 66  ==SQLITE_OK && f
33ab0 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  out&SQLITE_OPEN_
33ac0 52 45 41 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20  READONLY ){.    
33ad0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
33ae0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
33af0 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  T;.            s
33b00 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
33b10 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
33b20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
33b30 7d 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20  }.      }. .    
33b40 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e    /* Playback an
33b50 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  d delete the jou
33b60 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20  rnal.  Drop the 
33b70 64 61 74 61 62 61 73 65 20 77 72 69 74 65 0a 20  database write. 
33b80 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64       ** lock and
33b90 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20 72   reacquire the r
33ba0 65 61 64 20 6c 6f 63 6b 2e 20 50 75 72 67 65 20  ead lock. Purge 
33bb0 74 68 65 20 63 61 63 68 65 20 62 65 66 6f 72 65  the cache before
33bc0 0a 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 69 6e  .      ** playin
33bd0 67 20 62 61 63 6b 20 74 68 65 20 68 6f 74 2d 6a  g back the hot-j
33be0 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61 74 20 77  ournal so that w
33bf0 65 20 64 6f 6e 27 74 20 65 6e 64 20 75 70 20 77  e don't end up w
33c00 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20  ith.      ** an 
33c10 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63 61 63  inconsistent cac
33c20 68 65 2e 20 20 53 79 6e 63 20 74 68 65 20 68 6f  he.  Sync the ho
33c30 74 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65  t journal before
33c40 20 70 6c 61 79 69 6e 67 0a 20 20 20 20 20 20 2a   playing.      *
33c50 2a 20 69 74 20 62 61 63 6b 20 73 69 6e 63 65 20  * it back since 
33c60 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
33c70 20 63 72 61 73 68 65 64 20 61 6e 64 20 6c 65 66   crashed and lef
33c80 74 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61  t the hot journa
33c90 6c 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 61  l.      ** proba
33ca0 62 6c 79 20 64 69 64 20 6e 6f 74 20 73 79 6e 63  bly did not sync
33cb0 20 69 74 20 61 6e 64 20 77 65 20 61 72 65 20 72   it and we are r
33cc0 65 71 75 69 72 65 64 20 74 6f 20 61 6c 77 61 79  equired to alway
33cd0 73 20 73 79 6e 63 0a 20 20 20 20 20 20 2a 2a 20  s sync.      ** 
33ce0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f  the journal befo
33cf0 72 65 20 70 6c 61 79 69 6e 67 20 69 74 20 62 61  re playing it ba
33d00 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ck..      */.   
33d10 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
33d20 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
33d30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
33d40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
33d50 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
33d60 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28  rSyncHotJournal(
33d70 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
33d80 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
33d90 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
33da0 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
33db0 61 63 6b 28 70 50 61 67 65 72 2c 20 21 70 50 61  ack(pPager, !pPa
33dc0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a  ger->tempFile);.
33dd0 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
33de0 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
33df0 5f 4f 50 45 4e 3b 0a 20 20 20 20 20 20 20 20 7d  _OPEN;.        }
33e00 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
33e10 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
33e20 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20  iveMode ){.     
33e30 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62     pagerUnlockDb
33e40 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f  (pPager, SHARED_
33e50 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  LOCK);.      }..
33e60 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
33e70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
33e80 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
33e90 68 20 69 73 20 74 61 6b 65 6e 20 69 66 20 61 6e  h is taken if an
33ea0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
33eb0 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6f 70  ile trying to op
33ec0 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72  en.        ** or
33ed0 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 68 6f 74   roll back a hot
33ee0 2d 6a 6f 75 72 6e 61 6c 20 77 68 69 6c 65 20 68  -journal while h
33ef0 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53  olding an EXCLUS
33f00 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20  IVE lock. The.  
33f10 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 75        ** pager_u
33f20 6e 6c 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65 20  nlock() routine 
33f30 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 62  will be called b
33f40 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
33f50 74 6f 20 75 6e 6c 6f 63 6b 0a 20 20 20 20 20 20  to unlock.      
33f60 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 2e 20 49    ** the file. I
33f70 66 20 74 68 65 20 75 6e 6c 6f 63 6b 20 61 74 74  f the unlock att
33f80 65 6d 70 74 20 66 61 69 6c 73 2c 20 74 68 65 6e  empt fails, then
33f90 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 6d 75 73   Pager.eLock mus
33fa0 74 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  t be.        ** 
33fb0 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c  set to UNKNOWN_L
33fc0 4f 43 4b 20 28 73 65 65 20 74 68 65 20 63 6f 6d  OCK (see the com
33fd0 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23  ment above the #
33fe0 64 65 66 69 6e 65 20 66 6f 72 20 0a 20 20 20 20  define for .    
33ff0 20 20 20 20 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c      ** UNKNOWN_L
34000 4f 43 4b 20 61 62 6f 76 65 20 66 6f 72 20 61 6e  OCK above for an
34010 20 65 78 70 6c 61 6e 61 74 69 6f 6e 29 2e 20 0a   explanation). .
34020 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
34030 20 20 20 2a 2a 20 49 6e 20 6f 72 64 65 72 20 74     ** In order t
34040 6f 20 67 65 74 20 70 61 67 65 72 5f 75 6e 6c 6f  o get pager_unlo
34050 63 6b 28 29 20 74 6f 20 64 6f 20 74 68 69 73 2c  ck() to do this,
34060 20 73 65 74 20 50 61 67 65 72 2e 65 53 74 61 74   set Pager.eStat
34070 65 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20  e to.        ** 
34080 50 41 47 45 52 5f 45 52 52 4f 52 20 6e 6f 77 2e  PAGER_ERROR now.
34090 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 63 74   This is not act
340a0 75 61 6c 6c 79 20 63 6f 75 6e 74 65 64 20 61 73  ually counted as
340b0 20 61 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20   a transition.  
340c0 20 20 20 20 20 20 2a 2a 20 74 6f 20 45 52 52 4f        ** to ERRO
340d0 52 20 73 74 61 74 65 20 69 6e 20 74 68 65 20 73  R state in the s
340e0 74 61 74 65 20 64 69 61 67 72 61 6d 20 61 74 20  tate diagram at 
340f0 74 68 65 20 74 6f 70 20 6f 66 20 74 68 69 73 20  the top of this 
34100 66 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a  file,.        **
34110 20 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74   since we know t
34120 68 61 74 20 74 68 65 20 73 61 6d 65 20 63 61 6c  hat the same cal
34130 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63  l to pager_unloc
34140 6b 28 29 20 77 69 6c 6c 20 76 65 72 79 0a 20 20  k() will very.  
34150 20 20 20 20 20 20 2a 2a 20 73 68 6f 72 74 6c 79        ** shortly
34160 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 68 65 20   transition the 
34170 70 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f 20  pager object to 
34180 74 68 65 20 4f 50 45 4e 20 73 74 61 74 65 2e 20  the OPEN state. 
34190 43 61 6c 6c 69 6e 67 0a 20 20 20 20 20 20 20 20  Calling.        
341a0 2a 2a 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  ** assert_pager_
341b0 73 74 61 74 65 28 29 20 77 6f 75 6c 64 20 66 61  state() would fa
341c0 69 6c 20 6e 6f 77 2c 20 61 73 20 69 74 20 73 68  il now, as it sh
341d0 6f 75 6c 64 20 6e 6f 74 20 62 65 20 70 6f 73 73  ould not be poss
341e0 69 62 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  ible.        ** 
341f0 74 6f 20 62 65 20 69 6e 20 45 52 52 4f 52 20 73  to be in ERROR s
34200 74 61 74 65 20 77 68 65 6e 20 74 68 65 72 65 20  tate when there 
34210 61 72 65 20 7a 65 72 6f 20 6f 75 74 73 74 61 6e  are zero outstan
34220 64 69 6e 67 20 70 61 67 65 20 0a 20 20 20 20 20  ding page .     
34230 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73     ** references
34240 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
34250 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72       pager_error
34260 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
34270 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
34280 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  d;.      }..    
34290 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
342a0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
342b0 4f 50 45 4e 20 29 3b 0a 20 20 20 20 20 20 61 73  OPEN );.      as
342c0 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 65  sert( (pPager->e
342d0 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
342e0 4b 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  K).           ||
342f0 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   (pPager->exclus
34300 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65  iveMode && pPage
34310 72 2d 3e 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  r->eLock>SHARED_
34320 4c 4f 43 4b 29 0a 20 20 20 20 20 20 29 3b 0a 20  LOCK).      );. 
34330 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 70     }..    if( !p
34340 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
34350 26 26 20 70 50 61 67 65 72 2d 3e 68 61 73 48 65  && pPager->hasHe
34360 6c 64 53 68 61 72 65 64 4c 6f 63 6b 20 29 7b 0a  ldSharedLock ){.
34370 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61        /* The sha
34380 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73  red-lock has jus
34390 74 20 62 65 65 6e 20 61 63 71 75 69 72 65 64 20  t been acquired 
343a0 74 68 65 6e 20 63 68 65 63 6b 20 74 6f 0a 20 20  then check to.  
343b0 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 74 68      ** see if th
343c0 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62  e database has b
343d0 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 49  een modified.  I
343e0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  f the database h
343f0 61 73 20 63 68 61 6e 67 65 64 2c 0a 20 20 20 20  as changed,.    
34400 20 20 2a 2a 20 66 6c 75 73 68 20 74 68 65 20 63    ** flush the c
34410 61 63 68 65 2e 20 20 54 68 65 20 68 61 73 48 65  ache.  The hasHe
34420 6c 64 53 68 61 72 65 64 4c 6f 63 6b 20 66 6c 61  ldSharedLock fla
34430 67 20 70 72 65 76 65 6e 74 73 20 74 68 69 73 20  g prevents this 
34440 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 6f 63  from.      ** oc
34450 63 75 72 72 69 6e 67 20 6f 6e 20 74 68 65 20 76  curring on the v
34460 65 72 79 20 66 69 72 73 74 20 61 63 63 65 73 73  ery first access
34470 20 74 6f 20 61 20 66 69 6c 65 2c 20 69 6e 20 6f   to a file, in o
34480 72 64 65 72 20 74 6f 20 73 61 76 65 20 61 0a 20  rder to save a. 
34490 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 75       ** single u
344a0 6e 6e 65 63 65 73 73 61 72 79 20 73 71 6c 69 74  nnecessary sqlit
344b0 65 33 4f 73 52 65 61 64 28 29 20 63 61 6c 6c 20  e3OsRead() call 
344c0 61 74 20 74 68 65 20 73 74 61 72 74 2d 75 70 2e  at the start-up.
344d0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
344e0 2a 2a 20 44 61 74 61 62 61 73 65 20 63 68 61 6e  ** Database chan
344f0 67 65 73 20 61 72 65 20 64 65 74 65 63 74 65 64  ges are detected
34500 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31   by looking at 1
34510 35 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e  5 bytes beginnin
34520 67 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66  g.      ** at of
34530 66 73 65 74 20 32 34 20 69 6e 74 6f 20 74 68 65  fset 24 into the
34540 20 66 69 6c 65 2e 20 20 54 68 65 20 66 69 72 73   file.  The firs
34550 74 20 34 20 6f 66 20 74 68 65 73 65 20 31 36 20  t 4 of these 16 
34560 62 79 74 65 73 20 61 72 65 0a 20 20 20 20 20 20  bytes are.      
34570 2a 2a 20 61 20 33 32 2d 62 69 74 20 63 6f 75 6e  ** a 32-bit coun
34580 74 65 72 20 74 68 61 74 20 69 73 20 69 6e 63 72  ter that is incr
34590 65 6d 65 6e 74 65 64 20 77 69 74 68 20 65 61 63  emented with eac
345a0 68 20 63 68 61 6e 67 65 2e 20 20 54 68 65 0a 20  h change.  The. 
345b0 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 62 79       ** other by
345c0 74 65 73 20 63 68 61 6e 67 65 20 72 61 6e 64 6f  tes change rando
345d0 6d 6c 79 20 77 69 74 68 20 65 61 63 68 20 66 69  mly with each fi
345e0 6c 65 20 63 68 61 6e 67 65 20 77 68 65 6e 0a 20  le change when. 
345f0 20 20 20 20 20 2a 2a 20 61 20 63 6f 64 65 63 20       ** a codec 
34600 69 73 20 69 6e 20 75 73 65 2e 0a 20 20 20 20 20  is in use..     
34610 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 54 68   ** .      ** Th
34620 65 72 65 20 69 73 20 61 20 76 61 6e 69 73 68 69  ere is a vanishi
34630 6e 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63  ngly small chanc
34640 65 20 74 68 61 74 20 61 20 63 68 61 6e 67 65 20  e that a change 
34650 77 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20  will not be .   
34660 20 20 20 2a 2a 20 64 65 74 65 63 74 65 64 2e 20     ** detected. 
34670 20 54 68 65 20 63 68 61 6e 63 65 20 6f 66 20 61   The chance of a
34680 6e 20 75 6e 64 65 74 65 63 74 65 64 20 63 68 61  n undetected cha
34690 6e 67 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20  nge is so small 
346a0 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 69 74  that.      ** it
346b0 20 63 61 6e 20 62 65 20 6e 65 67 6c 65 63 74 65   can be neglecte
346c0 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
346d0 20 20 63 68 61 72 20 64 62 46 69 6c 65 56 65 72    char dbFileVer
346e0 73 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  s[sizeof(pPager-
346f0 3e 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 0a  >dbFileVers)];..
34700 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
34710 43 4b 56 45 52 53 20 25 70 20 25 64 5c 6e 22 2c  CKVERS %p %d\n",
34720 20 70 50 61 67 65 72 2c 20 73 69 7a 65 6f 66 28   pPager, sizeof(
34730 64 62 46 69 6c 65 56 65 72 73 29 29 29 3b 0a 20  dbFileVers)));. 
34740 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
34750 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
34760 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72 73 2c  fd, &dbFileVers,
34770 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
34780 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20 20 20  rs), 24);.      
34790 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
347a0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  K ){.        if(
347b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc!=SQLITE_IOER
347c0 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
347d0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66            goto f
347e0 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d  ailed;.        }
347f0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
34800 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
34810 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65   memset(dbFileVe
34820 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62  rs, 0, sizeof(db
34830 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20  FileVers));.    
34840 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6d    }..      if( m
34850 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62  emcmp(pPager->db
34860 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65  FileVers, dbFile
34870 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46  Vers, sizeof(dbF
34880 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a  ileVers))!=0 ){.
34890 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65          pager_re
348a0 73 65 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  set(pPager);..  
348b0 20 20 20 20 20 20 2f 2a 20 55 6e 6d 61 70 20 74        /* Unmap t
348c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
348d0 2e 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65  . It is possible
348e0 20 74 68 61 74 20 65 78 74 65 72 6e 61 6c 20 70   that external p
348f0 72 6f 63 65 73 73 65 73 0a 20 20 20 20 20 20 20  rocesses.       
34900 20 2a 2a 20 6d 61 79 20 68 61 76 65 20 74 72 75   ** may have tru
34910 6e 63 61 74 65 64 20 74 68 65 20 64 61 74 61 62  ncated the datab
34920 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65  ase file and the
34930 6e 20 65 78 74 65 6e 64 65 64 20 69 74 20 62 61  n extended it ba
34940 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ck.        ** to
34950 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69   its original si
34960 7a 65 20 77 68 69 6c 65 20 74 68 69 73 20 70 72  ze while this pr
34970 6f 63 65 73 73 20 77 61 73 20 6e 6f 74 20 68 6f  ocess was not ho
34980 6c 64 69 6e 67 20 61 20 6c 6f 63 6b 2e 0a 20 20  lding a lock..  
34990 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73        ** In this
349a0 20 63 61 73 65 20 74 68 65 72 65 20 6d 61 79 20   case there may 
349b0 65 78 69 73 74 20 61 20 50 61 67 65 72 2e 70 4d  exist a Pager.pM
349c0 61 70 20 6d 61 70 70 69 6e 67 20 74 68 61 74 20  ap mapping that 
349d0 61 70 70 65 61 72 73 0a 20 20 20 20 20 20 20 20  appears.        
349e0 2a 2a 20 74 6f 20 62 65 20 74 68 65 20 72 69 67  ** to be the rig
349f0 68 74 20 73 69 7a 65 20 62 75 74 20 69 73 20 6e  ht size but is n
34a00 6f 74 20 61 63 74 75 61 6c 6c 79 20 76 61 6c 69  ot actually vali
34a10 64 2e 20 41 76 6f 69 64 20 74 68 69 73 0a 20 20  d. Avoid this.  
34a20 20 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 69        ** possibi
34a30 6c 69 74 79 20 62 79 20 75 6e 6d 61 70 70 69 6e  lity by unmappin
34a40 67 20 74 68 65 20 64 62 20 68 65 72 65 2e 20 2a  g the db here. *
34a50 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 55 53  /.        if( US
34a60 45 46 45 54 43 48 28 70 50 61 67 65 72 29 20 29  EFETCH(pPager) )
34a70 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
34a80 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61  te3OsUnfetch(pPa
34a90 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a  ger->fd, 0, 0);.
34aa0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
34ab0 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20  }.    }..#ifdef 
34ac0 53 51 4c 49 54 45 5f 53 45 52 56 45 52 5f 45 44  SQLITE_SERVER_ED
34ad0 49 54 49 4f 4e 0a 20 20 20 20 69 66 28 20 65 53  ITION.    if( eS
34ae0 65 72 76 65 72 20 29 7b 0a 20 20 20 20 20 20 72  erver ){.      r
34af0 63 20 3d 20 70 61 67 65 72 53 65 72 76 65 72 43  c = pagerServerC
34b00 6f 6e 6e 65 63 74 28 70 50 61 67 65 72 2c 20 65  onnect(pPager, e
34b10 53 65 72 76 65 72 29 3b 0a 20 20 20 20 7d 0a 23  Server);.    }.#
34b20 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66  endif..    /* If
34b30 20 74 68 65 72 65 20 69 73 20 61 20 57 41 4c 20   there is a WAL 
34b40 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65  file in the file
34b50 2d 73 79 73 74 65 6d 2c 20 6f 70 65 6e 20 74 68  -system, open th
34b60 69 73 20 64 61 74 61 62 61 73 65 20 69 6e 20 57  is database in W
34b70 41 4c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20  AL.    ** mode. 
34b80 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 66  Otherwise, the f
34b90 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f  ollowing functio
34ba0 6e 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f  n call is a no-o
34bb0 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  p..    */.    if
34bc0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
34bd0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
34be0 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73  gerOpenWalIfPres
34bf0 65 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ent(pPager);.   
34c00 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
34c10 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 61  E_OMIT_WAL.    a
34c20 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
34c30 57 61 6c 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51  Wal==0 || rc==SQ
34c40 4c 49 54 45 5f 4f 4b 20 29 3b 0a 23 65 6e 64 69  LITE_OK );.#endi
34c50 66 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  f.  }..#ifdef SQ
34c60 4c 49 54 45 5f 53 45 52 56 45 52 5f 45 44 49 54  LITE_SERVER_EDIT
34c70 49 4f 4e 0a 20 20 69 66 28 20 70 61 67 65 72 49  ION.  if( pagerI
34c80 73 53 65 72 76 65 72 28 70 50 61 67 65 72 29 20  sServer(pPager) 
34c90 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  ){.    assert( r
34ca0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
34cb0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
34cc0 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
34cd0 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20  (pPager)==0 );. 
34ce0 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72     assert( pager
34cf0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d  UseWal(pPager)==
34d00 30 20 29 3b 0a 20 20 20 20 70 61 67 65 72 5f 72  0 );.    pager_r
34d10 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
34d20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
34d30 72 76 65 72 42 65 67 69 6e 28 70 50 61 67 65 72  rverBegin(pPager
34d40 2d 3e 70 53 65 72 76 65 72 2c 20 62 52 65 61 64  ->pServer, bRead
34d50 6f 6e 6c 79 29 3b 0a 20 20 20 20 69 66 28 20 72  only);.    if( r
34d60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
34d70 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
34d80 65 33 53 65 72 76 65 72 4c 6f 63 6b 28 70 50 61  e3ServerLock(pPa
34d90 67 65 72 2d 3e 70 53 65 72 76 65 72 2c 20 31 2c  ger->pServer, 1,
34da0 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
34db0 20 20 73 65 74 47 65 74 74 65 72 4d 65 74 68 6f    setGetterMetho
34dc0 64 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 23  d(pPager);.  }.#
34dd0 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63 3d 3d  endif.  if( rc==
34de0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 61 67  SQLITE_OK && pag
34df0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
34e00 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
34e10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
34e20 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 42  .    rc = pagerB
34e30 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74  eginReadTransact
34e40 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ion(pPager);.  }
34e50 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
34e60 74 65 6d 70 46 69 6c 65 3d 3d 30 20 26 26 20 70  tempFile==0 && p
34e70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
34e80 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 72 63 3d  AGER_OPEN && rc=
34e90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
34ea0 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65    rc = pagerPage
34eb0 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 70  count(pPager, &p
34ec0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a  Pager->dbSize);.
34ed0 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20    }.. failed:.  
34ee0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
34ef0 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
34f00 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 70   !MEMDB );.    p
34f10 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
34f20 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  er);.    assert(
34f30 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
34f40 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20  =PAGER_OPEN );. 
34f50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
34f60 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
34f70 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 20 20 70  ER_READER;.    p
34f80 50 61 67 65 72 2d 3e 68 61 73 48 65 6c 64 53 68  Pager->hasHeldSh
34f90 61 72 65 64 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20  aredLock = 1;.  
34fa0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
34fb0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ../*.** If the r
34fc0 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 68  eference count h
34fd0 61 73 20 72 65 61 63 68 65 64 20 7a 65 72 6f 2c  as reached zero,
34fe0 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63   rollback any ac
34ff0 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  tive.** transact
35000 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ion and unlock t
35010 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20  he pager..**.** 
35020 45 78 63 65 70 74 2c 20 69 6e 20 6c 6f 63 6b 69  Except, in locki
35030 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56  ng_mode=EXCLUSIV
35040 45 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  E when there is 
35050 6e 6f 74 68 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a  nothing to in.**
35060 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
35070 75 72 6e 61 6c 2c 20 74 68 65 20 75 6e 6c 6f 63  urnal, the unloc
35080 6b 20 69 73 20 6e 6f 74 20 70 65 72 66 6f 72 6d  k is not perform
35090 65 64 20 61 6e 64 20 74 68 65 72 65 20 69 73 0a  ed and there is.
350a0 2a 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 72 6f  ** nothing to ro
350b0 6c 6c 62 61 63 6b 2c 20 73 6f 20 74 68 69 73 20  llback, so this 
350c0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
350d0 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76  op..*/ .static v
350e0 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49  oid pagerUnlockI
350f0 66 55 6e 75 73 65 64 28 50 61 67 65 72 20 2a 70  fUnused(Pager *p
35100 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 73 71  Pager){.  if( sq
35110 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
35120 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
35130 63 68 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61  che)==0 ){.    a
35140 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
35150 4d 6d 61 70 4f 75 74 3d 3d 30 20 29 3b 20 2f 2a  MmapOut==0 ); /*
35160 20 62 65 63 61 75 73 65 20 70 61 67 65 31 20 69   because page1 i
35170 73 20 6e 65 76 65 72 20 6d 65 6d 6f 72 79 20 6d  s never memory m
35180 61 70 70 65 64 20 2a 2f 0a 20 20 20 20 70 61 67  apped */.    pag
35190 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
351a0 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ack(pPager);.  }
351b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61  .}../*.** The pa
351c0 67 65 20 67 65 74 74 65 72 20 6d 65 74 68 6f 64  ge getter method
351d0 73 20 65 61 63 68 20 74 72 79 20 74 6f 20 61 63  s each try to ac
351e0 71 75 69 72 65 20 61 20 72 65 66 65 72 65 6e 63  quire a referenc
351f0 65 20 74 6f 20 61 0a 2a 2a 20 70 61 67 65 20 77  e to a.** page w
35200 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 20  ith page number 
35210 70 67 6e 6f 2e 20 49 66 20 74 68 65 20 72 65 71  pgno. If the req
35220 75 65 73 74 65 64 20 72 65 66 65 72 65 6e 63 65  uested reference
35230 20 69 73 20 0a 2a 2a 20 73 75 63 63 65 73 73 66   is .** successf
35240 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20 69  ully obtained, i
35250 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20 2a  t is copied to *
35260 70 70 50 61 67 65 20 61 6e 64 20 53 51 4c 49 54  ppPage and SQLIT
35270 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
35280 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 64  *.** There are d
35290 69 66 66 65 72 65 6e 74 20 69 6d 70 6c 65 6d 65  ifferent impleme
352a0 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  ntations of the 
352b0 67 65 74 74 65 72 20 6d 65 74 68 6f 64 20 64 65  getter method de
352c0 70 65 6e 64 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68  pending.** on th
352d0 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20  e current state 
352e0 6f 66 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a  of the pager..**
352f0 0a 2a 2a 20 20 20 20 20 67 65 74 50 61 67 65 4e  .**     getPageN
35300 6f 72 6d 61 6c 28 29 20 20 20 20 20 20 20 20 20  ormal()         
35310 2d 2d 20 20 54 68 65 20 6e 6f 72 6d 61 6c 20 67  --  The normal g
35320 65 74 74 65 72 0a 2a 2a 20 20 20 20 20 67 65 74  etter.**     get
35330 50 61 67 65 45 72 72 6f 72 28 29 20 20 20 20 20  PageError()     
35340 20 20 20 20 20 2d 2d 20 20 55 73 65 64 20 69 66       --  Used if
35350 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
35360 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 0a   an error state.
35370 2a 2a 20 20 20 20 20 67 65 74 50 61 67 65 4d 6d  **     getPageMm
35380 61 70 28 29 20 20 20 20 20 20 20 20 20 20 20 2d  ap()           -
35390 2d 20 20 55 73 65 64 20 69 66 20 6d 65 6d 6f 72  -  Used if memor
353a0 79 2d 6d 61 70 70 65 64 20 49 2f 4f 20 69 73 20  y-mapped I/O is 
353b0 65 6e 61 62 6c 65 64 0a 2a 2a 0a 2a 2a 20 49 66  enabled.**.** If
353c0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
353d0 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  age is already i
353e0 6e 20 74 68 65 20 63 61 63 68 65 2c 20 69 74 20  n the cache, it 
353f0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a  is returned. .**
35400 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 6e 65   Otherwise, a ne
35410 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20 69 73  w page object is
35420 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 70   allocated and p
35430 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 64 61  opulated with da
35440 74 61 0a 2a 2a 20 72 65 61 64 20 66 72 6f 6d 20  ta.** read from 
35450 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
35460 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73  e. In some cases
35470 2c 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64  , the pcache mod
35480 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73  ule may.** choos
35490 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63 61 74  e not to allocat
354a0 65 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a  e a new page obj
354b0 65 63 74 20 61 6e 64 20 6d 61 79 20 72 65 75 73  ect and may reus
354c0 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a  e an existing.**
354d0 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e 6f 20   object with no 
354e0 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
354f0 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  rences..**.** Th
35500 65 20 65 78 74 72 61 20 64 61 74 61 20 61 70 70  e extra data app
35510 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65 20  ended to a page 
35520 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61  is always initia
35530 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20 74  lized to zeros t
35540 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 74 69 6d  he .** first tim
35550 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64  e a page is load
35560 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20  ed into memory. 
35570 49 66 20 74 68 65 20 70 61 67 65 20 72 65 71 75  If the page requ
35580 65 73 74 65 64 20 69 73 20 0a 2a 2a 20 61 6c 72  ested is .** alr
35590 65 61 64 79 20 69 6e 20 74 68 65 20 63 61 63 68  eady in the cach
355a0 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
355b0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
355c0 74 68 65 6e 20 74 68 65 20 65 78 74 72 61 0a 2a  then the extra.*
355d0 2a 20 64 61 74 61 20 69 73 20 6c 65 66 74 20 61  * data is left a
355e0 73 20 69 74 20 77 61 73 20 77 68 65 6e 20 74 68  s it was when th
355f0 65 20 70 61 67 65 20 6f 62 6a 65 63 74 20 77 61  e page object wa
35600 73 20 6c 61 73 74 20 75 73 65 64 2e 0a 2a 2a 0a  s last used..**.
35610 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  ** If the databa
35620 73 65 20 69 6d 61 67 65 20 69 73 20 73 6d 61 6c  se image is smal
35630 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71  ler than the req
35640 75 65 73 74 65 64 20 70 61 67 65 20 6f 72 20 69  uested page or i
35650 66 20 0a 2a 2a 20 74 68 65 20 66 6c 61 67 73 20  f .** the flags 
35660 70 61 72 61 6d 65 74 65 72 20 63 6f 6e 74 61 69  parameter contai
35670 6e 73 20 74 68 65 20 50 41 47 45 52 5f 47 45 54  ns the PAGER_GET
35680 5f 4e 4f 43 4f 4e 54 45 4e 54 20 62 69 74 20 61  _NOCONTENT bit a
35690 6e 64 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65  nd the .** reque
356a0 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74  sted page is not
356b0 20 61 6c 72 65 61 64 79 20 73 74 6f 72 65 64 20   already stored 
356c0 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 74 68  in the cache, th
356d0 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74 75 61 6c  en no .** actual
356e0 20 64 69 73 6b 20 72 65 61 64 20 6f 63 63 75 72   disk read occur
356f0 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  s. In this case 
35700 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65  the memory image
35710 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65   of the .** page
35720 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
35730 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a  to all zeros. .*
35740 2a 0a 2a 2a 20 49 66 20 50 41 47 45 52 5f 47 45  *.** If PAGER_GE
35750 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 69 73 20 74  T_NOCONTENT is t
35760 72 75 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  rue, it means th
35770 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  at we do not car
35780 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63  e about.** the c
35790 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
357a0 61 67 65 2e 20 54 68 69 73 20 6f 63 63 75 72 73  age. This occurs
357b0 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69 6f   in two scenario
357c0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 57 68  s:.**.**   a) Wh
357d0 65 6e 20 72 65 61 64 69 6e 67 20 61 20 66 72 65  en reading a fre
357e0 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
357f0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
35800 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20  se, and.**.**   
35810 62 29 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f  b) When a savepo
35820 69 6e 74 20 69 73 20 62 65 69 6e 67 20 72 6f 6c  int is being rol
35830 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 77 65 20  led back and we 
35840 6e 65 65 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20  need to load.** 
35850 20 20 20 20 20 61 20 6e 65 77 20 70 61 67 65 20       a new page 
35860 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 20 74  into the cache t
35870 6f 20 62 65 20 66 69 6c 6c 65 64 20 77 69 74 68  o be filled with
35880 20 74 68 65 20 64 61 74 61 20 72 65 61 64 0a 2a   the data read.*
35890 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20  *      from the 
358a0 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75 72 6e 61  savepoint journa
358b0 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 41 47 45  l..**.** If PAGE
358c0 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20  R_GET_NOCONTENT 
358d0 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
358e0 65 20 64 61 74 61 20 72 65 74 75 72 6e 65 64 20  e data returned 
358f0 69 73 20 7a 65 72 6f 65 64 20 69 6e 73 74 65 61  is zeroed instea
35900 64 0a 2a 2a 20 6f 66 20 62 65 69 6e 67 20 72 65  d.** of being re
35910 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
35920 62 61 73 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c  base. Additional
35930 6c 79 2c 20 74 68 65 20 62 69 74 73 20 63 6f 72  ly, the bits cor
35940 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f  responding.** to
35950 20 70 67 6e 6f 20 69 6e 20 50 61 67 65 72 2e 70   pgno in Pager.p
35960 49 6e 4a 6f 75 72 6e 61 6c 20 28 62 69 74 76 65  InJournal (bitve
35970 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61  c of pages alrea
35980 64 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  dy written to th
35990 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
359a0 65 29 20 61 6e 64 20 74 68 65 20 50 61 67 65 72  e) and the Pager
359b0 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76  Savepoint.pInSav
359c0 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73 20 6f  epoint bitvecs o
359d0 66 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73 61  f any open.** sa
359e0 76 65 70 6f 69 6e 74 73 20 61 72 65 20 73 65 74  vepoints are set
359f0 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20  . This means if 
35a00 74 68 65 20 70 61 67 65 20 69 73 20 6d 61 64 65  the page is made
35a10 20 77 72 69 74 61 62 6c 65 20 61 74 20 61 6e 79   writable at any
35a20 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  .** point in the
35a30 20 66 75 74 75 72 65 2c 20 75 73 69 6e 67 20 61   future, using a
35a40 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
35a50 50 61 67 65 72 57 72 69 74 65 28 29 2c 20 69 74  PagerWrite(), it
35a60 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77 69  s contents.** wi
35a70 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f 75 72 6e 61  ll not be journa
35a80 6c 65 64 2e 20 54 68 69 73 20 73 61 76 65 73 20  led. This saves 
35a90 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63  IO..**.** The ac
35aa0 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20  quisition might 
35ab0 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c  fail for several
35ac0 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c   reasons.  In al
35ad0 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61  l cases,.** an a
35ae0 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
35af0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
35b00 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73  d and *ppPage is
35b10 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a   set to NULL..**
35b20 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  .** See also sql
35b30 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
35b40 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f  ).  Both this ro
35b50 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70  utine and Lookup
35b60 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f  () attempt.** to
35b70 20 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20   find a page in 
35b80 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
35b90 63 68 65 20 66 69 72 73 74 2e 20 20 49 66 20 74  che first.  If t
35ba0 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
35bb0 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d  lready.** in mem
35bc0 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ory, this routin
35bd0 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74  e goes to disk t
35be0 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77 68 65  o read it in whe
35bf0 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a  reas Lookup().**
35c00 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e   just returns 0.
35c10 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61    This routine a
35c20 63 71 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c  cquires a read-l
35c30 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69  ock the first ti
35c40 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20  me it.** has to 
35c50 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20  go to disk, and 
35c60 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62  could also playb
35c70 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e  ack an old journ
35c80 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  al if necessary.
35c90 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70  .** Since Lookup
35ca0 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f  () never goes to
35cb0 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20   disk, it never 
35cc0 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68  has to deal with
35cd0 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75   locks.** or jou
35ce0 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 73  rnal files..*/.s
35cf0 74 61 74 69 63 20 69 6e 74 20 67 65 74 50 61 67  tatic int getPag
35d00 65 4e 6f 72 6d 61 6c 28 0a 20 20 50 61 67 65 72  eNormal(.  Pager
35d10 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f   *pPager,      /
35d20 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e  * The pager open
35d30 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
35d40 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
35d50 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f  pgno,          /
35d60 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  * Page number to
35d70 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61   fetch */.  DbPa
35d80 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
35d90 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74  /* Write a point
35da0 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  er to the page h
35db0 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ere */.  int fla
35dc0 67 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  gs           /* 
35dd0 50 41 47 45 52 5f 47 45 54 5f 58 58 58 20 66 6c  PAGER_GET_XXX fl
35de0 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ags */.){.  int 
35df0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
35e00 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
35e10 75 38 20 6e 6f 43 6f 6e 74 65 6e 74 3b 20 20 20  u8 noContent;   
35e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35e30 2f 2a 20 54 72 75 65 20 69 66 20 50 41 47 45 52  /* True if PAGER
35e40 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 69  _GET_NOCONTENT i
35e50 73 20 73 65 74 20 2a 2f 0a 20 20 73 71 6c 69 74  s set */.  sqlit
35e60 65 33 5f 70 63 61 63 68 65 5f 70 61 67 65 20 2a  e3_pcache_page *
35e70 70 42 61 73 65 3b 0a 0a 20 20 61 73 73 65 72 74  pBase;..  assert
35e80 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
35e90 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
35ea0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
35eb0 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
35ec0 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65  READER );.  asse
35ed0 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
35ee0 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
35ef0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
35f00 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65  er->hasHeldShare
35f10 64 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 0a 20 20 69  dLock==1 );..  i
35f20 66 28 20 70 67 6e 6f 3d 3d 30 20 29 20 72 65 74  f( pgno==0 ) ret
35f30 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
35f40 50 54 5f 42 4b 50 54 3b 0a 20 20 70 42 61 73 65  PT_BKPT;.  pBase
35f50 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
35f60 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50  Fetch(pPager->pP
35f70 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 33 29 3b  Cache, pgno, 3);
35f80 0a 20 20 69 66 28 20 70 42 61 73 65 3d 3d 30 20  .  if( pBase==0 
35f90 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a  ){.    pPg = 0;.
35fa0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
35fb0 50 63 61 63 68 65 46 65 74 63 68 53 74 72 65 73  PcacheFetchStres
35fc0 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  s(pPager->pPCach
35fd0 65 2c 20 70 67 6e 6f 2c 20 26 70 42 61 73 65 29  e, pgno, &pBase)
35fe0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
35ff0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70  LITE_OK ) goto p
36000 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
36010 3b 0a 20 20 20 20 69 66 28 20 70 42 61 73 65 3d  ;.    if( pBase=
36020 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
36030 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
36040 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70  PT;.      goto p
36050 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
36060 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50  ;.    }.  }.  pP
36070 67 20 3d 20 2a 70 70 50 61 67 65 20 3d 20 73 71  g = *ppPage = sq
36080 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
36090 46 69 6e 69 73 68 28 70 50 61 67 65 72 2d 3e 70  Finish(pPager->p
360a0 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 70 42  PCache, pgno, pB
360b0 61 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ase);.  assert( 
360c0 70 50 67 3d 3d 28 2a 70 70 50 61 67 65 29 20 29  pPg==(*ppPage) )
360d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
360e0 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20  >pgno==pgno );. 
360f0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
36100 61 67 65 72 3d 3d 70 50 61 67 65 72 20 7c 7c 20  ager==pPager || 
36110 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29  pPg->pPager==0 )
36120 3b 0a 0a 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d  ;..  noContent =
36130 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f   (flags & PAGER_
36140 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 29 21 3d  GET_NOCONTENT)!=
36150 30 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50  0;.  if( pPg->pP
36160 61 67 65 72 20 26 26 20 21 6e 6f 43 6f 6e 74 65  ager && !noConte
36170 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20  nt ){.    /* In 
36180 74 68 69 73 20 63 61 73 65 20 74 68 65 20 70 63  this case the pc
36190 61 63 68 65 20 61 6c 72 65 61 64 79 20 63 6f 6e  ache already con
361a0 74 61 69 6e 73 20 61 6e 20 69 6e 69 74 69 61 6c  tains an initial
361b0 69 7a 65 64 20 63 6f 70 79 20 6f 66 0a 20 20 20  ized copy of.   
361c0 20 2a 2a 20 74 68 65 20 70 61 67 65 2e 20 52 65   ** the page. Re
361d0 74 75 72 6e 20 77 69 74 68 6f 75 74 20 66 75 72  turn without fur
361e0 74 68 65 72 20 61 64 6f 2e 20 20 2a 2f 0a 20 20  ther ado.  */.  
361f0 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d    assert( pgno<=
36200 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 26  PAGER_MAX_PGNO &
36210 26 20 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a  & pgno!=PAGER_MJ
36220 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b  _PGNO(pPager) );
36230 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74  .    pPager->aSt
36240 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 48 49  at[PAGER_STAT_HI
36250 54 5d 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e  T]++;.    return
36260 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d   SQLITE_OK;..  }
36270 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
36280 20 70 61 67 65 72 20 63 61 63 68 65 20 68 61 73   pager cache has
36290 20 63 72 65 61 74 65 64 20 61 20 6e 65 77 20 70   created a new p
362a0 61 67 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74  age. Its content
362b0 20 6e 65 65 64 73 20 74 6f 20 0a 20 20 20 20 2a   needs to .    *
362c0 2a 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  * be initialized
362d0 2e 20 42 75 74 20 66 69 72 73 74 20 73 6f 6d 65  . But first some
362e0 20 65 72 72 6f 72 20 63 68 65 63 6b 73 3a 0a 20   error checks:. 
362f0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 28 31 29     **.    ** (1)
36300 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67   The maximum pag
36310 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31  e number is 2^31
36320 0a 20 20 20 20 2a 2a 20 28 32 29 20 4e 65 76 65  .    ** (2) Neve
36330 72 20 74 72 79 20 74 6f 20 66 65 74 63 68 20 74  r try to fetch t
36340 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 67 65 0a  he locking page.
36350 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
36360 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47  gno>PAGER_MAX_PG
36370 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45  NO || pgno==PAGE
36380 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
36390 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
363a0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
363b0 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
363c0 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
363d0 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50  r;.    }..    pP
363e0 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67  g->pPager = pPag
363f0 65 72 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  er;..    assert(
36400 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
36410 3e 66 64 29 20 7c 7c 20 21 4d 45 4d 44 42 20 29  >fd) || !MEMDB )
36420 3b 0a 20 20 20 20 69 66 28 20 21 69 73 4f 70 65  ;.    if( !isOpe
36430 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
36440 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c   pPager->dbSize<
36450 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e  pgno || noConten
36460 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  t ){.      if( p
36470 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67  gno>pPager->mxPg
36480 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  no ){.        rc
36490 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a   = SQLITE_FULL;.
364a0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67          goto pag
364b0 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
364c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
364d0 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20  ( noContent ){. 
364e0 20 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 75 72         /* Failur
364f0 65 20 74 6f 20 73 65 74 20 74 68 65 20 62 69 74  e to set the bit
36500 73 20 69 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e  s in the InJourn
36510 61 6c 20 62 69 74 2d 76 65 63 74 6f 72 73 20 69  al bit-vectors i
36520 73 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 20 20  s benign..      
36530 20 20 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 6d    ** It merely m
36540 65 61 6e 73 20 74 68 61 74 20 77 65 20 6d 69 67  eans that we mig
36550 68 74 20 64 6f 20 73 6f 6d 65 20 65 78 74 72 61  ht do some extra
36560 20 77 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c   work to journal
36570 20 61 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70   a .        ** p
36580 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  age that does no
36590 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75  t need to be jou
365a0 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65 72 74 68  rnaled.  Neverth
365b0 65 6c 65 73 73 2c 20 62 65 20 73 75 72 65 20 0a  eless, be sure .
365c0 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 65          ** to te
365d0 73 74 20 74 68 65 20 63 61 73 65 20 77 68 65 72  st the case wher
365e0 65 20 61 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  e a malloc error
365f0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
36600 79 69 6e 67 20 74 6f 20 73 65 74 20 0a 20 20 20  ying to set .   
36610 20 20 20 20 20 2a 2a 20 61 20 62 69 74 20 69 6e       ** a bit in
36620 20 61 20 62 69 74 20 76 65 63 74 6f 72 2e 0a 20   a bit vector.. 
36630 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
36640 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
36650 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
36660 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d        if( pgno<=
36670 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
36680 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
36690 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29  TESTONLY( rc = )
366a0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
366b0 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  t(pPager->pInJou
366c0 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  rnal, pgno);.   
366d0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
366e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
366f0 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  M );.        }. 
36700 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28         TESTONLY(
36710 20 72 63 20 3d 20 29 20 61 64 64 54 6f 53 61 76   rc = ) addToSav
36720 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50  epointBitvecs(pP
36730 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  ager, pgno);.   
36740 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
36750 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
36760 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
36770 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
36780 63 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  c();.      }.   
36790 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70     memset(pPg->p
367a0 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d  Data, 0, pPager-
367b0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
367c0 20 20 49 4f 54 52 41 43 45 28 28 22 5a 45 52 4f    IOTRACE(("ZERO
367d0 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
367e0 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d  r, pgno));.    }
367f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
36800 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d  rt( pPg->pPager=
36810 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 20 20 20  =pPager );.     
36820 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50   pPager->aStat[P
36830 41 47 45 52 5f 53 54 41 54 5f 4d 49 53 53 5d 2b  AGER_STAT_MISS]+
36840 2b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65  +;.      rc = re
36850 61 64 44 62 50 61 67 65 28 70 50 67 29 3b 0a 20  adDbPage(pPg);. 
36860 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
36870 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
36880 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71    goto pager_acq
36890 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20  uire_err;.      
368a0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65  }.    }.    page
368b0 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 70  r_set_pagehash(p
368c0 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Pg);.  }.  retur
368d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61  n SQLITE_OK;..pa
368e0 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3a  ger_acquire_err:
368f0 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
36900 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66  QLITE_OK );.  if
36910 28 20 70 50 67 20 29 7b 0a 20 20 20 20 73 71 6c  ( pPg ){.    sql
36920 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 70  ite3PcacheDrop(p
36930 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72  Pg);.  }.  pager
36940 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70  UnlockIfUnused(p
36950 50 61 67 65 72 29 3b 0a 20 20 2a 70 70 50 61 67  Pager);.  *ppPag
36960 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  e = 0;.  return 
36970 72 63 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  rc;.}..#if SQLIT
36980 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
36990 30 0a 2f 2a 20 54 68 65 20 70 61 67 65 20 67 65  0./* The page ge
369a0 74 74 65 72 20 66 6f 72 20 77 68 65 6e 20 6d 65  tter for when me
369b0 6d 6f 72 79 2d 6d 61 70 70 65 64 20 49 2f 4f 20  mory-mapped I/O 
369c0 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 73 74  is enabled */.st
369d0 61 74 69 63 20 69 6e 74 20 67 65 74 50 61 67 65  atic int getPage
369e0 4d 4d 61 70 28 0a 20 20 50 61 67 65 72 20 2a 70  MMap(.  Pager *p
369f0 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54  Pager,      /* T
36a00 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e  he pager open on
36a10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
36a20 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  le */.  Pgno pgn
36a30 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  o,          /* P
36a40 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65  age number to fe
36a50 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20  tch */.  DbPage 
36a60 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20  **ppPage,    /* 
36a70 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20  Write a pointer 
36a80 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65  to the page here
36a90 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
36aa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47            /* PAG
36ab0 45 52 5f 47 45 54 5f 58 58 58 20 66 6c 61 67 73  ER_GET_XXX flags
36ac0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
36ad0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
36ae0 67 48 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20  gHdr *pPg = 0;. 
36af0 20 75 33 32 20 69 46 72 61 6d 65 20 3d 20 30 3b   u32 iFrame = 0;
36b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36b10 20 2f 2a 20 46 72 61 6d 65 20 74 6f 20 72 65 61   /* Frame to rea
36b20 64 20 66 72 6f 6d 20 57 41 4c 20 66 69 6c 65 20  d from WAL file 
36b30 2a 2f 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 61  */..  /* It is a
36b40 63 63 65 70 74 61 62 6c 65 20 74 6f 20 75 73 65  cceptable to use
36b50 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 28 6d 6d   a read-only (mm
36b60 61 70 29 20 70 61 67 65 20 66 6f 72 20 61 6e 79  ap) page for any
36b70 20 70 61 67 65 20 65 78 63 65 70 74 0a 20 20 2a   page except.  *
36b80 2a 20 70 61 67 65 20 31 20 69 66 20 74 68 65 72  * page 1 if ther
36b90 65 20 69 73 20 6e 6f 20 77 72 69 74 65 2d 74 72  e is no write-tr
36ba0 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 20 6f  ansaction open o
36bb0 72 20 74 68 65 20 41 43 51 55 49 52 45 5f 52 45  r the ACQUIRE_RE
36bc0 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20 66 6c 61 67  ADONLY.  ** flag
36bd0 20 77 61 73 20 73 70 65 63 69 66 69 65 64 20 62   was specified b
36be0 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 41 6e  y the caller. An
36bf0 64 20 73 6f 20 6c 6f 6e 67 20 61 73 20 74 68 65  d so long as the
36c00 20 64 62 20 69 73 20 6e 6f 74 20 61 20 0a 20 20   db is not a .  
36c10 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20  ** temporary or 
36c20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
36c30 73 65 2e 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  se.  */.  const 
36c40 69 6e 74 20 62 4d 6d 61 70 4f 6b 20 3d 20 28 70  int bMmapOk = (p
36c50 67 6e 6f 3e 31 0a 20 20 20 26 26 20 28 70 50 61  gno>1.   && (pPa
36c60 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
36c70 45 52 5f 52 45 41 44 45 52 20 7c 7c 20 28 66 6c  ER_READER || (fl
36c80 61 67 73 20 26 20 50 41 47 45 52 5f 47 45 54 5f  ags & PAGER_GET_
36c90 52 45 41 44 4f 4e 4c 59 29 29 0a 20 20 29 3b 0a  READONLY)).  );.
36ca0 0a 20 20 61 73 73 65 72 74 28 20 55 53 45 46 45  .  assert( USEFE
36cb0 54 43 48 28 70 50 61 67 65 72 29 20 29 3b 0a 23  TCH(pPager) );.#
36cc0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
36cd0 5f 43 4f 44 45 43 0a 20 20 61 73 73 65 72 74 28  _CODEC.  assert(
36ce0 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 3d   pPager->xCodec=
36cf0 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  =0 );.#endif..  
36d00 2f 2a 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  /* Optimization 
36d10 6e 6f 74 65 3a 20 20 41 64 64 69 6e 67 20 74 68  note:  Adding th
36d20 65 20 22 70 67 6e 6f 3c 3d 31 22 20 74 65 72 6d  e "pgno<=1" term
36d30 20 62 65 66 6f 72 65 20 22 70 67 6e 6f 3d 3d 30   before "pgno==0
36d40 22 20 68 65 72 65 0a 20 20 2a 2a 20 61 6c 6c 6f  " here.  ** allo
36d50 77 73 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20  ws the compiler 
36d60 6f 70 74 69 6d 69 7a 65 72 20 74 6f 20 72 65 75  optimizer to reu
36d70 73 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  se the results o
36d80 66 20 74 68 65 20 22 70 67 6e 6f 3e 31 22 0a 20  f the "pgno>1". 
36d90 20 2a 2a 20 74 65 73 74 20 69 6e 20 74 68 65 20   ** test in the 
36da0 70 72 65 76 69 6f 75 73 20 73 74 61 74 65 6d 65  previous stateme
36db0 6e 74 2c 20 61 6e 64 20 61 76 6f 69 64 20 74 65  nt, and avoid te
36dc0 73 74 69 6e 67 20 70 67 6e 6f 3d 3d 30 20 69 6e  sting pgno==0 in
36dd0 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6d 6d 6f 6e   the.  ** common
36de0 20 63 61 73 65 20 77 68 65 72 65 20 70 67 6e 6f   case where pgno
36df0 20 69 73 20 6c 61 72 67 65 2e 20 2a 2f 0a 20 20   is large. */.  
36e00 69 66 28 20 70 67 6e 6f 3c 3d 31 20 26 26 20 70  if( pgno<=1 && p
36e10 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  gno==0 ){.    re
36e20 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
36e30 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
36e40 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
36e50 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  eState>=PAGER_RE
36e60 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74  ADER );.  assert
36e70 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
36e80 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
36e90 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
36ea0 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c  ->hasHeldSharedL
36eb0 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  ock==1 );.  asse
36ec0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
36ed0 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
36ee0 3b 0a 0a 20 20 69 66 28 20 62 4d 6d 61 70 4f 6b  ;..  if( bMmapOk
36ef0 20 26 26 20 70 61 67 65 72 55 73 65 57 61 6c 28   && pagerUseWal(
36f00 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72  pPager) ){.    r
36f10 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 69  c = sqlite3WalFi
36f20 6e 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e  ndFrame(pPager->
36f30 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 46 72  pWal, pgno, &iFr
36f40 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ame);.    if( rc
36f50 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
36f60 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30       *ppPage = 0
36f70 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
36f80 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  c;.    }.  }.  i
36f90 66 28 20 62 4d 6d 61 70 4f 6b 20 26 26 20 69 46  f( bMmapOk && iF
36fa0 72 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 76  rame==0 ){.    v
36fb0 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 30 3b 0a  oid *pData = 0;.
36fc0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
36fd0 4f 73 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e  OsFetch(pPager->
36fe0 66 64 2c 20 0a 20 20 20 20 20 20 20 20 28 69 36  fd, .        (i6
36ff0 34 29 28 70 67 6e 6f 2d 31 29 20 2a 20 70 50 61  4)(pgno-1) * pPa
37000 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70  ger->pageSize, p
37010 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
37020 20 26 70 44 61 74 61 0a 20 20 20 20 29 3b 0a 20   &pData.    );. 
37030 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
37040 45 5f 4f 4b 20 26 26 20 70 44 61 74 61 20 29 7b  E_OK && pData ){
37050 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
37060 72 2d 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f  r->eState>PAGER_
37070 52 45 41 44 45 52 20 7c 7c 20 70 50 61 67 65 72  READER || pPager
37080 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
37090 20 20 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69        pPg = sqli
370a0 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70  te3PagerLookup(p
370b0 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
370c0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
370d0 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pPg==0 ){.      
370e0 20 20 72 63 20 3d 20 70 61 67 65 72 41 63 71 75    rc = pagerAcqu
370f0 69 72 65 4d 61 70 50 61 67 65 28 70 50 61 67 65  ireMapPage(pPage
37100 72 2c 20 70 67 6e 6f 2c 20 70 44 61 74 61 2c 20  r, pgno, pData, 
37110 26 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c  &pPg);.      }el
37120 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
37130 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61  te3OsUnfetch(pPa
37140 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29 28 70  ger->fd, (i64)(p
37150 67 6e 6f 2d 31 29 2a 70 50 61 67 65 72 2d 3e 70  gno-1)*pPager->p
37160 61 67 65 53 69 7a 65 2c 20 70 44 61 74 61 29 3b  ageSize, pData);
37170 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
37180 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20  f( pPg ){.      
37190 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
371a0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
371b0 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 67     *ppPage = pPg
371c0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
371d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
371e0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
371f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
37200 29 7b 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65  ){.      *ppPage
37210 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
37220 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
37230 0a 20 20 72 65 74 75 72 6e 20 67 65 74 50 61 67  .  return getPag
37240 65 4e 6f 72 6d 61 6c 28 70 50 61 67 65 72 2c 20  eNormal(pPager, 
37250 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 66 6c  pgno, ppPage, fl
37260 61 67 73 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  ags);.}.#endif /
37270 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  * SQLITE_MAX_MMA
37280 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 20  P_SIZE>0 */../* 
37290 54 68 65 20 70 61 67 65 20 67 65 74 74 65 72 20  The page getter 
372a0 6d 65 74 68 6f 64 20 66 6f 72 20 77 68 65 6e 20  method for when 
372b0 74 68 65 20 70 61 67 65 72 20 69 73 20 61 6e 20  the pager is an 
372c0 65 72 72 6f 72 20 73 74 61 74 65 20 2a 2f 0a 73  error state */.s
372d0 74 61 74 69 63 20 69 6e 74 20 67 65 74 50 61 67  tatic int getPag
372e0 65 45 72 72 6f 72 28 0a 20 20 50 61 67 65 72 20  eError(.  Pager 
372f0 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a  *pPager,      /*
37300 20 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20   The pager open 
37310 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
37320 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  file */.  Pgno p
37330 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  gno,          /*
37340 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   Page number to 
37350 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67  fetch */.  DbPag
37360 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
37370 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65  * Write a pointe
37380 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65  r to the page he
37390 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  re */.  int flag
373a0 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  s           /* P
373b0 41 47 45 52 5f 47 45 54 5f 58 58 58 20 66 6c 61  AGER_GET_XXX fla
373c0 67 73 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45  gs */.){.  UNUSE
373d0 44 5f 50 41 52 41 4d 45 54 45 52 28 70 67 6e 6f  D_PARAMETER(pgno
373e0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
373f0 4d 45 54 45 52 28 66 6c 61 67 73 29 3b 0a 20 20  METER(flags);.  
37400 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
37410 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
37420 4f 4b 20 29 3b 0a 20 20 2a 70 70 50 61 67 65 20  OK );.  *ppPage 
37430 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  = 0;.  return pP
37440 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 7d  ager->errCode;.}
37450 0a 0a 0a 2f 2a 20 44 69 73 70 61 74 63 68 20 61  .../* Dispatch a
37460 6c 6c 20 70 61 67 65 20 66 65 74 63 68 20 72 65  ll page fetch re
37470 71 75 65 73 74 73 20 74 6f 20 74 68 65 20 61 70  quests to the ap
37480 70 72 6f 70 72 69 61 74 65 20 67 65 74 74 65 72  propriate getter
37490 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 69 6e 74 20   method..*/.int 
374a0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
374b0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
374c0 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ,      /* The pa
374d0 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ger open on the 
374e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
374f0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
37500 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
37510 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a  umber to fetch *
37520 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50  /.  DbPage **ppP
37530 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65  age,    /* Write
37540 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
37550 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20  e page here */. 
37560 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
37570 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45       /* PAGER_GE
37580 54 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 29  T_XXX flags */.)
37590 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
375a0 53 45 52 56 45 52 5f 45 44 49 54 49 4f 4e 0a 20  SERVER_EDITION. 
375b0 20 69 66 28 20 70 61 67 65 72 49 73 53 65 72 76   if( pagerIsServ
375c0 65 72 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  er(pPager) ){.  
375d0 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
375e0 65 33 53 65 72 76 65 72 4c 6f 63 6b 28 70 50 61  e3ServerLock(pPa
375f0 67 65 72 2d 3e 70 53 65 72 76 65 72 2c 20 70 67  ger->pServer, pg
37600 6e 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69  no, 0, 0);.    i
37610 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
37620 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
37630 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
37640 6e 20 70 50 61 67 65 72 2d 3e 78 47 65 74 28 70  n pPager->xGet(p
37650 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 70 70 50  Pager, pgno, ppP
37660 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 7d 0a 0a  age, flags);.}..
37670 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
37680 70 61 67 65 20 69 66 20 69 74 20 69 73 20 61 6c  page if it is al
37690 72 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d  ready in the in-
376a0 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44  memory cache.  D
376b0 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68  o.** not read th
376c0 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b  e page from disk
376d0 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
376e0 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c  ter to the page,
376f0 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20  .** or 0 if the 
37700 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
37710 61 63 68 65 2e 20 0a 2a 2a 0a 2a 2a 20 53 65 65  ache. .**.** See
37720 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67   also sqlite3Pag
37730 65 72 47 65 74 28 29 2e 20 20 54 68 65 20 64 69  erGet().  The di
37740 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
37750 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
37760 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65   and sqlite3Page
37770 72 47 65 74 28 29 20 69 73 20 74 68 61 74 20 5f  rGet() is that _
37780 67 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f  get() will go to
37790 20 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65   the disk and re
377a0 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67  ad.** in the pag
377b0 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  e if the page is
377c0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20   not already in 
377d0 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75  cache.  This rou
377e0 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tine.** returns 
377f0 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65  NULL if the page
37800 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
37810 20 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f   or if a disk I/
37820 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20  O error .** has 
37830 65 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a  ever happened..*
37840 2f 0a 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65  /.DbPage *sqlite
37850 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67  3PagerLookup(Pag
37860 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
37870 20 70 67 6e 6f 29 7b 0a 20 20 73 71 6c 69 74 65   pgno){.  sqlite
37880 33 5f 70 63 61 63 68 65 5f 70 61 67 65 20 2a 70  3_pcache_page *p
37890 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
378a0 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61  pPager!=0 );.  a
378b0 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29  ssert( pgno!=0 )
378c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
378d0 65 72 2d 3e 70 50 43 61 63 68 65 21 3d 30 20 29  er->pPCache!=0 )
378e0 3b 0a 20 20 70 50 61 67 65 20 3d 20 73 71 6c 69  ;.  pPage = sqli
378f0 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70  te3PcacheFetch(p
37900 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
37910 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 61 73 73 65  pgno, 0);.  asse
37920 72 74 28 20 70 50 61 67 65 3d 3d 30 20 7c 7c 20  rt( pPage==0 || 
37930 70 50 61 67 65 72 2d 3e 68 61 73 48 65 6c 64 53  pPager->hasHeldS
37940 68 61 72 65 64 4c 6f 63 6b 20 29 3b 0a 20 20 69  haredLock );.  i
37950 66 28 20 70 50 61 67 65 3d 3d 30 20 29 20 72 65  f( pPage==0 ) re
37960 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e  turn 0;.  return
37970 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
37980 74 63 68 46 69 6e 69 73 68 28 70 50 61 67 65 72  tchFinish(pPager
37990 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c  ->pPCache, pgno,
379a0 20 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pPage);.}../*.*
379b0 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61 67 65  * Release a page
379c0 20 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 0a 2a   reference..**.*
379d0 2a 20 54 68 65 20 73 71 6c 69 74 65 33 50 61 67  * The sqlite3Pag
379e0 65 72 55 6e 72 65 66 28 29 20 61 6e 64 20 73 71  erUnref() and sq
379f0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e  lite3PagerUnrefN
37a00 6f 74 4e 75 6c 6c 28 29 20 6d 61 79 20 6f 6e 6c  otNull() may onl
37a10 79 20 62 65 0a 2a 2a 20 75 73 65 64 20 69 66 20  y be.** used if 
37a20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
37a30 20 70 61 67 65 20 62 65 69 6e 67 20 72 65 6c 65   page being rele
37a40 61 73 65 64 20 69 73 20 6e 6f 74 20 74 68 65 20  ased is not the 
37a50 6c 61 73 74 20 70 61 67 65 2e 0a 2a 2a 20 54 68  last page..** Th
37a60 65 20 62 74 72 65 65 20 6c 61 79 65 72 20 61 6c  e btree layer al
37a70 77 61 79 73 20 68 6f 6c 64 73 20 70 61 67 65 31  ways holds page1
37a80 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74 68 65 20   open until the 
37a90 65 6e 64 2c 20 73 6f 20 74 68 65 73 65 20 66 69  end, so these fi
37aa0 72 73 74 0a 2a 2a 20 74 6f 20 72 6f 75 74 69 6e  rst.** to routin
37ab0 65 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  es can be used t
37ac0 6f 20 72 65 6c 65 61 73 65 20 61 6e 79 20 70 61  o release any pa
37ad0 67 65 20 6f 74 68 65 72 20 74 68 61 6e 20 42 74  ge other than Bt
37ae0 53 68 61 72 65 64 2e 70 50 61 67 65 31 2e 0a 2a  Shared.pPage1..*
37af0 2a 0a 2a 2a 20 55 73 65 20 73 71 6c 69 74 65 33  *.** Use sqlite3
37b00 50 61 67 65 72 55 6e 72 65 66 50 61 67 65 4f 6e  PagerUnrefPageOn
37b10 65 28 29 20 74 6f 20 72 65 6c 65 61 73 65 20 70  e() to release p
37b20 61 67 65 31 2e 20 20 54 68 69 73 20 6c 61 74 74  age1.  This latt
37b30 65 72 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 68  er routine.** ch
37b40 65 63 6b 73 20 74 68 65 20 74 6f 74 61 6c 20 6e  ecks the total n
37b50 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61 6e  umber of outstan
37b60 64 69 6e 67 20 70 61 67 65 73 20 61 6e 64 20 69  ding pages and i
37b70 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  f the number of.
37b80 2a 2a 20 70 61 67 65 73 20 72 65 61 63 68 65 73  ** pages reaches
37b90 20 7a 65 72 6f 20 69 74 20 64 72 6f 70 73 20 74   zero it drops t
37ba0 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b  he database lock
37bb0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
37bc0 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75  3PagerUnrefNotNu
37bd0 6c 6c 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ll(DbPage *pPg){
37be0 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 50 61 67  .  TESTONLY( Pag
37bf0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
37c00 2d 3e 70 50 61 67 65 72 3b 20 29 0a 20 20 61 73  ->pPager; ).  as
37c10 73 65 72 74 28 20 70 50 67 21 3d 30 20 29 3b 0a  sert( pPg!=0 );.
37c20 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73    if( pPg->flags
37c30 20 26 20 50 47 48 44 52 5f 4d 4d 41 50 20 29 7b   & PGHDR_MMAP ){
37c40 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
37c50 2d 3e 70 67 6e 6f 21 3d 31 20 29 3b 20 20 2f 2a  ->pgno!=1 );  /*
37c60 20 50 61 67 65 31 20 69 73 20 6e 65 76 65 72 20   Page1 is never 
37c70 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 2a 2f  memory mapped */
37c80 0a 20 20 20 20 70 61 67 65 72 52 65 6c 65 61 73  .    pagerReleas
37c90 65 4d 61 70 50 61 67 65 28 70 50 67 29 3b 0a 20  eMapPage(pPg);. 
37ca0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
37cb0 74 65 33 50 63 61 63 68 65 52 65 6c 65 61 73 65  te3PcacheRelease
37cc0 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20  (pPg);.  }.  /* 
37cd0 44 6f 20 6e 6f 74 20 75 73 65 20 74 68 69 73 20  Do not use this 
37ce0 72 6f 75 74 69 6e 65 20 74 6f 20 72 65 6c 65 61  routine to relea
37cf0 73 65 20 74 68 65 20 6c 61 73 74 20 72 65 66 65  se the last refe
37d00 72 65 6e 63 65 20 74 6f 20 70 61 67 65 31 20 2a  rence to page1 *
37d10 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  /.  assert( sqli
37d20 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
37d30 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
37d40 65 29 3e 30 20 29 3b 0a 7d 0a 76 6f 69 64 20 73  e)>0 );.}.void s
37d50 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
37d60 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
37d70 20 69 66 28 20 70 50 67 20 29 20 73 71 6c 69 74   if( pPg ) sqlit
37d80 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e  e3PagerUnrefNotN
37d90 75 6c 6c 28 70 50 67 29 3b 0a 7d 0a 76 6f 69 64  ull(pPg);.}.void
37da0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
37db0 65 66 50 61 67 65 4f 6e 65 28 44 62 50 61 67 65  efPageOne(DbPage
37dc0 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
37dd0 2a 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72  *pPager;.  asser
37de0 74 28 20 70 50 67 21 3d 30 20 29 3b 0a 20 20 61  t( pPg!=0 );.  a
37df0 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f  ssert( pPg->pgno
37e00 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
37e10 20 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50   (pPg->flags & P
37e20 47 48 44 52 5f 4d 4d 41 50 29 3d 3d 30 20 29 3b  GHDR_MMAP)==0 );
37e30 20 2f 2a 20 50 61 67 65 31 20 69 73 20 6e 65 76   /* Page1 is nev
37e40 65 72 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64  er memory mapped
37e50 20 2a 2f 0a 20 20 70 50 61 67 65 72 20 3d 20 70   */.  pPager = p
37e60 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 73 71  Pg->pPager;.  sq
37e70 6c 69 74 65 33 50 61 67 65 72 52 65 73 65 74 4c  lite3PagerResetL
37e80 6f 63 6b 54 69 6d 65 6f 75 74 28 70 50 61 67 65  ockTimeout(pPage
37e90 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  r);.  sqlite3Pca
37ea0 63 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b  cheRelease(pPg);
37eb0 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66  .  pagerUnlockIf
37ec0 55 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a  Unused(pPager);.
37ed0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
37ee0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
37ef0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
37f00 20 65 76 65 72 79 20 77 72 69 74 65 20 74 72 61   every write tra
37f10 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65  nsaction..** The
37f20 72 65 20 6d 75 73 74 20 61 6c 72 65 61 64 79 20  re must already 
37f30 62 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  be a RESERVED or
37f40 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
37f50 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
37f60 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20 74 68  .** file when th
37f70 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
37f80 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e  lled..**.** Open
37f90 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
37fa0 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67  e for pager pPag
37fb0 65 72 20 61 6e 64 20 77 72 69 74 65 20 61 20 6a  er and write a j
37fc0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a  ournal header.**
37fd0 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
37fe0 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 61 72   it. If there ar
37ff0 65 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  e active savepoi
38000 6e 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 73 75  nts, open the su
38010 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73 20  b-journal.** as 
38020 77 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74  well. This funct
38030 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ion is only used
38040 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   when the journa
38050 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20  l file is being 
38060 0a 2a 2a 20 6f 70 65 6e 65 64 20 74 6f 20 77 72  .** opened to wr
38070 69 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6c  ite a rollback l
38080 6f 67 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63  og for a transac
38090 74 69 6f 6e 2e 20 49 74 20 69 73 20 6e 6f 74 20  tion. It is not 
380a0 75 73 65 64 20 0a 2a 2a 20 77 68 65 6e 20 6f 70  used .** when op
380b0 65 6e 69 6e 67 20 61 20 68 6f 74 20 6a 6f 75 72  ening a hot jour
380c0 6e 61 6c 20 66 69 6c 65 20 74 6f 20 72 6f 6c 6c  nal file to roll
380d0 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20   it back..**.** 
380e0 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
380f0 69 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f  ile is already o
38100 70 65 6e 20 28 61 73 20 69 74 20 6d 61 79 20 62  pen (as it may b
38110 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  e in exclusive m
38120 6f 64 65 29 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  ode),.** then th
38130 69 73 20 66 75 6e 63 74 69 6f 6e 20 6a 75 73 74  is function just
38140 20 77 72 69 74 65 73 20 61 20 6a 6f 75 72 6e 61   writes a journa
38150 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68 65 20  l header to the 
38160 73 74 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20  start of the.** 
38170 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 66 69 6c  already open fil
38180 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65  e. .**.** Whethe
38190 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75  r or not the jou
381a0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
381b0 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ned by this func
381c0 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50 61 67  tion, the.** Pag
381d0 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69  er.pInJournal bi
381e0 74 76 65 63 20 73 74 72 75 63 74 75 72 65 20 69  tvec structure i
381f0 73 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a  s allocated..**.
38200 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
38210 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
38220 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2e  g is successful.
38230 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
38240 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f  rn .** SQLITE_NO
38250 4d 45 4d 20 69 66 20 74 68 65 20 61 74 74 65 6d  MEM if the attem
38260 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 50  pt to allocate P
38270 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ager.pInJournal 
38280 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e  fails, or .** an
38290 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
382a0 66 20 6f 70 65 6e 69 6e 67 20 6f 72 20 77 72 69  f opening or wri
382b0 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ting the journal
382c0 20 66 69 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a   file fails..*/.
382d0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
382e0 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61  _open_journal(Pa
382f0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
38300 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
38310 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
38320 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
38330 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73  turn code */.  s
38340 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e  qlite3_vfs * con
38350 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72  st pVfs = pPager
38360 2d 3e 70 56 66 73 3b 20 20 20 2f 2a 20 4c 6f 63  ->pVfs;   /* Loc
38370 61 6c 20 63 61 63 68 65 20 6f 66 20 76 66 73 20  al cache of vfs 
38380 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73  pointer */..  as
38390 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
383a0 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
383b0 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 61  ER_LOCKED );.  a
383c0 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
383d0 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
383e0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
383f0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
38400 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  l==0 );.  .  /* 
38410 49 66 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  If already in th
38420 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 74  e error state, t
38430 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
38440 61 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 6f 6e  a no-op.  But on
38450 0a 20 20 2a 2a 20 74 68 65 20 6f 74 68 65 72 20  .  ** the other 
38460 68 61 6e 64 2c 20 74 68 69 73 20 72 6f 75 74 69  hand, this routi
38470 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  ne is never call
38480 65 64 20 69 66 20 77 65 20 61 72 65 20 61 6c 72  ed if we are alr
38490 65 61 64 79 20 69 6e 0a 20 20 2a 2a 20 61 6e 20  eady in.  ** an 
384a0 65 72 72 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a  error state. */.
384b0 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67    if( NEVER(pPag
384c0 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72  er->errCode) ) r
384d0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
384e0 72 43 6f 64 65 3b 0a 0a 20 20 69 66 28 20 21 70  rCode;..  if( !p
384f0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
38500 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  r) && pPager->jo
38510 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
38520 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
38530 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
38540 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c  pInJournal = sql
38550 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65  ite3BitvecCreate
38560 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29  (pPager->dbSize)
38570 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
38580 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->pInJournal==0 
38590 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
385a0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
385b0 54 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  T;.    }.  .    
385c0 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72  /* Open the jour
385d0 6e 61 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69  nal file if it i
385e0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
385f0 65 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21  en. */.    if( !
38600 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
38610 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  fd) ){.      if(
38620 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
38630 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
38640 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
38650 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
38660 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28  3MemJournalOpen(
38670 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
38680 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
38690 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 53     int flags = S
386a0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
386b0 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
386c0 5f 43 52 45 41 54 45 3b 0